3

いくつかのコーディング実験(コーディングの質問に対するより短い答えを見つけようとしているときに行われた) は、いくつかの興味深い驚きにつながりました。

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

質問:

  1. whileループが停止しないのはなぜseq 2 | head -n 1ですか?

  2. リダイレクトされた入力が、パイプされた入力よりも多くの出力を生成するのはなぜですか?


上記のコードは、最近のLubuntudashでテストされました。とは両方ともcoreutils (バージョン8.25-2ubuntu2 ) パッケージからのものです。bashseqhead

(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

4

1 に答える 1