Bash のコマンド置換への変数割り当ての終了コード 質問する

Bash のコマンド置換への変数割り当ての終了コード 質問する

変数割り当てを単純に実行した場合とコマンド置換を実行した場合、コマンドが返すエラー コードがわかりません。

a=$(false); echo $?

出力は で1、変数の割り当てによって最後のエラー コードがスイープされたり、新しいエラー コードが生成されたりしないと考えられます。しかし、これを試したとき:

false; a=""; echo $?

出力は で0、明らかにこれがa=""返され、1によって返されるものをオーバーライドしますfalse

なぜこのようなことが起こるのか知りたいのですが、変数の割り当てには他の通常のコマンドとは異なる特別な点があるのでしょうか? それとも、原因はa=$(false)単一のコマンドとみなされ、コマンド置換部分のみが意味をなすだけなのでしょうか?

- アップデート -

皆さん、ありがとうございます。回答とコメントから、「コマンド置換を使用して変数を割り当てると、終了ステータスはコマンドのステータスになります」(by @Barmar) という点を理解しました。この説明は非常に明確で理解しやすいのですが、プログラマーにとっては言葉が正確さに欠けています。この点について、TLDP や GNU マニュアル ページなどの権威ある機関からの参照を確認したいので、見つけるのを手伝ってください。ありがとうございました!

ベストアンサー1

コマンドを実行すると$(command)自身を置き換えるコマンドの出力

あなたが言う時:

a=$(false)             # false fails; the output of false is stored in the variable a

コマンドによって生成された出力はfalse変数に格納されますa。さらに、終了コードはコマンドによって生成されたものと同じです。は次のようにhelp false示します。

false: false
    Return an unsuccessful result.
    
    Exit Status:
    Always fails.

一方、こう言う。

$ false                # Exit code: 1
$ a=""                 # Exit code: 0
$ echo $?              # Prints 0

割り当ての終了コードが にa返されます0


編集:

引用元:マニュアル:

展開の 1 つにコマンド置換が含まれている場合、コマンドの終了ステータスは、最後に実行されたコマンド置換の終了ステータスになります。

引用元バッシュFAQ/002:

コマンドの戻り値や出力を変数に保存するにはどうすればよいですか?

...

output=$(command)

status=$?

への割り当てはの終了ステータスoutputには影響しません。command終了ステータスは のままです。$?

これは bash に固有のものではありません。The Open Group Base Specifications Issue 7、POSIX.1-2017 の「Shell & Utilities」巻のセクション 2.9.1「Simple Commands」の最後を引用します。

コマンド名がないが、コマンドにコマンド置換が含まれている場合、コマンドは最後に実行されたコマンド置換の終了ステータスで完了する。

おすすめ記事