스크립트 디버깅, -x와 -euxo pipefail 설정의 차이점은 무엇입니까?


17

스크립트를 디버깅하는 주요 방법 -x은 shabang ( #!/bin/bash -x)에 추가 하는 것 입니다.

나는 최근 set -euxo pipefail에 다음과 같이 shabang 바로 아래에 새로운 방법을 발견 했습니다.

#!/bin/bash
set -euxo pipefail

두 가지 디버깅 방법의 주요 차이점은 무엇입니까? 다른 것보다 선호하는 시간이 있습니까?

신입생으로서 여기를 읽은 후에는 그런 결론을 추출 할 수 없었습니다.

답변:


15

첫째, http://explainshell.com에서-o 제공하는 옵션에 대한 설명이 완전히 정확하지 않을까 걱정 됩니다.

그 감안할 때 setbulit이 제공 명령, 우리가 그 문서를 볼 수 있습니다 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때 라인이 실행되지 않습니다 -e때문에 사용되는 non-existent-command0을 반환하지 않습니다 :

+ 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 첫 번째 오류가 발생했을 때 스크립트가 중지되도록하기 위해 종종 스크립트 맨 위에 배치됩니다. 예를 들어 파일 다운로드에 실패한 경우 압축을 풀 수 없습니다.


나는 대답을 읽었지만 이것이 확실하지 않다 : 당신이 사용하도록 권장하는 구문은 무엇입니까 (이것과 같이 약간 다르다고 생각합니다 set -uxo pipefail).
JohnDoea

의미 set -e하는 경우 오류가 발생하면 스크립트가 종료됩니다. 귀하의 예에서는와 함께 많은 옵션 중 하나 일뿐입니다 -uxo pipefail.
Arkadiusz Drabczyk

나는 당신이 나에게 e인수 를 사용하거나 사용하지 말 것을 제안하는지 확실하지 않다고 말하려고했다 .
JohnDoea

1
요구 사항에 따라 다릅니다. 기본적으로 설정되어 있지 않으므로 작성자에게 달려 있습니다. 스크립트에 사용 된 모든 명령이 항상 0성공하면 반환 되고 실패하면 0이 아닌 -e것이 유용하지만 다른 모든 명령은주의해서 사용해야합니다.
Arkadiusz Drabczyk

1
이 문맥에서 왜 -u가 권장되는지 설명하면서 답을 확장 할 수 있습니까?
파트리스 M.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.