スクリプトをデバッグするための主な方法は、-x
をシャバン(#!/bin/bash -x
)に追加することです。
私は最近、次のようにシャバンの真下にset -euxo pipefail
を追加する新しい方法に出会いました。
#!/bin/bash
set -euxo pipefail
2つのデバッグ方法の主な違いは何ですか?どちらか一方を優先したい場合はありますか?
新入生 ここを読んだ後 、私はそのような結論を引き出すことができませんでした。
まず、残念なことに http://explainshell.com が提供する-o
オプションの説明は完全に正しくありません。
set
がbulit-inコマンドであるとすると、help set
を実行することにより、help
でそのドキュメントを見ることができます。
-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
は次のことを意味します。
パイプラインの戻り値は、ゼロ以外のステータスで終了した最後のコマンドのステータス、またはゼロ以外のステータスで終了したコマンドがない場合はゼロ
しかし、それは言いません: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
は、最初のエラーが発生したときにスクリプトを確実に停止するために、スクリプトの先頭に配置されることがよくあります。たとえば、ファイルのダウンロードに失敗した場合、抽出しても意味がありません。