क्या एक प्रोग्राम के आउटपुट को दो अन्य प्रोग्राम में पाइप करने का कोई तरीका है?


28

क्षमा करें यदि यह एक मूर्खतापूर्ण प्रश्न है, लेकिन मैं इस तरह से एक पंक्ति में कुछ पूरा करने की कोशिश कर रहा हूं:

$ prog1 | prog2
$ prog1 | prog3

इसलिए, मैं मूल रूप से prog1 निष्पादित करना चाहता हूं और आउटपुट को prog2 और prog3 को अलग से पाइप करता हूं (एक जंजीर पाइप नहीं)। सबसे पहले, मैं टी का उपयोग करने की कोशिश कर रहा था, लेकिन यह सही नहीं लगता था क्योंकि यह एक फ़ाइल में आउटपुट डंप कर रहा था (जो मुझे नहीं चाहिए)।

$ prog1 | tee prog2 | prog3 # doesn't work - creates file "prog2"

कुछ बिंदु पर, मैं शायद इसे दो से अधिक कार्यक्रमों में आउटपुट पाइप करने के लिए विस्तारित करना चाहता हूं, लेकिन मैं अभी के लिए सरल शुरू कर रहा हूं।

$ prog1 | prog2
$ prog1 | prog3
$ prog1 | prog4
...

मुझे लगता है कि zsh ऐसा कर सकता है।
कीथ

जवाबों:


28

प्रक्रिया प्रतिस्थापन।

... | tee >(prog2) | ...

1
IIRC जो एक बैश एक्सटेंशन है और मानक POSIX श में नहीं पाया जाता है।
साइमन रिक्टर

6
@SimonRichter यह ksh93 एक्सटेंशन है, जो बाश और zsh में भी पाया जाता है।
गिल्स एसओ- बुराई को रोकना '

16

इग्नासियो के उत्तर के समान, आप एक अस्थायी नामित पाइप का उपयोग कर सकते हैं mkfifo(1)

mkfifo /tmp/teedoff.$$; cmd | tee /tmp/teedoff.$$ | prog2 & sleep 1; prog3 < /tmp/teedoff.$$; rm /tmp/teedoff.$$

यह थोड़ा अधिक वर्बोज़ है, लेकिन यह उन प्रणालियों पर काम करेगा जिनके पास प्रक्रिया प्रतिस्थापन नहीं है, जैसे dashsleep 1किसी भी जाति की स्थिति को संभालने के लिए है।


6

वहाँ एक छोटे उपयोगिता है ptee जो काम करता है:

prog1 | ptee 2 3 4 2> >(prog2) 3> >(prog3) 4> >(prog4)

फ़ाइलों को लिखने के बजाय, ptee उन सभी fds को लिखता है जो कमांड लाइन पर दिए गए हैं।

ptee का हिस्सा है pipexec


4

आप किसी भी bashism या विशेष फ़ाइलों या किसी भी की जरूरत नहीं है - वैसे भी लिनक्स में नहीं:

% { prog1 | tee /dev/fd/3 | prog2 >&2 ; } 3>&1 | prog3 

{ { printf %s\\t%s\\t%s\\n \
    "this uneven argument list" \
    "will wrap around" to \
    "different combinations" \
    "for each line." "Ill pick out" \
    "a few words" "and grep for them from" \
    "the same stream." | 
 tee /dev/fd/3 /dev/fd/4 | 
 grep combination >&2 ; } 3>&1 |
 grep pick >&2 ; } 4>&1 | 
 grep line

different combinations  for each *line.*  Ill pick out
different combinations  for each line.  Ill *pick* out
different *combinations*  for each line.  Ill pick out

मैंने अपने परिणामों पर grepप्रकाश डाला, यह दिखाने के लिए कि वे एक ही धारा से केवल तीन परिणाम नहीं थे, बल्कि वे अलग-अलग grepप्रक्रिया मैचों के परिणाम भी थे ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.