我试图将 stdout 和 stderr 中的所有内容记录到日志文件中,并仍然保留控制台。为此,我只是附加:|& tee -a log_file.log
对每一个命令。
但是,如果脚本期间发生任何错误,我还想运行自定义命令。为此,我在脚本的开头添加了以下内容:trap "echo Non-zero exit code detected" ERR
.
问题是通过使用管道运算符,陷阱中的回显不再执行。
脚本 1,不带管道:
$cat test.sh
#!/bin/bash
trap "echo Non-zero exit code detected!" ERR
function fail_please()
{
echo "Returning non-zero exit code!"
return 1
}
fail_please
输出1:
$ ./test.sh
Returning non-zero exit code!
Non-zero exit code detected!
脚本 2,带管道:
$ cat test.sh
#!/bin/bash
trap "echo Non-zero exit code detected!" ERR
function fail_please()
{
echo "Returning non-zero exit code!"
return 1
}
fail_please |& tee log_file.log
输出2:
$ ./test.sh
Returning non-zero exit code!
$ cat log_file.log
Returning non-zero exit code!
在输出 2 中,消息“检测到非零退出代码!”不见了。知道为什么吗?
谢谢!
The ERR
陷阱针对“简单命令”触发管道不是简单命令。
它可能会触发整个管道的结果(我不确定),并且您可能可以通过设置来获得更接近您想要的结果pipefail
.
(注意:这是人们经常不推荐使用的原因之一set -e
因为它有这样令人惊讶的细节。)
原因pipefail
工作原理是,通常管道的返回状态是最后一个命令的返回,但是pipefail
它成为最后一个失败命令的返回状态。
管道的返回状态是最后一个命令的退出状态,
除非启用了 pipelinefail 选项。如果启用了 pipelinefail,则
管道的返回状态是最后一个(最右边)命令的值
以非零状态退出,如果所有命令成功退出则为零
完全。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)