STDOUT
출력을 로 인쇄 하고 출력을 디스크의 파일로 복사(덤프)하려는 Zsh 스크립트가 있다고 가정해 보겠습니다 .
또한 스크립트는 다음 옵션으로 시작됩니다.
set -o xtrace
이렇게 하면 실행된 명령이 장황하게 표시되고 인쇄됩니다. 이 출력을 디스크의 파일에 캡처하고 싶습니다.
내 이해는 내가 그렇게한다면
./my_script.sh > log.txt
STDOUT
에만 전송되지만 log.txt
터미널에서도 출력을 볼 수 있도록 하려면 어떻게 해야 합니까?
나는 다음 tee
과 같은 내용을 읽었습니다.MULTIOS
Zsh에 옵션이 있지만 어떻게 사용하는지 잘 모르겠습니다.
내가 할 때 :
./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
에 복사합니다.그리고로그 파일에.
다중 zsh
OS에 해당하는 것은 다음과 같습니다.
./myscript.sh >&1 > log.txt 2>&1
즉, stdout을 원시 stdout 및 log.txt로 리디렉션한 다음(내부적으로 파이프를 통해 이와 유사한 것으로 tee
) stderr도 거기로( tee
내부 프로세스 파이프와 같은 것으로) 리디렉션합니다.
답변2
nohup을 사용하면 콘솔이 정지되거나 닫힌 경우에도 작업을 계속할 수 있어 장기 백업 등에 유용하지만 여기서는 자동 로깅을 사용합니다.
nohup myscript.sh & ; tail -f nohup.out