次の例とそれらのPOSIXシェルでの出力を参照してください。
false;echo $?
またはfalse || echo 1
:1
false;foo="bar";echo $?
またはfoo="bar" && echo 0
:0
foo=$(false);echo $?
またはfoo=$(false) || echo 1
:1
foo=$(true);echo $?
またはfoo=$(true) && echo 0
:0
/programming/6834487/what-is-the-variable-in-shell-scriptingの最高投票の回答で述べたように:
$?
最後に実行されたコマンドの戻り値を見つけるために使用されます。
これはおそらくこの場合少し誤解を招く可能性があるので、そのスレッドからの投稿でも引用されているPOSIX定義を取得しましょう。
?最新のパイプラインの10進数の終了ステータスに展開します(パイプラインを参照)。
したがって、割り当て自体はゼロの終了値を持つコマンド(またはパイプラインパーツ)としてカウントされているように見えますが、割り当ての右側の前に適用されます(たとえば、ここでの例ではコマンド置換呼び出し)。
この振る舞いが実用的な見地からどのように意味を成すかはわかりますが、割り当て自体がその順序でカウントされることは、私には幾分珍しいようです。多分それが私にとって奇妙な理由をより明確にするために、割り当てが関数であったと仮定しましょう:
ASSIGNMENT( VARIABLE, VALUE )
そしてfoo="bar"
だろう
ASSIGNMENT( "foo", "bar" )
のfoo=$(false)
ようなものになります
ASSIGNMENT( "foo", EXECUTE( "false" ) )
そのことを意味するEXECUTE
実行が最初と後にのみ ASSIGNMENT
実行されますが、それはまだだEXECUTE
ここで問題のステータス。
私の評価は正しいですか、それとも何かを誤解/不足していますか?これらは、私がこの振る舞いを「奇妙な」ものと見なす正しい理由ですか?
false;foo="bar";echo $?
実行された最後の実際のコマンドがなぜなぜいつも0を返すのfalse
ですか?」基本的に、割り当ては終了コードに関して特別な動作をします。それらの終了コードは、割り当ての右側の一部として実行された何かが原因ではない場合を除いて、常に0です。