
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
ますかtr
?fold
プロセスに終了信号を送信しますかtr
?または、head
次のようなより複雑な行動を取ることもできます。/dev/標準入力fold
のようなストリームを指します。/dev/標準出力head
、ストリームを閉じるとfold
終了信号を受け取りますか?このようなサブシェルがこのようなパイプに積み重なるとどうなりますか?
そして追加の質問:パイプに積み重ねられたときに正しく機能するには、bashスクリプトをどのように書く必要がありますか?