वर्तमान इनाम नोटिस में सवाल:
सामान्य उदाहरण बहुत जटिल है। क्या कोई कृपया बता सकता है कि निम्नलिखित उदाहरण को कैसे लागू किया जाए?diff <(cat "$2" | xz -d) <(cat "$1" | xz -d)
लगता है कि यहाँ एक उत्तर है ।
जैसा कि गाइल्स के उत्तर में दिखाया गया है , सामान्य विचार यह है कि "निर्माता" कमांड के आउटपुट को नई डिवाइस फाइल्स 1 में एक पाइपलाइन के विभिन्न चरणों में भेजा जाए , जिससे उन्हें "उपभोक्ता" कमांड उपलब्ध हो, जो संभवतः फ़ाइल नाम को तर्क के रूप में ले सकता है ( यह मानते हुए कि आपका सिस्टम आपको फ़ाइल डिस्क्रिप्टर के रूप में एक्सेस देता है /dev/fd/X)।
आप जो खोज रहे हैं उसे प्राप्त करने का सबसे सरल तरीका संभवतः है:
xz -cd file1.xz | { xz -cd file2.xz | diff /dev/fd/3 -; } 3<&0
( पठनीयता के file1.xzस्थान पर उपयोग करना "$1"और xz -cdइसके बजाय cat ... | xz -dक्योंकि एकल आदेश पर्याप्त है)।
पहले "निर्माता" कमांड का आउटपुट, xz -cd file1.xzएक कंपाउंड कमांड ( {...}) में लगाया जाता है ; लेकिन, अगले कमांड के मानक इनपुट के रूप में तुरंत खपत होने के बजाय, इसे डिस्क्रिप्टर फाइल करने के लिए डुप्लिकेट किया जाता है 3और इस तरह से कंपाउंड कमांड के अंदर सब कुछ सुलभ हो जाता है /dev/fd/3। दूसरे "निर्माता" कमांड का आउटपुट xz -cd file2.xz, जो न तो अपने मानक इनपुट और न ही फ़ाइल डिस्क्रिप्टर से कुछ भी उपभोग करता है 3, फिर "उपभोक्ता" कमांड को पाइप किया जाता है diff, जो इसके मानक इनपुट से और से पढ़ता है /dev/fd/3।
पाइपिंग और फाइल डिस्क्रिप्टर डुप्लीकेशन को आवश्यकतानुसार कई "निर्माता" कमांड के लिए डिवाइस फाइल प्रदान करने के लिए जोड़ा जा सकता है, जैसे:
xz -cd file1.xz | { xz -cd file2.xz | { diff /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0
हालांकि यह आपके विशिष्ट प्रश्न के संदर्भ में अप्रासंगिक हो सकता है, यह ध्यान देने योग्य है:
cmd1 <(cmd2) <(cmd3), cmd2 | { cmd3 | { cmd1 /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0और ( cmd2 | ( cmd3 | ( cmd1 /dev/fd/3 /dev/fd/4 ) 4<&0 ) 3<&0 )प्रारंभिक निष्पादन पर्यावरण पर विभिन्न संभावित प्रभाव हैं।
क्या में क्या होता है के विपरीत cmd1 <(cmd2) <(cmd3), cmd3और cmd1में cmd2 | { cmd3 | { cmd1 /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0उपयोगकर्ता से किसी भी इनपुट को पढ़ने में सक्षम नहीं होगा। इसके लिए आगे के फाइल डिस्क्रिप्टर की आवश्यकता होगी। मसलन, मैच के लिए
diff <(echo foo) <(read var; echo "$var")
आपको कुछ इस तरह की आवश्यकता होगी
{ echo foo | { read var 0<&9; echo "$var" | diff /dev/fd/3 -; } 3<&0; } 9<&0
1 उन पर अधिक यू एंड एल पर पाया जा सकता है, उदाहरण के लिए अंडरस्टैंडिंग / देव और इसके उपखंड और फाइलों में ।