Linux에서 명명된 파이프를 사용하여 출력을 분할하고 다시 연결

Linux에서 명명된 파이프를 사용하여 출력을 분할하고 다시 연결

내 문제는https://serverfault.com/questions/171095/how-do-i-join-two-named-pipes-into-single-input-stream-in-linux하지만 설정이 좀 더 복잡합니다.

저는 세 가지 프로그램을 가지고 있습니다 cmd1.cmd2cmd3

cmd1입력을 받아들이지 않고 표준 출력에 씁니다.

cmd2stdin 또는 지정된 파일을 읽고 stdout에 씁니다.

cmd3두 개의 파일 읽기

이러한 프로그램의 데이터 흐름은 다음과 같습니다. cmd2생성된 데이터 사용 cmd1cmd3생성된 데이터 사용:cmd1cmd2

cmd1 ---+-----> cmd2 --->
        |                  cmd3
        +---------------> 

>(), 파이프 및 단일 명령줄을 사용하여 이 데이터 흐름을 어떻게 구현할 수 있습니까 tee?

내 추측으로는 cmd1 | tee >(cmd2) > >(cmd3).

답변1

mkfifo thepipe
cmd3 <( cmd1 | tee thepipe ) <( cmd2 thepipe )

이는 명명된 파이프를 사용하여 와 사이에 데이터를 전송 thepipe합니다 .teecmd2

차트를 사용하세요:

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

그러나 중간 결과를 임시 파일에 기록하고 두 개의 명령 세트로 나누는 것이 즐겁지 않다면 명명된 파이프를 사용하지 않을 수 있다고 생각합니다.

관련 정보