Có cách nào để chuyển đầu ra của một chương trình thành hai chương trình khác không?


28

Xin lỗi nếu đây là một câu hỏi ngớ ngẩn nhưng tôi đang cố gắng thực hiện một cái gì đó như thế này nhưng trên một dòng:

$ prog1 | prog2
$ prog1 | prog3

Vì vậy, về cơ bản, tôi muốn thực hiện prog1 và đặt đầu ra thành prog2 và prog3 riêng biệt (không phải là một chuỗi bị xiềng xích). Lúc đầu, tôi đã cố gắng sử dụng tee nhưng điều đó có vẻ không đúng vì nó đã chuyển đầu ra thành một tệp (đó không phải là điều tôi muốn).

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

Tại một số điểm, có lẽ tôi muốn mở rộng điều này để dẫn đầu ra tới hơn hai chương trình nhưng bây giờ tôi mới bắt đầu đơn giản.

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

Tôi nghĩ zsh có thể làm điều này.
Keith

Câu trả lời:



16

Tương tự như câu trả lời của Ignacio, bạn có thể sử dụng đường ống có tên tạm thời bằng cách sử dụng mkfifo(1).

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

Nó dài dòng hơn một chút, nhưng nó sẽ hoạt động trên các hệ thống không có sự thay thế quá trình, như thế dash. Là sleep 1để xử lý bất kỳ điều kiện chủng tộc.


6

Có một ptee tiện ích nhỏ thực hiện công việc:

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

Thay vì ghi vào tệp, ptee ghi vào tất cả các fds được đưa ra trên dòng lệnh.

ptee là một phần của pipexec .


4

Bạn không cần bất kỳ bashism hoặc tệp đặc biệt hoặc bất kỳ tệp nào - không phải trong 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

Tôi đánh dấu sao các kết quả được greptô sáng cho tôi để cho thấy chúng không chỉ là ba kết quả từ cùng một luồng mà còn là kết quả của các kết quả grepkhớp quy trình riêng biệt .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.