在這個 fork 炸彈中,透過管道連接到另一個函數的函數到底是什麼:(){ :|: & };:?

在這個 fork 炸彈中,透過管道連接到另一個函數的函數到底是什麼:(){ :|: & };:?

有幾個與 bash 的 fork 炸彈相關的問題:(){ :|: & };:,但是當我檢查答案時,我仍然無法弄清楚當一個函數通過管道進入下一個函數(基本上是這一部分)時,炸彈的部分到底在做什麼::|:

到目前為止,我了解到管道符號通過將第一個命令的標準輸出連接到第二個命令的標準輸入來連接兩個命令,例如 echo“土耳其將統治世界”| sed 's/s//'。

但我不明白第一個函數正在透過其標準輸出推送什麼,該標準輸出被推送到第二個函數中,畢竟函數內部沒有定義返回值,所以如果人在一開始肚子是空的嗎?

答案1

簡短的回答:沒什麼。

如果進程不接受 STDIN 上的任何內容,您仍然可以透過管道連接到它。同樣,您仍然可以從在 STDOUT 上不產生任何內容的進程進行管道傳輸。實際上,您只需將單個 EOF 指示器透過管道傳輸到第二個進程,該指示器就會被忽略。使用管道的建築只是「每道工序再開始兩道」主題的變體。這個叉子炸彈也可以(有時是)寫成:

:(){ :&:; }; :

如果第一個遞歸呼叫立即進入後台,則進行第二個呼叫。

一般來說,是的,管道符號 ( |) 用於完全執行您提到的操作 - 將第一個進程的 STDOUT 連接到第二個進程的 STDIN。這也是它在這裡所做的,儘管唯一通過該管道的就是單個 EOF 指示器。

相關內容