几天前,我的实验室的服务器遭受了严重的崩溃,当我们的一名实习生意外复制粘贴此代码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
测试'。我很害怕。