[英]Why does bash suppress stdout when exit 0 in ERR trap?
我正在尝试在bash中设置一个ERR陷阱并注意到一些奇怪的行为。 如果退出代码为0
,当我运行此脚本时,Bash似乎不会将我的echo
命令输出到控制台,但是,如果退出代码非零,则输出文本。 这是bash中的一个错误吗? 或者对此有一些解释?
./testing.sh:
#!/bin/bash
set -eE
handleerror() {
echo "TEST"
exit 0
}
trap "handleerror" ERR
OUTPUT=$(mkdir test/test 2>&1)
如果我运行上面的脚本,它什么都不输出。 如果我将exit 0
行更改为exit 1
,我会看到以下内容:
> ./testing.sh
TEST
以供参考:
> bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.
简答:输出没有被抑制; 它被命令替换捕获。 更改handleerror
的退出状态handleerror
更改它被调用的次数:一次在命令替换内,一次在外部 。 运行bash -x testing.sh
来查看差异。
您必须考虑何时实际调用handlerror
。 mkdir
的失败会触发调用,并且由于在命令替换中调用了handleerror
,因此会捕获其输出并将其分配给OUTPUT
。 如果你在脚本的末尾添加echo "$OUTPUT"
,你会看到
mkdir: test: No such file or directory
TEST
作为脚本的输出。 执行此行是因为handleerror
的0退出状态阻止set -e
提前退出脚本。
现在,将exit 0
更改为exit 1
。 序列开始相同: mkdir
失败, handleerror
,并通过命令替换捕获其输出。 但是,现在handleerror
本身的退出状态为1,这使得命令替换的退出状态以及赋值语句1也是如此。 这样做有两件事:它导致set -e
在echo "$OUTPUT"
运行之前中止脚本,并导致handleerror
第二次运行。 现在当你运行脚本时,你所看到的就是
TEST
由第二次调用handleerror
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.