Ale*_*lds 10 python error-handling bash signals sigpipe
如果在管道的任何步骤中存在非零错误的情况下捕获到非零错误,则设置bash pipefail
选项(via set -o pipefail
)允许脚本失败.
但是,我们SIGPIPE
遇到了错误(错误代码141),其中数据被写入不再存在的管道.
有没有办法设置bash来忽略SIGPIPE
错误,或者是否有一种方法来编写一个错误处理程序来处理所有错误状态代码,比如0和141?
例如,在Python中,我们可以添加:
signal.signal(signal.SIGPIPE, signal.SIG_DFL)
Run Code Online (Sandbox Code Playgroud)
将默认行为应用于SIGPIPE
错误:忽略它们(参见http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-06/3823.html).
bash中是否有类似的选项?
该trap
命令允许您指定遇到信号时要运行的命令.要忽略信号,请传递空字符串:
trap '' PIPE
Run Code Online (Sandbox Code Playgroud)
我通过处理一个|| if ...
语句来吞下退出代码141,但仍然冒出任何其他错误,从而在每个管道的基础上处理这个问题:
pipe | that | fails || if [[ $? -eq 141 ]]; then true; else exit $?; fi
Run Code Online (Sandbox Code Playgroud)
我知道没有一种方法可以为整个脚本执行此操作。一般来说,这将是有风险的,因为无法知道子进程由于其他原因没有返回 141。
但是您可以在每个命令的基础上执行此操作。该||
运营商抑制由第一命令返回的任何错误,所以你可以这样做:
set -e -o pipefail
(cat /dev/urandom || true) | head -c 10 | base64
echo 'cat exited with SIGPIPE, but we still got here!'
Run Code Online (Sandbox Code Playgroud)