無制限に出力したいコマンドが特定の量の入力を待つ別のコマンドにパイプされたときに終了時をどのように知ることができますか?

無制限に出力したいコマンドが特定の量の入力を待つ別のコマンドにパイプされたときに終了時をどのように知ることができますか?

Bashでパイプがどのように機能するのか混乱しています。ランダムな文字列ジェネレータを例に挙げます。

tr -dc 'A-Z0-9' </dev/urandom

生成されたtrプロセスは次を読みます。/dev/urandom無期限/dev/urandom何かが邪魔になるまで出力を提供します。今これを受けてください:

tr -dc 'A-Z0-9' </dev/urandom | fold -w 8 | head -n 1

一見不確実に見える大文字の英数字の最初の行をすぐに出力します。各行は8つの記号に縮小されます。つまり、ランダムに8つの大文字の英数字が生成されます。視点から見ると予感がありますhead。最初の行を待ってからそれを待つ唯一のものです。標準入力

man bash説明する:

パイプラインの各コマンドは、別々のプロセス(つまりサブシェルで)で実行されます。

一体どうやってこれで十分だheadと言いfoldますかtrfoldプロセスに終了信号を送信しますかtr?または、head次のようなより複雑な行動を取ることもできます。/dev/標準入力foldのようなストリームを指します。/dev/標準出力head、ストリームを閉じるとfold終了信号を受け取りますか?このようなサブシェルがこのようなパイプに積み重なるとどうなりますか?

そして追加の質問:パイプに積み重ねられたときに正しく機能するには、bashスクリプトをどのように書く必要がありますか?

ベストアンサー1

おすすめ記事