如果管道的任何阶段失败,如何使管道立即失败

如果管道的任何阶段失败,如何使管道立即失败

假设我有一个管道

reader | processor | writer

似乎默认情况下,如果processorwriter在最佳情况下失败,管道只有在读取器尝试将数据发送到处理器后才会失败。

如果任何阶段失败,我需要整个管道立即失败。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

这表明脚本在第二行得到回显之前不会结束。

相关内容