Bashスクリプトの一番上のeu
次はどういう意味ですか?#!/bin/bash -eu
通常、私はこれでbashスクリプトを起動します。ハッシュバン/シバン:
#!/bin/bash
しかし、私は誰かに会いました。
#!/bin/bash -eu
なぜそこに1つがあるのかわかりません-eu
。このman bash
ページを読むことは私には役に立たないようですが、おそらく私が何かを見落としているようです。
繰り返さない:
これは重複ではありません"set -eu"を使用した場合のEXITおよびERRトラップの正しい動作。
この質問の下のコメントに@ilkkachuを引用してください。、この問題を直接解決してください。
... -eと-uがトラップまたは他のエントリを処理する方法は、そのオプションと他の単一文字オプションがコマンドラインにどのように提供されるかとまったく関係ありません。
私はこれに同意します。これらは異なる動機を持つ異なる質問と回答です。この質問はあまりにも異なり、私が私の質問に対する答えを理解しようとしたときにタイトルや説明を見てクリックすることさえ考えていないほど、答えも非常に異なります。
答え1
-e
彼らはの-u
ようなオプションですset
内蔵。また、シェルのコマンドラインに提供するか、hashbang行のコマンドライン引数として提供することもできます。 (しかし、例えば質問に注意してください。Shebangの複数のパラメータ)
オンラインマニュアルには次のように記載されています。「バッシュに電話して」、それ
set組み込み関数で使用されるすべての単一文字オプションは、シェル呼び出し時にオプションとして使用可能です。
単一文字オプションは、オンラインマニュアル()の呼び出しの要約にも明示的にリストされていますが、マンbash [long-opt] [-abefhkmnptuvxdBCDHP] [-o option] ...
ページにはリストされていません。
set -u
設定されていないパラメータ拡張をエラーとして処理するようにシェルに指示します。これは変数名などのタイプミスをキャッチするのに役立ちます。
set -e
コマンドがエラーで終了した場合(終了値が別途テストされない限り)、シェルに終了するように指示します。場合によっては、各コマンドの状態を明示的にテストすることなく、エラーが発生したときにスクリプトを中断することができます。
答え2
man bash
組み込みコマンドで説明されているように、Bashスクリプトのオプションです。set
すぐにman bash
:
オプション
set組み込みコマンド(-oを含む)の説明に文書化されているすべての単一文字シェルオプションは、シェルを呼び出すときにオプションとして使用できます。
これはset
別の命令ではなく、シェル組み込み命令です。そのため、マンページが見つかりませんman set
。代わりに、bashのマニュアルでそのセクションを見つけることができますSHELL BUILTIN COMMANDS
。set
次の場所で見つけることができる組み込み機能があります。
- 金利 パイプ(単一の単純コマンドで構成できます)、リスト、または複合コマンド(上記のSHELL GRAMMARを参照)がゼロ以外の状態で終了した場合は、直ちに終了してください。 (...)
- ゆう 未設定の変数とパラメーター(特殊パラメーター「@」と「*」)は、パラメーター拡張の実行時にエラーとして処理されます。設定されていない変数または引数に対して拡張しようとすると、シェルはエラーメッセージを出力し、対話型でない場合はゼロ以外の状態で終了します。
したがって、次の例では、このフラグは宣言されていない-u
ため、最初のエコーでスクリプトが終了するようにします。notDeclared
同様にgrep
、対応するフラグが存在しない-e
ためnonExistentFile
終了し、grep(簡単なコマンド)はエラー(ゼロ以外)の状態で終了します。
#!/bin/bash -ue
echo "$notDeclared"
grep something nonExistentFile
echo "I am never going to be echoed..."
grepで終了していることを確認するには、削除するか上部に-u
移動してくださいgrep
。
注grep
:grep
ファイルにパターンが見つからない場合は、ゼロ以外の状態で終了します。したがって、上記の例でnonExistentFile
文字列なしで何かを生成すると、1(ゼロではない)で終了するため、そのフラグによって実行が終了します。ファイルで式を見つけることができないのは実際には「エラー」ではないので、これは驚くべきことです。something
grep
-e