스크립트를 실행하는 사용자가 볼 수있는 표준 출력을 변경하지 않고 -x 옵션과 함께 bash 스크립트를 실행하여 표시되는 정보를 보내는 방법이 있습니까?
이것은 우리가 자주 사용하는 bash 스크립트에서 구현하고 싶은 디버깅 기능입니다.
매우 감사.
스크립트를 실행하는 사용자가 볼 수있는 표준 출력을 변경하지 않고 -x 옵션과 함께 bash 스크립트를 실행하여 표시되는 정보를 보내는 방법이 있습니까?
이것은 우리가 자주 사용하는 bash 스크립트에서 구현하고 싶은 디버깅 기능입니다.
매우 감사.
답변:
-x의 출력은 stdout이 아닌 stderr로 이동합니다. 그러나 그조차도 문제가 될 수 있습니다. 많은 스크립트가 stderr의 내용에 기능적으로 의존하고 경우에 따라 디버그 및 stderr 스트림을 함께 혼합하는 것이 지저분합니다.
Bash 버전> 4.1은 다른 솔루션을 제공합니다. BASH_XTRACEFD 환경 변수를 사용하면 디버그 스트림을 보내는 데 사용할 파일 설명자를 지정할 수 있습니다. 이것은 파일이나 파이프 또는 다른 유닉스 선이 될 수 있습니다.
# Use FD 19 to capture the debug stream caused by "set -x":
exec 19>/tmp/my-script.log
# Tell bash about it (there's nothing special about 19, its arbitrary)
export BASH_XTRACEFD=19
# turn on the debug stream:
set -x
# run some commands:
cd /etc
find
echo "Well, that was fun."
# Close the output:
set +x
exec 19>&-
# See what we got:
cat /tmp/my-script.log
조금 더 성가 시게하면 stdout 및 / 또는 stdin 스트림에서 '티'를 수행하고 디버그 출력으로 인터리브하므로 로그가 더 완벽 해집니다. 이에 대한 자세한 내용은 /programming/3173131/redirect-copy-of-stdout-to-log-file-from-within-bash-script-itself를 참조 하십시오 .
대안에 비해이 방법의 가장 큰 장점은 디버그 출력을 stdout 또는 stderr에 주입하여 스크립트의 동작이 변경 될 위험이 없다는 것입니다.
exec 19>&-
) 를 닫아야 합니까? 내 경험상 스크립트가 끝나면 자동으로 닫힙니다.