如果我以普通用户身份运行以下Shell脚本,它将按预期在第三行中止:
set -o errexit
echo foo > /bar
echo $?
以下是输出:
$ sh test1.sh
test.sh: 3: test.sh: cannot create /bar: Permission denied
但是,如果 echo 命令是复合列表的一部分,则执行失败的命令后将继续执行并显示退出代码:
set -o errexit
{ echo foo; } > /bar
echo $?
以下是输出:
$ sh test2.sh
test.sh: 3: test.sh: cannot create /bar: Permission denied
2
脚本为什么不会中止?另一方面,如果我将花括号更改为括号,则其工作方式将与我期望的一样。
答案 0 :(得分:2)
POSIX规范指出a shell "may exit" if a redirection error occurs with a compound command。
如果复合命令是子外壳命令(bash
), (...)
选择退出,否则选择不退出。我不知道这种区别的理由;本质上可能是历史性的。
set -e
有许多怪异之处,而且通常不会像您期望的那样表现。许多人建议您不要使用它。