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

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

어리석은 질문이라면 죄송합니다. 비슷한 작업을 수행하려고 하는데 한 줄만 사용하면 됩니다.

$ prog1 | prog2
$ prog1 | prog3

따라서 기본적으로 prog1을 실행하고 출력을 각각 prog2 및 prog3(체인 파이프 아님)로 파이프하고 싶습니다. 처음에 tee를 사용해 보았지만 출력을 파일에 덤프했기 때문에 제대로 작동하지 않는 것 같았습니다(이것은 내가 원하는 것이 아닙니다).

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

어떤 시점에서는 출력을 두 개 이상의 프로그램으로 파이프하기 위해 이것을 확장하고 싶을 수도 있지만 지금은 간단하게 시작합니다.

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

답변1

공예 대체.

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

답변2

Ignacio의 답변과 유사하게 임시 명명된 파이프를 사용할 수 있습니다 mkfifo(1).

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

약간 장황하지만 프로세스 교체 없이 시스템에서 작동합니다 dash. 예를 들어 이는 sleep 1경쟁 조건을 처리하기 위한 것입니다.

답변3

작은 유틸리티가 있습니다PTFE그것이 하는 일은:

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

파일에 쓰는 대신,PTFE명령줄에 주어진 모든 fd를 기록합니다.

PTFE의 일부입니다파이프라인 액츄에이터.

답변4

bashism이나 특수 파일 등은 필요하지 않습니다. 어쨌든 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

관련 정보