표준 출력과 표준 오류를 두 파일로 보내는 방법

표준 출력과 표준 오류를 두 파일로 보내는 방법

다음 구문을 사용하여 stdout 및 stderr을 $log 파일로 보냅니다.

log=/var/tmp/install.log
info=/tmp/info.log 

exec > $log 2>&1

표준 출력과 표준 오류도 /tmp/info.log 파일로 리디렉션하려면 어떻게 해야 합니까?

답변1

Bash를 사용하는 경우 프로세스 대체를 사용할 수 있으며 다음을 수행할 수 있습니다 tee.

exec &> >(tee "$log" > "$info")

이는 두 스트림을 교체 프로세스로 리디렉션하여 tee출력을 "$log"stdin으로 보낸 다음 출력을 "$info".

/var/tmp/install.log그렇지 않으면 콘텐츠를 다음으로 보내기 위해 백그라운드 프로세스를 시작해야 할 수도 있습니다 /tmp/info.log.

log=/var/tmp/install.log
info=/tmp/info.log 
exec > "$log" 2>&1
tail -n+1 -f "$log" > "$info" &

tail백그라운드에서 실행되며 전송된 모든 콘텐츠를 으로 /var/tmp/install.log보냅니다 /tmp/info.log.

답변2

작업은 애플리케이션이 로그 파일을 삭제하더라도 로그 출력을 보존하는 것입니다.

를 사용하여 로그 파일에 대한 두 번째 이름을 생성하면 ln로그의 데이터를 두 이름으로 모두 사용할 수 있습니다. 이름 중 하나를 삭제해도 다른 이름의 데이터는 계속 사용할 수 있습니다.

스크립트에서:

log=/var/tmp/install.log
info=/tmp/info.log 

ln -f "$log" "$info"

exec >"$log" 2>&1

이전에 존재하지 않았다면 호출하기 전에 생성 $log해야 합니다 .touch "$log"ln

이는 두 이름이 모두 동일한 파일 시스템에 있다고 가정합니다.

이 답변 은 귀하가 bash.sh

답변3

완전성을 위해 기본 파일 설명자가 출력되므로 1>을 >로 쓸 수 있습니다. 따라서 1>과 >는 같은 것입니다.

따라서 command2>error1>output은 command2>error>output이 됩니다.

관련 정보