この問題は長年私を悩ませてきました。正しい方向へのナッジのためのjilliagreに感謝します。
私のLinuxボックスでは、質問を少し言い直しますが、これは予想通りに終了します:
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
です。そのため、ここには「10」と呼ばれる人為的なスクリプトがあります。
#!/bin/bash
i=0
while true; do
i=`expr $i + 1`
echo "$i" | grep '0$' | cat || exit
done
として実行すると、これは適切に終了しますtens | head
。ああ、助かった。