割り当ては、コマンド置換がない限り、終了状態を持つコマンドと同じです。

割り当ては、コマンド置換がない限り、終了状態を持つコマンドと同じです。

POSIXシェルの次の例とその出力を参照してください。

  1. false;echo $?またはfalse || echo 1:1
  2. false;foo="bar";echo $?またはfoo="bar" && echo 0:0
  3. foo=$(false);echo $?またはfoo=$(false) || echo 1:1
  4. foo=$(true);echo $?またはfoo=$(true) && echo 0:0

最も投票された回答が述べたように、https://stackoverflow.com/questions/6834487/what-is-the-variable-in-shell-scripting:

$?最後に実行されたコマンドの戻り値を見つけるために使用されます。

この場合、少し誤解を招く可能性があるので、このスレッドの投稿でも参照されるPOSIX定義を見てみましょう。

?最も近いパイプの少数の終了状態に拡張されます(パイプを参照)。

したがって、割り当て自体は終了値がゼロのコマンド(またはパイプライン部分)として計算されるように見えますが、適用されます。今後割り当ての右側(たとえば、私の例ではコマンドの代替呼び出し)

私はこれらの行動が実用的な観点からどのように意味があるのか​​を理解していますが、仕事自体がこの順序で計算されることは私にとっては少し奇妙です。これが私に奇妙に見える理由をより明確にするために、割り当てが関数であるとしましょう。

ASSIGNMENT( VARIABLE, VALUE )

それではfoo="bar"そうです。

ASSIGNMENT( "foo", "bar" )

foo=$(false)次のようになります

ASSIGNMENT( "foo", EXECUTE( "false" ) )

EXECUTE走っているという意味だ最初そして直後 ASSIGNMENT実行されましたが、ここの状態は依然としてEXECUTE重要です。

私の評価は正しいですか、それとも何かが間違って理解されていないか、逃したのですか?これが私がこの行動が「奇妙だ」と思う正しい理由ですか?

ベストアンサー1

ジョブの終了状態は次のとおりです。奇妙な。割り当てが失敗する最も確実な方法は、ターゲット変数が表示される場合ですreadonly

$ err(){ echo error ; return ${1:-1} ; }
$ PS1='$? $ '
0 $ err 42
error
42 $ A=$(err 12)
12 $ if A=$(err 9) ; then echo wrong ; else E=$? ; echo "E=$E ?=$?" ; fi
E=9 ?=0
0 $ readonly A
0 $ if A=$(err 10) ; then echo wrong ; else E=$? ; echo "E=$E ?=$?" ; fi
A: is read only
1 $

ifステートメントのtrueパスまたはfalseパスはどちらも使用されず、割り当てに失敗した場合は、ステートメント全体の実行が中断されます。 POSIX モードの bash と ksh93 と zsh は、割り当てが失敗するとスクリプトを中断します。

引用するPOSIX規格:

コマンド名はありませんが、コマンド置換を含むコマンドは、シェルによって実行された最後のコマンド置換の終了ステータスを持ちます。

これがシェル構文に関連する部分です。

 foo=$(err 42)

simple_command(simple_command→cmd_prefix→ASSIGNMENT_WORD)から来ます。したがって、割り当てが成功すると、コマンド置換が含まれない限り、終了状態はゼロになり、この場合、終了状態は最後の状態になります。割り当てが失敗すると、終了ステータスはゼロではなく、取得できない可能性があります。

おすすめ記事