いくつかのコーディング実験(コーディングの質問に対するより短い答えを見つけようとしているときに行われた) は、いくつかの興味深い驚きにつながりました。
seq 2 | while head -n 1 ; do : ; done
出力 ( Control-C を押すか、CPU サイクルを永遠に浪費します):
1
^C
同じですが、パイプされた入力の代わりにリダイレクトされた入力ファイルを使用します:
seq 2 > two
while head -n 1 ; do : ; done < two
出力 ( Control-C を押す):
1
2
^C
質問:
while
ループが停止しないのはなぜseq 2 | head -n 1
ですか?リダイレクトされた入力が、パイプされた入力よりも多くの出力を生成するのはなぜですか?
上記のコードは、最近のLubuntudash
でテストされました。とは両方ともcoreutils (バージョン8.25-2ubuntu2 ) パッケージからのものです。bash
seq
head
(Ctrl-C)を打たなければならないことを回避する方法:
timeout .1 sh -c "seq 2 > two ; while head -n 1 ; do : ; done < two"
1
2
timeout .1 sh -c "seq 2 | while head -n 1 ; do : ; done"
1