shell函數定義:為什麼左大括號後面有一個空格?

shell函數定義:為什麼左大括號後面有一個空格?

你可能知道這一點叉子炸彈

 :(){ :|:&};: #WARNING: harmful code

我想知道為什麼需要在左大括號後麵包含一個空格才能進行解析。

答案1

{}

          { list; }

將命令清單放在大括號之間會導致該清單在目前 shell 上下文中執行。沒有創建子shell。列表後面需要分號(或換行符號)。

除了創建子 shell 之外,由於歷史原因,這兩種結構之間還存在細微的差異。大括號是保留字,因此必須用空格或其他 shell 元字元將它們與清單分隔開。括號是運算符,即使它們沒有透過空格與列表分隔,也會被 shell 識別為單獨的標記。

//來源

答案2

我認為 @rush 可能在這裡給出了一個正確但具有誤導性的答案。叉子炸彈定義了功能稱為“ :”。直到最後的「」呼叫該函數後,才會執行大括號中的程式碼:。所以花括號為命令分組和大括號作為函數體語法相同但語意不同。
來自同一個文件正如@rush 所引用的:

請注意,由於歷史原因,在最常見的用法中,包圍函數主體的花括號必須透過空格或換行符號與主體分隔開。這是因為大括號是保留字,只有當它們透過空格或其他 shell 元字元與命令清單分隔時才會被辨識。此外,使用大括號時,清單必須以分號、「&」或換行符號終止。

相關內容