local
と組み合わせた場合はこの限りではないことに注意してください。 、 local variable="$(command)"
のように . command
であっても、そのフォームは正常に終了します 失敗しました。
たとえば、次の Bash スクリプトを見てください:
#!/bin/bash
function funWithLocalAndAssignmentTogether() {
local output="$(echo "Doing some stuff.";exit 1)"
local exitCode=$?
echo "output: $output"
echo "exitCode: $exitCode"
}
function funWithLocalAndAssignmentSeparate() {
local output
output="$(echo "Doing some stuff.";exit 1)"
local exitCode=$?
echo "output: $output"
echo "exitCode: $exitCode"
}
funWithLocalAndAssignmentTogether
funWithLocalAndAssignmentSeparate
これの出力は次のとおりです:
[email protected]:~$ ./tmp.sh
output: Doing some stuff.
exitCode: 0
output: Doing some stuff.
exitCode: 1
これは local
のためです 実際には組み込みコマンドであり、 local variable="$(command)"
のようなコマンドです local
を呼び出します 後 command
の出力を置き換える .したがって、 local
から終了ステータスを取得します .
$(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 つにコマンド置換が含まれている場合、コマンドの終了ステータスは、最後に実行されたコマンド置換の終了ステータスです。
BASHFAQ/002 からの引用:
<ブロック引用>コマンドの戻り値や出力を変数に保存するにはどうすればよいですか?
...
output=$(command)
status=$?
output
への代入 command
には影響しません の終了ステータス、まだ $?
のままです .