여러 파이프를 함께 연결하는 "티"의 반대 기능이 있습니까?

여러 파이프를 함께 연결하는 "티"의 반대 기능이 있습니까?

STDOUT출력을 생성하는 여러 프로세스가 있고 STDERR번호가 매겨진 파일 설명자로 리디렉션되었으며 모든 출력을 단일 파일로 수집하려고 합니다.

나는 순진하게 노력했다

[input processes] | cat <3 <4 <5 2>&1 >[output file]

그러나 물론 이것은 작동하지 않습니다. 왜냐하면 cat은 STDIN후속 파이프에서 읽기 전에 해당 파이프가 닫힐 때까지 기다리기 때문에 다른 파이프의 버퍼가 가득 차면 내 프로세스가 중단되기 때문입니다.

어떤 제안이 있으십니까?

답변1

출력을 하나로 합치는 것은 실제로 이중성이 아닙니다 tee. tee입력의 복사본을 여러 개 만드는 반면, 출력을 대조하는 데는 데이터 병합이 포함되지 않습니다.

출력 소스를 결합하려면 모두 동일한 파일 설명자로 리디렉션하면 됩니다. 일반적으로 소스 인터리빙은 다소 예측할 수 없지만 파이프에 대한 쓰기는 충분히 작습니다.원자성 보장. (읽기 측에서 경계를 식별할 수 있는 것은 또 다른 일이다..)

{ data_source_1 &
  data_source_2 &
  wait; } >merged_output

여러 파일 설명자에서 입력을 받아 이를 결합하려면 각 파일 설명자를 전달하세요.

{ cat <&3 & cat <&4 & wait; } >merged_ouput

그러나 일반적으로 모든 파일 설명자를 동일한 대상으로 리디렉션할 수 있습니다.

… 3>merged_ouput 4>&3

답변2

STDERR과 STDOUT은 각 프로세스의 STDOUT에 추가되어야 합니다.

예:
processA 2>&1 | processB | processC

STDOUT 및 STDERR은 PIPE를 통해 processB의 STDIN으로 리디렉션됩니다. 그러나 processC는 ProcessB의 STDOUT을 STDIN으로만 가져옵니다.

따라서 processB의 STDOUT 및 STDERR이 processC의 STDIN으로 필요한 경우 다음을 수행하십시오. processA 2>&1 | processB 2>&1 | processC

실제로 파이프를 사용하고 싶지 않지만 모든 유형의 출력을 단일 파일로 리디렉션하려는 경우 다음을 수행할 수 있습니다.

(processA; processB) >./just_STDOUT.txt

(processA 2>&1; processB 2>&1) >./STDOUT_AND_STDERR.txt

관련 정보