스크립트 출력의 복사본을 파일로 보내기

스크립트 출력의 복사본을 파일로 보내기

STDOUT출력을 로 인쇄 하고 출력을 디스크의 파일로 복사(덤프)하려는 Zsh 스크립트가 있다고 가정해 보겠습니다 .

또한 스크립트는 다음 옵션으로 시작됩니다.

set -o xtrace

이렇게 하면 실행된 명령이 장황하게 표시되고 인쇄됩니다. 이 출력을 디스크의 파일에 캡처하고 싶습니다.

내 이해는 내가 그렇게한다면

./my_script.sh > log.txt

STDOUT에만 전송되지만 log.txt터미널에서도 출력을 볼 수 있도록 하려면 어떻게 해야 합니까?

나는 다음 tee과 같은 내용을 읽었습니다.MULTIOSZsh에 옵션이 있지만 어떻게 사용하는지 잘 모르겠습니다.

내가 할 때 :

./my_script | tee log.txt

터미널에서 출력을 볼 수 있지만 파일이 log.txt모든 것을 캡처하지 못하는 것 같습니다(실제로는 거의 아무것도 캡처하지 않습니다).

답변1

스크립트가 stdout및 에 대한 출력을 생성 할 수 stderr있으며 이러한 스트림 중 하나만 로그 파일에 출력하고 있습니다.

./my_script.sh | tee log.txt모든 것을 터미널에 출력하지만 stdout로그 파일에만 덤프합니다.

./my_script.sh > log.txt 2>&1반대로 모든 것을 로그 파일에 덤프하지만 화면에는 아무것도 표시하지 않습니다.

비결은 두 가지를 결합하는 것입니다 tee.

./myscript.sh 2>&1 | tee log.txt

stderr이는 2( )를 stdout( 1)로 리디렉션한 다음 로 파이프하여 stdout터미널 tee에 복사합니다.그리고로그 파일에.

다중 zshOS에 해당하는 것은 다음과 같습니다.

./myscript.sh >&1 > log.txt 2>&1

즉, stdout을 원시 stdout 및 log.txt로 리디렉션한 다음(내부적으로 파이프를 통해 이와 유사한 것으로 tee) stderr도 거기로( tee내부 프로세스 파이프와 같은 것으로) 리디렉션합니다.

답변2

nohup을 사용하면 콘솔이 정지되거나 닫힌 경우에도 작업을 계속할 수 있어 장기 백업 등에 유용하지만 여기서는 자동 로깅을 사용합니다.

nohup myscript.sh & ; tail -f nohup.out

관련 정보