2 tmp फ़ाइलों के साथ एक-पंक्ति (जो आप चाहते हैं) वह होगी:
foo | bar > file1.txt && baz | quux > file2.txt && diff file1.txt file2.txt
बैश के साथ , आप हालांकि कोशिश कर सकते हैं:
diff <(foo | bar) <(baz | quux)
foo | bar | diff - <(baz | quux) # or only use process substitution once
2 संस्करण अधिक स्पष्ट रूप से आपको याद दिलाएगा कि कौन सा इनपुट था, जो दो गिने हुए fds के बजाय
-- /dev/stdinबनाम ++ /dev/fd/63या कुछ और दिखा रहा था ।
फाइलसिस्टम में एक नामांकित पाइप भी नहीं दिखाई देगा, कम से कम OSes पर जहां बैश फाइलनाम का उपयोग करके प्रक्रिया प्रतिस्थापन को लागू कर सकता है जैसे फ़ाइल नाम /dev/fd/63प्राप्त करने के लिए कमांड को खोल सकते हैं और पढ़ सकते हैं वास्तव में पहले से खुली हुई फ़ाइल विवरण से पढ़ सकते हैं जो bash सेट है कमांड निष्पादित करने से पहले। (यानी pipe(2)कांटे से पहले बैश का उपयोग किया जाता है , और फिर 63 वें पर इनपुट फ़ाइल डिस्क्रिप्टर dup2के आउटपुट से रीडायरेक्ट quuxकरने के लिए diff।)
सिस्टम पर कोई "जादुई" नहीं है , /dev/fdया /proc/self/fdbash प्रक्रिया प्रतिस्थापन को लागू करने के लिए नाम पाइप का उपयोग कर सकता है, लेकिन यह अस्थायी फ़ाइलों के विपरीत, कम से कम उन्हें स्वयं प्रबंधित करेगा, और आपका डेटा फ़ाइल सिस्टम को नहीं लिखा जाएगा।
आप यह जांच सकते हैं कि बैश इम्प्लीमेंटेशन कैसे echo <(true)इसे पढ़ने के बजाय फाइलनेम को प्रिंट करने के लिए प्रतिस्थापन की प्रक्रिया करता है। यह /dev/fd/63एक विशिष्ट लिनक्स सिस्टम पर प्रिंट करता है। या वास्तव में क्या सिस्टम कॉल बैश उपयोग करता है, इस बारे में अधिक जानकारी के लिए, लिनक्स सिस्टम पर यह कमांड फाइल और फाइल-डिस्क्रिप्टर सिस्टम कॉल का पता लगाएगा
strace -f -efile,desc,clone,execve bash -c '/bin/true | diff -u - <(/bin/true)'
बैश के बिना, आप एक नामित पाइप बना सकते हैं । STDIN से एक इनपुट पढ़ने के -लिए बताने के diffलिए उपयोग करें , और दूसरे के रूप में नामित पाइप का उपयोग करें:
mkfifo file1_pipe.txt
foo|bar > file1_pipe.txt && baz | quux | diff file1_pipe.txt - && rm file1_pipe.txt
ध्यान दें कि आप केवल टी आउटपुट के साथ कई इनपुट के लिए एक आउटपुट को पाइप कर सकते हैं :
ls *.txt | tee /dev/tty txtlist.txt
उपरोक्त कमांड टर्मिनल के लिए ls * .txt का आउटपुट प्रदर्शित करता है और इसे टेक्स्ट फाइल txtlist.txt पर आउटपुट करता है।
लेकिन प्रक्रिया प्रतिस्थापन के साथ, आप teeएक ही डेटा को कई पाइपलाइनों में फीड करने के लिए उपयोग कर सकते हैं :
cat *.txt | tee >(foo | bar > result1.txt) >(baz | quux > result2.txt) | foobar
mkfifo a; cmd >a& cmd2|diff a -; rm a