bash
संस्करण 4 में coproc
कमांड है जो इसे bash
बिना नाम के पाइप में शुद्ध करने की अनुमति देता है :
coproc cmd1
eval "exec cmd2 <&${COPROC[0]} >&${COPROC[1]}"
कुछ अन्य गोले भी कर सकते हैं coproc
।
नीचे अधिक विस्तृत उत्तर दिया गया है, लेकिन दो के बजाय तीन आदेशों को जंजीर दिया गया है, जो केवल एक छोटे से अधिक दिलचस्प बनाता है।
यदि आप भी उपयोग करने के लिए खुश हैं cat
और stdbuf
फिर निर्माण को समझने में आसान बनाया जा सकता है।
संस्करण का उपयोग bash
कर cat
और stdbuf
, समझने में आसान:
# start pipeline
coproc {
cmd1 | cmd2 | cmd3
}
# create command to reconnect STDOUT `cmd3` to STDIN of `cmd1`
endcmd="exec stdbuf -i0 -o0 /bin/cat <&${COPROC[0]} >&${COPROC[1]}"
# eval the command.
eval "${endcmd}"
ध्यान दें, eval का उपयोग करना है क्योंकि <और $ var में चर का विस्तार मेरे बैश 4.2.25 के छंद में अवैध है।
शुद्ध का उपयोग करते हुए संस्करण bash
: दो भागों में टूटना, पहली पाइप लाइन को कॉप्रोक के नीचे लॉन्च करना, फिर दोपहर के भोजन के दूसरे भाग (या तो एक कमांड या एक पाइपलाइन) को पहले में फिर से जोड़ना:
coproc {
cmd 1 | cmd2
}
endcmd="exec cmd3 <&${COPROC[0]} >&${COPROC[1]}"
eval "${endcmd}"
अवधारणा के सुबूत:
फ़ाइल ./prog
, उपभोग करने के लिए सिर्फ एक डमी प्रोग, टैग और री-प्रिंट लाइनें। ओवरकलिंग से होने वाली समस्याओं से बचने के लिए सब-हेल्प का उपयोग करना, यहाँ बात नहीं है।
#!/bin/bash
let c=0
sleep 2
[ "$1" == "1" ] && ( echo start )
while : ; do
line=$( head -1 )
echo "$1:${c} ${line}" 1>&2
sleep 2
( echo "$1:${c} ${line}" )
let c++
[ $c -eq 3 ] && exit
done
फ़ाइल ./start_cat
यह एक संस्करण का उपयोग कर रहा है bash
, cat
औरstdbuf
#!/bin/bash
echo starting first cmd>&2
coproc {
stdbuf -i0 -o0 ./prog 1 \
| stdbuf -i0 -o0 ./prog 2 \
| stdbuf -i0 -o0 ./prog 3
}
echo "Delaying remainer" 1>&2
sleep 5
cmd="exec stdbuf -i0 -o0 /bin/cat <&${COPROC[0]} >&${COPROC[1]}"
echo "Running: ${cmd}" >&2
eval "${cmd}"
या फ़ाइल ./start_part
। यह bash
केवल शुद्ध का उपयोग कर एक संस्करण है । डेमो प्रयोजनों के लिए मैं अभी भी उपयोग कर रहा हूं stdbuf
क्योंकि आपके असली ठेले को बफरिंग के कारण अवरुद्ध होने से बचने के लिए आंतरिक रूप से बफरिंग से निपटना होगा।
#!/bin/bash
echo starting first cmd>&2
coproc {
stdbuf -i0 -o0 ./prog 1 \
| stdbuf -i0 -o0 ./prog 2
}
echo "Delaying remainer" 1>&2
sleep 5
cmd="exec stdbuf -i0 -o0 ./prog 3 <&${COPROC[0]} >&${COPROC[1]}"
echo "Running: ${cmd}" >&2
eval "${cmd}"
आउटपुट:
> ~/iolooptest$ ./start_part
starting first cmd
Delaying remainer
2:0 start
Running: exec stdbuf -i0 -o0 ./prog 3 <&63 >&60
3:0 2:0 start
1:0 3:0 2:0 start
2:1 1:0 3:0 2:0 start
3:1 2:1 1:0 3:0 2:0 start
1:1 3:1 2:1 1:0 3:0 2:0 start
2:2 1:1 3:1 2:1 1:0 3:0 2:0 start
3:2 2:2 1:1 3:1 2:1 1:0 3:0 2:0 start
1:2 3:2 2:2 1:1 3:1 2:1 1:0 3:0 2:0 start
उसने ऐसा किया।