运行test.sh
:
#!/bin/bash
set -eE
trap "echo 'in trap'" ERR
var=$(bad_command)
输出为:
./test.sh: line 7: bad_command: command not found
in trap
运行test2.sh
:
#!/bin/bash
set -eE
trap "echo 'in trap'" ERR
echo $(bad_command)
输出为:
./test2.sh: line 8: bad_command: command not found
# line with whitespace printed
为什么没有在test2.sh
中触发陷阱?
答案 0 :(得分:1)
仅 的区别与var=$(badcommand)
和echo $(badcommand)
这两个命令中将错误的退出代码设置到shell有关。显然,第二种情况很明显,echo
不会设置错误的退出代码,因为它是一个独立的进程,能够根据成功/失败设置自己的代码。由于echo
似乎已经正确退出,尽管它没有任何输出可打印,所以将代码0
封装到shell中,从而掩盖了命令替换中的command not found
错误。
只需尝试在没有定义set -e
和陷阱的情况下在shell中运行
var=$(badcommand); echo $?
bash: badcommand: command not found...
127
echo $(badcommand); echo $?
bash: badcommand: command not found...
0
第一个触发陷阱,第二个不触发。