티

자, 이런 스크립트가 있다고 가정해 봅시다.

log_files=(output_{console,stdout,stderr}.log)
do_stuff 2>"${log_files[2]}" 1>"${log_files[1]}"

"${log_files[1]}"이 함수는 stdout을 stderr 로 리디렉션해야 하지만 stdout과 stderr "${log_files[2]}"도 모두 리디렉션하고 싶습니다 . "${log_files[0]}"이것이 어떻게 달성될 수 있습니까?

답변1

이는 zsh에서 훨씬 쉽습니다. multios동일한 fd에 여러 개의 리디렉션이 있는 경우 쉘은 내부 마법을 수행하여 출력을 모든 대상으로 보냅니다. 예를 들면 다음과 같습니다.

% do_stuff > stdout.log 2> stderr.log &> both.log

(중복 출력을 처리하는 중간 프로세스로 인해 stdout과 stderr로의 출력 순서가 혼동될 수 있습니다.)

답변2

생각해보고 echo "foo" | tee --append log.txt 물어보세요 파일 및 파일 설명자 1에 "foo"를 보냅니다.

그러면 "foo"가 한 쌍의 파일에 저장됩니다.

echo "foo" | tee --append one.txt  >> two.txt

따라서 각각 들어오는 텍스트를 한 쌍의 파일에 기록하는 한 쌍의 하위 쉘로 리디렉션할 수 있습니다.

명명된 파이프

더 많은 유연성이 필요한 경우 명명된 파이프를 만든 다음 결과에 임의의 논리를 적용할 수도 있습니다.

$ mkfifo /tmp/stdout
$ mkfifo /tmp/stderr

이미 하고 있는 것처럼 파일 설명자 1과 2를 보냅니다. 다른 터미널 탭이나 배경 데몬에서 실행하거나 tail -f이에 상응하는 명령을 실행하여 각 터미널에서 텍스트 줄을 검색합니다.선입선출실시간. 정규식으로 필터링하고, 타임스탬프로 장식하고, 원하는 작업을 수행하고, 원하는 만큼 싱크에 결과를 기록하세요.

답변3

또는 명명된 파이프 없이 이 작업을 수행하려면 다음 질문에 대한 답변을 사용할 수 있습니다.https://stackoverflow.com/questions/16497317/piping-both-stdout-and-stderr-in-bash

stdout 및 stderr을 각각 자체 tee 복사본에 파이프하고, 둘 다 동일한 파일에 추가하고, 필요한 각 파일에 씁니다.

그러나 tee의 모든 구현이 이 작업을 안전하게 수행하는 것은 아니므로 어떤 경우에는 "둘 다" 파일 전체에 stdout 및 stderr 블록이 이상하게 흩어져 있을 수도 있습니다.

내가 아는 한 tee에는 안전한 행 기반 버퍼링을 강제할 수 있는 방법이 없습니다.

관련 정보