忽略Bash pipefail错误代码141

时间:2014-03-17 20:35:09

标签: python bash error-handling signals sigpipe

设置bash pipefail选项(通过set -o pipefail)允许脚本失败,如果在管道的任何步骤中出现非零错误时捕获到非零错误。

但是,我们遇到SIGPIPE错误(错误代码141),其中数据被写入不再存在的管道。

有没有办法将bash设置为忽略SIGPIPE错误,或者是否有办法编写错误处理程序来处理所有错误状态代码,例如0和141?

例如,在Python中,我们可以添加:

signal.signal(signal.SIGPIPE, signal.SIG_DFL) 

将默认行为应用于SIGPIPE错误:忽略它们(参见http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-06/3823.html)。

bash中是否有类似的选项?

3 个答案:

答案 0 :(得分:7)

trap命令允许您指定遇到信号时要运行的命令。要忽略信号,请传递空字符串:

trap '' PIPE

答案 1 :(得分:6)

我在每个管道的基础上处理这个问题,方法是使用|| if ...语句来吞下退出代码141,但仍然冒出任何其他错误:

pipe | that | fails || if [[ $? -eq 141 ]]; then true; else exit $?; fi

答案 2 :(得分:2)

我知道没有办法为整个脚本执行此操作。一般来说这会有风险,因为没有办法知道子进程因为不同的原因没有返回141.

但您可以在每个命令的基础上执行此操作。 ||运算符会抑制第一个命令返回的任何错误,因此您可以执行以下操作:

set -e -o pipefail
(cat /dev/urandom || true) | head -c 10 | base64
echo 'cat exited with SIGPIPE, but we still got here!'