bash のフォーク爆弾に関連する質問がいくつかあります:(){ :|: & };:
が、回答を確認しても、1 つの関数が次の関数にパイプされるときに爆弾のこの部分が正確に何をしているのかがわかりません。基本的には次の部分です:|:
。
これまでのところ、パイプ記号は、最初のコマンドの標準出力を 2 番目のコマンドの標準入力に接続することによって 2 つのコマンドを接続します (例: echo "Turkeys will Domine the world" | sed 's/s//')。
しかし、最初の関数が標準出力を介して何をプッシュし、それが 2 番目の関数にプッシュされるのかはわかりません。結局のところ、関数内では戻り値が定義されていないので、冒頭の男性の胃が空の場合、ムカデ人間を介して何が移動しているのでしょうか。
答え1
簡単に答えると、何もないです。
プロセスが STDIN に何も入力しない場合でも、パイプでそのプロセスに渡すことができます。同様に、STDOUT に何も出力しないプロセスからパイプで渡すこともできます。実質的には、2 番目のプロセスに 1 つの EOF インジケーターをパイプで渡すだけで、そのインジケーターは無視されます。パイプを使用した構成は、単に「すべてのプロセスがさらに 2 つ開始する」というテーマのバリエーションです。この fork bomb は次のようにも記述できます (実際に記述される場合もあります)。
:(){ :&:; }; :
最初の再帰呼び出しがすぐにバックグラウンドで実行され、その後 2 番目の呼び出しが行われます。
一般的に、はい、パイプ シンボル ( |
) は、まさにあなたが言及したとおり、最初のプロセスの STDOUT を 2 番目のプロセスの STDIN に接続するために使用されます。パイプを通過するのは単一の EOF インジケーターだけであるにもかかわらず、ここでも同じことが行われています。