มีวิธีการไพพ์เอาต์พุตของหนึ่งโปรแกรมเป็นสองโปรแกรมอื่นหรือไม่?


28

ขออภัยถ้านี่เป็นคำถามงี่เง่า แต่ฉันพยายามทำสิ่งนี้ แต่ในบรรทัดเดียว:

$ prog1 | prog2
$ prog1 | prog3

ดังนั้นโดยทั่วไปฉันต้องการดำเนินการ prog1 และไพพ์เอาต์พุตไปยัง prog2 และ prog3 แยกจากกัน (ไม่ใช่ไปป์ที่ถูกล่ามโซ่) ตอนแรกฉันพยายามใช้ tee แต่มันดูไม่ถูกต้องเพราะมันถูกทิ้งเอาท์พุทไปยังไฟล์ (ซึ่งไม่ใช่สิ่งที่ฉันต้องการ)

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

ในบางจุดฉันอาจต้องการขยายสิ่งนี้ไปยัง piping output ไปมากกว่าสองโปรแกรม แต่ตอนนี้ฉันเพิ่งเริ่มง่าย

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

ฉันคิดว่า zsh สามารถทำได้
Keith

คำตอบ:



16

คล้ายกับคำตอบของอิกนาซิโอ, mkfifo(1)คุณสามารถใช้ไปป์ที่มีชื่อชั่วคราวโดยใช้

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

มันเป็นบิตเพิ่มเติมอย่างละเอียด dashแต่มันจะทำงานบนระบบที่ไม่ได้มีการเปลี่ยนตัวกระบวนการเช่น sleep 1คือการจัดการกับสภาพการแข่งขันใด ๆ


6

มียูทิลิตี้ขนาดเล็กpteeซึ่งทำงาน:

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

แทนที่จะเขียนไฟล์pteeเขียนไปยัง fds ทั้งหมดที่กำหนดไว้ในบรรทัดคำสั่ง

PTEEเป็นส่วนหนึ่งของpipexec


4

คุณไม่ต้องการ bashisms หรือไฟล์พิเศษหรือสิ่งใดก็ตาม - ไม่ได้อยู่ใน Linux:

% { 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กระบวนการแยกต่างหากที่ตรงกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.