デバッグスクリプト、-euxo pipefailを設定する-xの違いは何ですか?


17

スクリプトをデバッグするために知っている主な方法は-x、shabang(#!/bin/bash -x)に追加することです。

私は最近、次のようにset -euxo pipefailシャバンの下に追加する新しい方法に出会いました:

#!/bin/bash
set -euxo pipefail

デバッグの2つの方法の主な違いは何ですか?あるものを他のものよりも好む場合がありますか?

新入生として、ここを読んだ後、私はそのような結論を引き出すことができませんでした。

回答:


15

まず、http://explainshell.com-o提供するオプションの説明が完全に正しいわけではないことを恐れています。

それsetがbulit-inコマンドである場合、次のコマンドを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とおり:

パイプラインの戻り値は、ゼロ以外のステータスで終了する最後のコマンドのステータス、またはゼロ以外のステータスで終了したコマンドがない場合はゼロ

しかし、それは言っていません: 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それがただ原因となることを意味する場合、スクリプトはエラーで終了します。あなたの例では、とともに多くのオプションの1つにすぎません-uxo pipefail
はArkadiusz Drabczyk

e引数を使用するかどうかを提案しているかどうかわからないというつもりでした。
-JohnDoea

1
要件によって異なります。デフォルトでは設定されていないため、作成者次第です。スクリプトで使用されるすべてのコマンド0が成功時に常に戻り、失敗時にゼロ以外の値が返されることが確実な場合-eは便利ですが、他のすべてとしては慎重に使用する必要があります。
はArkadiusz Drabczyk

1
このコンテキストで-uが推奨される理由を説明して、答えを展開していただけますか?
パトリスM.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.