命令退出时的陷阱不起作用,除非在函数或子 shell 中使用

命令退出时的陷阱不起作用,除非在函数或子 shell 中使用

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的调用失败。

相关内容