パイプラインでデータがどのように流れるのか理解していないので、誰かがそこで何が起こっているのかを明確にしたいと思っています。
コマンドのパイプラインは、ファイル(テキスト、文字列の配列)を1行ずつ処理します。(各コマンド自体が行ごとに機能する場合。)テキストの各行がパイプラインを通過する場合、コマンドは前の入力が入力全体の処理を完了するまで待機しません。
しかし、そうではないようです。
これがテスト例です。テキストのいくつかの行があります。それらを大文字にして、各行を2回繰り返します。私はそうしcat text | tr '[:lower:]' '[:upper:]' | sed 'p'
ます。
プロセスを追跡するために、「インタラクティブ」に実行できますcat
。入力ファイル名をスキップします。パイプラインの各部分は、行ごとに実行されます。
$ cat | tr '[:lower:]' '[:upper:]'
alkjsd
ALKJSD
sdkj
SDKJ
$ cat | sed 'p'
line1
line1
line1
line 2
line 2
line 2
しかし、完全なパイプラインは、入力が完了するのを待ってからEOF
結果を出力するだけです。
$ cat | tr '[:lower:]' '[:upper:]' | sed 'p'
I am writing...
keep writing...
now ctrl-D
I AM WRITING...
I AM WRITING...
KEEP WRITING...
KEEP WRITING...
NOW CTRL-D
NOW CTRL-D
そうなるはずですか?なぜ行ごとではないのですか?
tr
、stdinが閉じる前sed
からプロセス行を実行するcat
cat
stdinが閉じるまでバッファリングします。