내 문제는https://serverfault.com/questions/171095/how-do-i-join-two-named-pipes-into-single-input-stream-in-linux하지만 설정이 좀 더 복잡합니다.
저는 세 가지 프로그램을 가지고 있습니다 cmd1
.cmd2
cmd3
cmd1
입력을 받아들이지 않고 표준 출력에 씁니다.
cmd2
stdin 또는 지정된 파일을 읽고 stdout에 씁니다.
cmd3
두 개의 파일 읽기
이러한 프로그램의 데이터 흐름은 다음과 같습니다. cmd2
생성된 데이터 사용 cmd1
및 cmd3
생성된 데이터 사용:cmd1
cmd2
cmd1 ---+-----> cmd2 --->
| cmd3
+--------------->
>(), 파이프 및 단일 명령줄을 사용하여 이 데이터 흐름을 어떻게 구현할 수 있습니까 tee
?
내 추측으로는 cmd1 | tee >(cmd2) > >(cmd3)
.
답변1
mkfifo thepipe
cmd3 <( cmd1 | tee thepipe ) <( cmd2 thepipe )
이는 명명된 파이프를 사용하여 와 사이에 데이터를 전송 thepipe
합니다 .tee
cmd2
차트를 사용하세요:
cmd1 ---(tee)---(thepipe)--- cmd2 --->
| cmd3
+-------------------------->
예는 다음과 같습니다
cmd1
=echo 'hello world'
, 문자열을 표준 출력에 씁니다.cmd2
=rev
, 각 줄의 문자 순서를 반대로 바꾸고, 파일이나 표준 입력에서 읽습니다.cmd3
= 는paste
두 파일(이 경우)에서 입력을 가져와 두 개의 열을 생성합니다.
mkfifo thepipe
paste <( echo 'hello world' | tee thepipe ) <( rev thepipe )
결과:
hello world dlrow olleh
마찬가지지만 명명된 파이프를 그래프의 다른 분기에 배치합니다.
cmd1 ---(tee)--------------- cmd2 --->
| cmd3
+-----(thepipe)------------>
cmd3 thepipe <( cmd1 | tee thepipe | cmd2 )
예제 명령 사용:
paste thepipe <( echo 'hello world' | tee thepipe | rev )
그러면 위와 동일한 출력이 생성됩니다.
분명히 다른 가능성도 있습니다.
cmd1 | tee >( cmd2 >thepipe ) | cmd3 /dev/stdin thepipe
그러나 중간 결과를 임시 파일에 기록하고 두 개의 명령 세트로 나누는 것이 즐겁지 않다면 명명된 파이프를 사용하지 않을 수 있다고 생각합니다.