bashのフォーク爆弾についていくつかの質問がありますが、:(){ :|: & };:
答えを確認したときに、次の関数に1つの関数が挿入されたときに爆弾の対応する部分が正確に何をしているのかはまだわかりません。基本的にこの部分です:|:
。
これまで、パイプ表記が最初のコマンドの標準出力を2番目のコマンドの標準入力に接続して2つのコマンドを接続することを理解しました。 echo "Turkey will rule the world" | REVOLVE
しかし、最初の関数が標準出力を介してプッシュするものが何であるかはわかりません。これは2番目の関数にプッシュされます。結局のところ、関数の内部に戻り値が定義されていないので、最初に人の腹が空の場合はどうなりますか?
答え1
短い答え:何もありません。
プロセスが STDIN で何も許可しない場合でも、パイプで接続できます。同様に、STDOUT で何も生成しないプロセスでパイプを続行できます。効果的には、単一のEOFインジケータを2番目のプロセスにパイプするだけで無視されます。パイプを使ってビルドするのは、「各プロセスをさらに2つ起動する」テーマのバリエーションにすぎません。このフォーク爆弾は次のように書くこともできます。
:(){ :&:; }; :
最初の再帰呼び出しがすぐにバックグラウンドに切り替わると、2番目の呼び出しが行われます。
一般的にそうです。パイプ記号(|
)は、前述の操作を実行するために使用されます。最初のプロセスのSTDOUTを2番目のプロセスのSTDINに接続します。パイプを通過する唯一のものは単一のEOFマークですが、これがここで実行される操作です。