वर्तमान इनाम नोटिस में सवाल:
सामान्य उदाहरण बहुत जटिल है। क्या कोई कृपया बता सकता है कि निम्नलिखित उदाहरण को कैसे लागू किया जाए?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 उन पर अधिक यू एंड एल पर पाया जा सकता है, उदाहरण के लिए अंडरस्टैंडिंग / देव और इसके उपखंड और फाइलों में ।