ERR陷阱和命令替换

时间:2019-02-07 05:36:30

标签: bash shell

运行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中触发陷阱?

1 个答案:

答案 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

第一个触发陷阱,第二个不触发。