コマンド置換が時々 err_exit を尊重しないことがあります。

コマンド置換が時々 err_exit を尊重しないことがあります。

上記の行に成功したコマンドを挿入すると、コマンドの置き換え()が期待どおりに機能しない奇妙な状況に直面しました$(I mean this)。コマンドが失敗し、err_exitが設定されていても終了しません。

私はいつもこれが私が思っていたものとは異なる動作をするサブシェルに関連していると思っていましたが、完全に自信はありません。

これにより、「上記で終了する必要があります」と印刷されます。

#!/usr/bin/env zsh
setopt local_options err_exit warn_create_global nounset

local x
if false; then
else
    x=$(false)
    echo 'should have exited above'
fi

これは何も印刷しません:

#!/usr/bin/env zsh
setopt local_options err_exit warn_create_global nounset

local x
if false; then
else
    true
    x=$(false)
    echo 'should have exited above'
fi

明らかにスクリプトをに残しておくと、スクリプトが機能するようにすることができますが、true正しくないように説明することはできません。それでは何が起こり、推奨される解決策は何ですか?

答え1

これは間違いです。これは小さなテストケースです。

set -e; if false; then :; else x=$(false); echo "$? $-"; fi

割り当てx=$(false)には最後のコマンド置換状態(1)が必要です。それ以外の場合は、set -eこのコードスニペットを印刷し、1その後にアクティブなシェルオプションを表示する必要があります。使用されるとset -e、このコードスニペットは何も印刷する前に終了する必要があります。

Zsh 5.1.1はうまく動作します(ステータス1で終了しました)。 Dash、bash、mksh、ksh93はすべて同じ動作をします。

今日GitでチェックアウトしたZshは1 569Xeステータス0で印刷して終了します。falsebefore 呼び出しを追加すると、echoスクリプトは期待どおりに終了します。影響があるはずですが、そうではありませんerrexit。説明するx=$(false)git bisectb581c3fece76c87ed86ae9fc704d0fcf208a79d3最初の誤ったコミットです。

今だzsh従業員メーリングリストに報告されたそして数時間後に解決しました存在するその約束次のバージョンに含まれる予定です。

関連情報