![命令退出时的陷阱不起作用,除非在函数或子 shell 中使用](https://linux22.com/image/101910/%E5%91%BD%E4%BB%A4%E9%80%80%E5%87%BA%E6%97%B6%E7%9A%84%E9%99%B7%E9%98%B1%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%EF%BC%8C%E9%99%A4%E9%9D%9E%E5%9C%A8%E5%87%BD%E6%95%B0%E6%88%96%E5%AD%90%20shell%20%E4%B8%AD%E4%BD%BF%E7%94%A8.png)
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的调用失败。