我遇到了一个奇怪的情况,在上面的行中插入任何成功的命令都会导致命令替换 ( $(I mean this)
) 无法按预期工作 — 即使命令失败并且设置了 err_exit ,它也不会退出。
我一直认为这一定与子 shell 的行为与我认为的不同有关,但我不能完全确定它。
这打印“应该已经退出上面”:
#!/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
,后跟活动 shell 选项。使用 时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 工作人员邮件列表中进行了报道和几个小时后修复在那个承诺它将包含在下一个版本中。