Эта проблема беспокоила меня годами. Спасибо jilliagre за толчок в правильном направлении.
Немного переформулировав вопрос, на моем linux box это выходит как положено:
while true ; do echo "ok"; done | head
Но если я добавлю канал, он не выйдет, как ожидалось:
while true ; do echo "ok" | cat; done | head
Это расстраивало меня годами. Рассматривая ответ, написанный jilliagre, я придумал это замечательное исправление:
while true ; do echo "ok" | cat || exit; done | head
QED ...
Ну, не совсем. Вот что-то более сложное:
i=0
while true; do
i=`expr $i + 1`
echo "$i" | grep '0$' || exit
done | head
Это не работает правильно. Я добавил, || exitтак что он знает, как завершить работу рано, но самый первый echoне совпадает, grepтак что цикл завершается сразу. В этом случае вы действительно не заинтересованы в статусе выхода grep. Мой обходной путь - добавить еще один cat. Итак, вот надуманный сценарий под названием «десятки»:
#!/bin/bash
i=0
while true; do
i=`expr $i + 1`
echo "$i" | grep '0$' | cat || exit
done
Это правильно завершается при запуске как tens | head. Слава Богу.