假设我有一个管道
reader | processor | writer
。
似乎默认情况下,如果processor
或writer
在最佳情况下失败,管道只有在读取器尝试将数据发送到处理器后才会失败。
如果任何阶段失败,我需要整个管道立即失败。set -eo pipefail
没有帮助。
如果没有一些丑陋的解决方法,这可能吗?看起来这是很自然的事情,应该是可能的。
我举过一个例子。
==> script <==
#! /usr/bin/env bash
set -eo pipefail
trap "exit 1" ERR
./read | ./process | ./write
==> read <==
#! /usr/bin/env bash
seq 10 |
while read line; do
>&2 echo echoing $line
echo $line
sleep 2
done
==> process <==
count=0
while read line; do
echo processing $line
count=$((count+1))
if [[ $count == 1 ]]; then
>&2 echo exiting...
exit 1
fi
done
==> write <==
#! /usr/bin/env bash
while read line; do
echo $line
done
运行这个给出
echoing 1
exiting...
processing 1
echoing 2
这表明脚本在第二行得到回显之前不会结束。