Bash 错误陷阱和命令替换
运行Bash 错误陷阱和命令替换,bash,shell,Bash,Shell,运行test.sh: #!/bin/bash set -eE trap "echo 'in trap'" ERR var=$(bad_command) #!/bin/bash set -eE trap "echo 'in trap'" ERR echo $(bad_command) 输出为: ./test.sh: line 7: bad_command: command not found in trap ./test2.sh: line 8: bad_command: command n
test.sh
:
#!/bin/bash
set -eE
trap "echo 'in trap'" ERR
var=$(bad_command)
#!/bin/bash
set -eE
trap "echo 'in trap'" ERR
echo $(bad_command)
输出为:
./test.sh: line 7: bad_command: command not found
in trap
./test2.sh: line 8: bad_command: command not found
# line with whitespace printed
运行test2.sh
:
#!/bin/bash
set -eE
trap "echo 'in trap'" ERR
var=$(bad_command)
#!/bin/bash
set -eE
trap "echo 'in trap'" ERR
echo $(bad_command)
输出为:
./test.sh: line 7: bad_command: command not found
in trap
./test2.sh: line 8: bad_command: command not found
# line with whitespace printed
为什么在test2.sh
中没有触发陷阱?不同之处仅在于var=$(badcommand)
和echo$(badcommand)
将不正确的退出代码设置到shell。第二种情况很明显,echo
没有设置不正确的退出代码,因为它是一个单独运行的进程,能够根据成功/失败设置自己的代码。由于echo
似乎已正确退出,但它没有任何打印输出,因此它向shell打印了一个代码0
,从而掩盖了命令替换导致的命令未找到
错误
您只需尝试在shell中运行,而不使用set-e
和定义的陷阱
var=$(badcommand); echo $?
bash: badcommand: command not found...
127
echo $(badcommand); echo $?
bash: badcommand: command not found...
0
第一个触发陷阱,下一个不触发。相关:。在shell中的大多数位置,退出状态等于执行的最后一个命令。因此,在
echo$(bad_command)
中执行的最后一个命令是echo
,命令成功。没有理由去陷阱。