trap
正在使用示例代码尝试无效命令返回代码
#!/bin/bash
# Exit on error
trap 'echo 'exiting..';exit' ERR
set -e
h=1
b=$((h+)) # <----- command causing the error
echo $?
echo $b
echo "end"
即使存在违规指令,我也无法导致陷阱发生。但如果我在子 shell 中运行也是一样
function junk() {
h=1
b=$((h+))
echo "Exit code:$?"
echo $b
echo "end"
echo "Hello"
}
junk
(或)在子 shell 中运行整个指令
(h=1
b=$((h+))
echo "Exit code:$?"
echo $b
echo "end"
echo "Hello"
)
我能够捕获命令失败并EXIT
捕获陷阱并相应地打印消息。
我知道使用set -e
-e errexit When set, the shell exits when a simple command in a command list exits
non-zero (FALSE). This is not done in situations, where the exit code is already checked
(if, while, until, ||, &&)
但我找不到正确的参考资料,它说仅发生在子 shell 或函数或类似的东西上。
如果我在这里遗漏了一些基本的东西,请告诉我。
答案1
您缺少的是 sigspecset -e
和 sigspecERR
都适用于命令执行(以非零值退出的命令)。你这里b=$((h+))
有的是解析错误。命令是不是因为不被理解而被执行。
为什么它在函数或子 shell 中工作?因为这个解析错误使得包含的脚本(无论是函数还是子 shell)整体失败。换句话说,这并不是b=$((h+))
触发你的陷阱(你的子shell中没有设置陷阱),这是junk
对你的子shell的调用失败。