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/fd
bash प्रक्रिया प्रतिस्थापन को लागू करने के लिए नाम पाइप का उपयोग कर सकता है, लेकिन यह अस्थायी फ़ाइलों के विपरीत, कम से कम उन्हें स्वयं प्रबंधित करेगा, और आपका डेटा फ़ाइल सिस्टम को नहीं लिखा जाएगा।
आप यह जांच सकते हैं कि बैश इम्प्लीमेंटेशन कैसे 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