设置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中是否有类似的选项?
答案 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!'