Como fazer o pipeline falhar imediatamente se algum dos seus estágios falhar

0

Suponha que eu tenha um pipeline

reader | processor | writer .

Parece que, por padrão, se processor ou writer falharem no melhor dos casos, o pipeline falhará somente depois que o leitor tentar enviar dados ao processador.

Eu preciso que o pipeline inteiro falhe imediatamente se algum dos seus estágios falhar. set -eo pipefail não ajuda.

Isso é possível sem algumas soluções feias? Parece que uma coisa natural para fazer isso deveria ser possível.

Eu usei um exemplo.

==> 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

Rodando isso dá

echoing 1
exiting...
processing 1
echoing 2

O que torna óbvio que o script não está terminando até que a segunda linha seja reproduzida.

    
por user1685095 23.04.2018 / 18:43

0 respostas

Tags