다음 구문을 사용하여 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이 됩니다.