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

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

내가 아는 스크립트 디버깅의 주요 방법은 -xshabang( #!/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 bye0이 반환되지 않기 때문에 사용될 때 실행되지 않습니다.-enon-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일반적으로 첫 번째 오류가 발생할 때 스크립트가 중지되도록 하기 위해 스크립트 상단에 배치됩니다. 예를 들어 파일 다운로드에 실패하면 파일을 추출할 필요가 없습니다.

관련 정보