我希望我的 BASH 脚本在脚本出现错误时退出。但我无法让它发挥作用。
我尝试了两种方法,使用 trap 和 set -e,也同时尝试了两种方法。
这是一个测试脚本:
#!/bin/bash
# Exit on error
trap 'exit' ERR
set -e
h=1
b=$((h+)) # this produces an error
echo $?
echo $b
echo "end"
如果我运行脚本,输出看起来像:
test.sh: line 8: h+: syntax error: operand expected (error token is "+")
1
end
为什么它不起作用,如何让这两种方式都起作用?
最佳答案
您(故意)在 set -e
和陷阱的上下文中引入语法错误。您发现了与这些相关的似乎出乎意料的行为。但我认为这个问题与 trap 或 shell 选项无关。
试试这个(不在你的脚本中,只是在交互式 shell 中):
echo $(( H+ )) && echo OK || echo NOT_OK
当然,这会失败(紧接着尝试 echo $?
)。但它不会回显“NOT_OK”,它不会回显任何内容,这看起来一点也不自然。
因此,如果存在语法错误,正常的 shell 语义就会崩溃。您不能假设语法错误导致的失败行为类似于返回非零状态的命令,它显然绕过了我们习惯的预期 shell 错误处理行为的某些部分。
还有一件事...这是算术表达式中的语法错误,但在解析脚本时未检测到。它不会阻止脚本的执行(与缺少引号、括号相反......)。
这做了同样的事情:
[[ A = ]] && echo OK || echo NOT_OK
但这不会(将显示 NOT_OK):
[ A = ] && echo OK || echo NOT_OK
双括号条件是保留字,而单括号条件是 shell 内置命令,因此这可能与行为差异有关。
关于linux - BASH 脚本中的错误退出不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41375704/