上記の行に成功したコマンドを挿入すると、コマンドの置き換え()が期待どおりに機能しない奇妙な状況に直面しました$(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で印刷して終了します。false
before 呼び出しを追加すると、echo
スクリプトは期待どおりに終了します。影響があるはずですが、そうではありませんerrexit
。説明するx=$(false)
git bisect
b581c3fece76c87ed86ae9fc704d0fcf208a79d3最初の誤ったコミットです。
今だzsh従業員メーリングリストに報告されたそして数時間後に解決しました存在するその約束次のバージョンに含まれる予定です。