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