2013-11-23 10 views
32

を命令する変数割り当ての終了コード、私ははっきりとコマンド置換と変数の代入を実行するときに、コマンドが返されますどのようなエラーコードについて混乱しています:バッシュ:置換

a=$(false); echo $? 

それは私が考えてみましょう1を出力しますその変数の代入は、最後の変数に対して新しいエラーコードをスウィープまたは生成しません。私はこの試みたときしかし:それは0を出力

false; a=""; echo $? 

を、明らかにこれは何a=""リターンであり、それはfalseによって返さ1を上書きします。

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

- UPDATE -

みんなありがとう、私はポイントを得た答えとコメントから、「あなたはコマンド置換を使用して変数を割り当てる場合、終了ステータスはコマンドのステータスです。」 (@Barmarによる)、この説明は非常に明確で理解しやすいですが、プログラマにとっては十分正確ではないので、私はTLDPやGNU manページのような当局からこの点を参照したいと思っています。もう一度、ありがとう!

+0

TLDPは信頼できるソースではありません - ABSは、JavaScriptの世界にw3schoolsがあるのと同じように、悪い習慣をbashで披露していると大変悪評されています。 –

答えて

44

$(command)としてコマンドを実行すると、output of the command to replace itselfが許可されます。

あなたが言うとき:

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 

0ある返されるaへの割り当ての終了コードが発生します。


EDIT:

manualからの引用:

展開の一つは、コマンド置換が含まれていた場合、コマンドの終了 ステータスは最後のコマンドの終了ステータスです 置換が行われた。 BASHFAQ/002から引用

どのように私は、戻り値および/または 変数にコマンドの出力を保存することができますか?

...

output=$(command)

status=$?

割り当てoutputへ が$?にまだあるcommandの終了ステータスには影響を与えません。

+0

非常に良い答え:)! 'exitコードがコマンドによって生成されたものと同じであることを参照してください。私は多くの時間を費やしましたが、結果を得られませんでした:( – Reorx

+0

@Reorx上記の編集で2つの参考文献を追加しました。 – devnull

+0

ありがとう、それは十分明確です:D – Reorx

0

(ない元の質問への答えが、コメントには長すぎる)

export A=$(false); echo $?出力0という!明らかに、devnull's answerで引用された規則は適用されなくなりました。その引用にコンテキストのビットを追加するには(強調鉱山):

3.7.1シンプルなコマンド拡張

...

拡張後に残ったコマンド名、実行が進むにつれてがある場合以下、と記載されている。 それ以外の場合は、コマンドが終了します。拡張の1つにコマンド置換が含まれている場合、コマンドの終了ステータスは最後に実行されたコマンド置換の終了ステータスです。コマンドの置換がなかった場合、コマンドはゼロの状態で終了します。

3.7.2コマンド検索と実行 -

IIUC [これは、 "以下" の場合ある]マニュアルはvar=foo command...構文(!かなり混乱)のvar=fooなどの特殊なケースについて説明します。 「最後のコマンド置換の終了ステータス」ルールは、コマンドなしの場合にのみ適用されます。

export var=fooを「変更された代入構文」と考えるのは魅力的ですが、exportは組み込みコマンドです(代入に似たargsをとる)。

=>あなたはVARをエクスポートして、コマンド置換の状態をキャプチャし、2つの段階でそれをしたい場合:

A=$(false) 
# ... check $? 
export A 

この方法でもset -eモードで動作します - コマンド置換が非0を返す場合は、直ちに終了します。