한 프로그램의 출력을 두 개의 다른 프로그램으로 파이프하는 방법이 있습니까?


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가 이것을 할 수 있다고 생각합니다.
Keith

답변:



16

Ignacio의 답변과 유사하게을 사용하여 임시 명명 된 파이프를 사용할 수 있습니다 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 는 파일에 쓰는 대신 명령 행에 제공된 모든 fd에 씁니다.

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동일한 스트림에서 결과가 3 개일뿐 아니라 개별 grep프로세스 일치 의 결과임을 보여주기 위해 강조 표시된 결과에 별표를 표시했습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.