Shell pipe: Немедленное выйдите из строя при сбое одной команды

Я использую канал из нескольких команд в bash. Есть ли способ настроить bash для немедленного завершения всех команд во всем конвейере в случае сбоя одной из команд?

В моем случае первая команда, скажем, command1, выполняется некоторое время, пока не выдав какой-то вывод. Например, вы можете заменить command1 на (sleep 5 && echo "Hello").

Теперь command1 | false не удается выйти из строя через 5 секунд, но не сразу.

Такое поведение, по-видимому, имеет какое-то отношение к объему выходных данных, которые производит команда. Например, найти / | false возвращается немедленно.

В общем, интересно, почему bash так себя ведет.Может ли кто-нибудь представить себе ситуацию, когда полезен такой код, как command1 | несуществующая-команда не завершается сразу?

PS: Использование временных файлов для меня не вариант, так как промежуточные результаты, которые я перехожу, должны быть сохранены.

PPS: Ни set -e, ни set -o pipefail, по-видимому, не влияют на это явление.

23
задан Tobi 23 January 2012 в 18:46
поделиться