내가 아는 스크립트 디버깅의 주요 방법은 -x
shabang( #!/bin/bash -x
)에 추가하는 것입니다.
set -euxo pipefail
나는 최근 다음과 같이 shabang 아래에 추가된 새로운 방법을 발견했습니다 .
#!/bin/bash
set -euxo pipefail
이 두 가지 디버깅 방법의 주요 차이점은 무엇입니까? 때로는 다른 것보다 하나를 선호합니까?
신입생으로서,이것을 읽은 후, 그런 결론을 내릴 수 없습니다.
답변1
먼저 -o
옵션에 대해 설명하겠습니다.http://explainshell.com전적으로 사실이 아닙니다.
이것이 set
내장 명령이라는 점을 고려하면 help
다음을 실행하여 해당 문서를 볼 수 있습니다 help set
.
-o option-name
Set the variable corresponding to option-name:
allexport same as -a
braceexpand same as -B
emacs use an emacs-style line editing interface
errexit same as -e
errtrace same as -E
functrace same as -T
hashall same as -h
histexpand same as -H
history enable command history
ignoreeof the shell will not exit upon reading EOF
interactive-comments
allow comments to appear in interactive commands
keyword same as -k
monitor same as -m
noclobber same as -C
noexec same as -n
noglob same as -f
nolog currently accepted but ignored
notify same as -b
nounset same as -u
onecmd same as -t
physical same as -P
pipefail the return value of a pipeline is the status of
the last command to exit with a non-zero status,
or zero if no command exited with a non-zero status
posix change the behavior of bash where the default
operation differs from the Posix standard to
match the standard
privileged same as -p
verbose same as -v
vi use a vi-style line editing interface
xtrace same as -x
보시다시피 다음을 -o pipefail
의미합니다.
파이프의 반환 값은 0이 아닌 상태로 종료된 마지막 명령의 상태이거나, 0이 아닌 상태로 종료된 명령이 없는 경우 0입니다.
그러나 그것은 말하지 않습니다: Write the current settings of the options to standard output in an unspecified format.
이제 -x
이미 알고 있듯이 디버깅을 위해 -e
스크립트의 첫 번째 오류가 발생한 후 실행이 중지됩니다. 다음과 같은 스크립트를 고려해보세요.
#!/usr/bin/env bash
set -euxo pipefail
echo hi
non-existent-command
echo bye
이 줄은
echo bye
0이 반환되지 않기 때문에 사용될 때 실행되지 않습니다.-e
non-existent-command
+ echo hi
hi
+ non-existent-command
./setx.sh: line 5: non-existent-command: command not found
마지막 줄 이 없으면 오류가 발생하더라도 자동으로 종료되도록 -e
지시하지 않았기 때문에 인쇄됩니다 .Bash
+ echo hi
hi
+ non-existent-command
./setx.sh: line 5: non-existent-command: command not found
+ echo bye
bye
set -e
일반적으로 첫 번째 오류가 발생할 때 스크립트가 중지되도록 하기 위해 스크립트 상단에 배치됩니다. 예를 들어 파일 다운로드에 실패하면 파일을 추출할 필요가 없습니다.