2016-06-19 9 views
2

この例では、bashのbashコマンド置換が不正終了ステータスを受信

main_script.shを搭載したMacエルキャピタンで試験した:

注:func_aとfunc_bは、その行を除いて同一でありますローカル変数outputが宣言されています。

func_a() { 
    local output 
    output="$(./external.sh some_function)" 
    if [ $? -eq 0 ];then 
     echo "A zero result ($?) -> $output <- end" 
    else 
     echo "A other result ($?) -> $output <- end" 
    fi 
} 

func_b() { 
    local output="$(./external.sh some_function)" 
    if [ $? -eq 0 ];then 
     echo "B zero result ($?) -> $output <- end" 
    else 
     echo "B other result ($?) -> $output <- end" 
    fi 
} 

func_a 
func_b 

external.sh:

私が出力されmain_script実行
some_function() { 
    echo "this is the output" 
    return 1 
} 

"[email protected]" 

A other result (1) -> this is the output <- end 
B zero result (0) -> this is the output <- end 

のためにどのような理由と同じラインなどのローカル変数の宣言コマンドの代替は結果に影響しますか?これはバグかもしれませんか?何か不足していますか?

+0

これは役に立つかもしれません:[bashスクリプトのデバッグ方法](http://unix.stackexchange.com/q/155551/74329) – Cyrus

+0

bashスクリプトのデバッグ方法とset -xの機能をよく理解しています。私は出力を可能な限り明確にしようとしました。私は問題が何であるか知っている、なぜ今は私は不思議。何があってもローカルのvarがゼロを返すと宣言したようです.bashバグのようですか? – arctelix

答えて

2

理由はfunc_b$?local組み込みの成功ではなく、コマンド置換($(...)の成功を反映していることです。 かかわらずRHS上の任意のコマンド置換はか失敗したかどうかの - 割り当ては構文的に正しいある場合

local組み込みが成功します。

これは、declareexportビルトインに似ています。

は、単純な例を示している:なし組み込みが
関与しない場合一方

declare output="$(false)"; echo $? # -> 0(!) - even though `false` obviously fails. 

、 - コマンド置換の故障が反映されて - 単純変数代入の場合$?

output="$(false)"; echo $? # -> 1(!) - simple assignment; $(...) exit code is reported 

この動作の反直感的な差はlocal/declare/exportビルトインではなくシェル構文の一部であるという事実によって説明されます。ビルトイン(組み込みコマンド)として

、それらはコマンドように扱われ、そしてコマンドは、それら自身終了コードを介して彼らの成功/失敗を知らせることが期待されます。上記の組み込み関数の場合、前述のように、構文的に正しい代入は成功と見なされます。つまり、何かを割り当てることができます。RHSでのコマンド置換に失敗したために何かがヌル文字列であっても、成功した。

+0

それは私が考えていたことは続いていた。変数を宣言することは代入の成功に優先するだろうということは愚かである。でも、シェルスクリプトの土地では直感的なことはほとんどありません。 – arctelix

+0

@arctelix:間違いなく直感的です。私はうまくいけば少なくともそれが起こる理由を説明するいくつかの背景情報を追加しました。 – mklement0

関連する問題