linux - BASH 脚本中的错误退出不起作用

标签 linux bash shell command-line error-handling

我希望我的 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/

相关文章:

linux - 如何从 Linux 脚本中的路径中删除结束文件夹名称?

c - Linux 在运行时迭代 ELF "section" header

linux - Bash变量之谜

regex - 创建条件 bash 脚本代码

linux - 如何检查 BASH 中的文件?

iphone - 如何访问安装在 gphoto2 ://[usb:001, 003]/的 iPhone?

bash - tmux Escape 键退出服务器

c - 为什么每次在目录中制作不同的程序时只创建 a.out?

linux - 无法从一个 Docker 容器与同一台机器上的暴露容器进行通信

linux shell流重定向直接运行命令列表