幾天前,我的實驗室的服務器遭受了嚴重的崩潰,當我們的一名實習生意外複製粘貼此代碼bash
試圖刪除node.js.大括號內擴展導致奇怪的行爲
$ rm -rfv /usr/{bin/node,lib/node,share/man /*/node.*};
他們嘗試了brace expansion列出了目錄中刪除,但是目錄分隔符(/
)之間的通知空間。這最終刪除了我們服務器上的所有內容,因爲它們應用了sudo
。 我在我的虛擬機上試過這個命令,並確認它與rm -rf /
非常相當。
我對bash
解釋陳述的方式感到困惑。當我嘗試創建一個簡單的,非破壞性的命令來做類似的事情時(空間起分隔符的作用來擴展),我似乎無法解決這個問題。我嘗試的第一個命令,而是for
循環在bash:
$ for f in /usr/{bin/node,lib/node,share/man /*/node.*}; do echo $f; done
其列在node.js中和的目錄部分內容/
。這應該證實這不是rm
中的特殊功能。
但是當我嘗試這樣的事:
$ for f in {a,b c,d e}; echo $f
它導致近echo
語法錯誤,我希望A到E,每次在一行字母。
我做了一些研究,但找不到解釋這種行爲的任何事情。 有人能告訴我,在第一個命令中,bash
是如何解釋這個命令的?
p.s.我發現在zsh
'for
循環測試'版本不起作用。儘管如此,從未嘗試過真正的'rm
測試'。我很害怕。