[转]一个空格引发的悲剧(详解如何看懂悲催的技术人员冷笑话)

aoyanfeng 发布于 2011/10/24 09:49
阅读 1K+
收藏 2
是这样子的——先来一点背景介绍,GitHub.com 这个网站,是目前最火的源代码托管网站及程序员社区,用它来托管和发布共享开源软件是免费的。来自世界各地的程序员(或公司)们喜欢在这个网站上发布自己 的项目源代码,也可以在这方便地获取、查看和评论别人的源代码。

在每次代码有更新的时候,用户还可以对这次更新的某个文件中所改动的某一行进行评论,也就是说类似某个同学问“这一行改动到底是什么意思啊”另一个热心的同学会向他解释清楚这样子。

但是说实话,我还一直没用、没注意到有谁会用,或者完全没去试过寻找这样对某行代码的评论,直到……这一个文件的出现【背景链接地址】,才有了可能是 GitHub 史上最强的一个代码评论贴。

【背景链接地址】 https://github.com/MrMEEE/bumblebee/commit/a047be85247755cdbe0acce6

关键在于这一行:
rm -rf /usr /lib/nvidia-current/xorg/xorg

解释一下,rm 表示 remove,在 Linux 下是删除文件或目录的命令,不能直接用在目录上,加 r 参数可以删除整个目录,而 f 参数代表 force,就是少废话能删的给我全删完。rm 接受的参数是 空格分隔的目录或文件名。

而大家请注意,看仔细。这一行代码,在 /usr 和 /lib 中间,有一个空格!!这意味着,运行了这行代码,就会删除你的 /usr 目录!!

而 /usr 目录是神马东西呢?可以吃吗?这就得先说说 Linux 下目录的表示和组织方式啦。Linux 下没有 C、D 盘这样的盘符,只有一个根目录,用反斜杠“/”表示。目录与硬盘分区的对应方式是挂载,某个硬盘分区可以挂到某一目录——不过首先得有一个分区挂在根目录 上,然后根目录下有文件夹,这些文件夹如果不挂载某分区,文件夹内的文件就保存到挂到根目录的这个分区的相应目录下;如果某文件夹挂载了某分区,原来此文 件夹下的文件就看不到了,这个文件夹就显示挂载上的分区里的文件了。

举例来说,访问 /a/b/c/d.txt 这个文件,Linux 操作系统会首先看 /a/b/c/ 有没有挂载某分区,如果是,就在此分区查找 /d.txt 文件;如果没有,那就看 /a/b/ 有么有挂载某分区,如果是,就在此分区查找 /c/d.txt;以此类推,直到查找挂载到根目录的分区的 /a/b/c/d.txt 文件,还找不到就是出现“文件未找到”错误。

这是 Linux 文件系统的表现方式,了解了这个,再来说文件的组织方式。Linux 会把程序分散来放到不同目录,比如说二进制可执行文件放到 /usr/bin,可执行文件需要调用的库文件会放到 /usr/lib 目录,一些其他资源(比如图片之类的)会放到 /usr/share 下,而配置文件放到 /etc 或者 /home/username 即用户文件夹。/home 目录类似 Windows 7 下的 C:\Users 目录,储存用户的个性化配置和用户的文档什么的。

说了那么多,总之就是,/usr 这个目录通常是用来存放系统中所有安装的应用程序的,包括一部分系统工具和几乎所有用户自己安装的程序。所以它的地位相当于 Windows 下的 C:\Windows + C:\Program Files,老实说,删了这两个文件夹,不就差不多相当于删除了 Windows 操作系统吗,相当于格式化掉 C: 盘。rm -rf /usr 这个命令对于 Linux 系统也是一样。懂了吧。这不是坑爹是什么。

接下来再说说什么时候会运行到这行代码吧。这行代码是写到 install.sh 文件里面的。故名思议,这是个安装脚本。所谓脚本的意思,就是说运行此文件,文件里的命令都会按顺序跑一遍,就像于演员把剧本念一遍一样。

于是,可以想象,有那么一个倒霉蛋,原本只是想安装这个软件,运行一遍 install.sh 安装脚本,就把自己系统文件夹给删了……而这一切的罪魁祸首,都是 /usr 和 /lib 中间的那一个空格,如果没这个空格,这个安装脚本就会按其原本的意图删除 rm -rf /usr/lib/nvidia-current/xorg/xorg 这个文件,加了空格就变成删除 /usr 和 /lib/nvidia-current/xorg/xorg 了。而且,这明明是用户自己进行的操作啊(自己要运行这个安装脚本嘛)。而且这样的安装脚本通常是配合 sudo 来运行的,因为一般来说安装程序需要系统管理员的权限(删除 /usr 也同样需要这个权限),sudo 就是一个让系统管理员灵魂附体的东西,在命令前加 sudo 就相当于是以系统管理员身份运行此命令。

好啦,现在各路防火墙、反病毒、系统保护软件纷纷露出哀怨的眼神:系统管理员要删,我也拦不住啊。
╮(╯▽╰)╭

PS:转载于 http://www.guokr.com/blog/47874/
加载中
0
Jackarain
Jackarain

所以我总觉得, linux的目录结构不好.
程序安装也是在/usr下, 系统的东东也基本上都在这下面...
而且混淆不清...

mark35
mark35
自己编译的程序都可以指定目录,一般是/usr/local下面
0
ddatsh
ddatsh
上次发过一次,标题叫什么  霸气外露的XX
0
君无畏
君无畏

引用来自“Jack.arain”的答案

所以我总觉得, linux的目录结构不好.
程序安装也是在/usr下, 系统的东东也基本上都在这下面...
而且混淆不清...

你可以安装软件到你喜欢的任意位置 .比如/home/username/xxxx 或者 /opt 里

Google Chrome一般默认会安装在  /opt 里.

一般的软件安装 都不是强制性的,除非在它的使用手册里明确指出必须安装到哪里.

0
君无畏
君无畏

引用来自“dd”的答案

上次发过一次,标题叫什么  霸气外露的XX
如果我没记错 应该是@小编辑 发的,而且还有若干图片
0
Jackarain
Jackarain

引用来自“君无畏”的答案

引用来自“Jack.arain”的答案

所以我总觉得, linux的目录结构不好.
程序安装也是在/usr下, 系统的东东也基本上都在这下面...
而且混淆不清...

你可以安装软件到你喜欢的任意位置 .比如/home/username/xxxx 或者 /opt 里

Google Chrome一般默认会安装在  /opt 里.

一般的软件安装 都不是强制性的,除非在它的使用手册里明确指出必须安装到哪里.

这种方法好像不用说吧, 我不是不知道.
问题是你每次真的都使用prefix去指定安装目录了吗?  
问题是你apt-get(或yum、emerge等)还会每次指定安装目录了吗?
问题是你确定你/usr或bin目录下的东西是一目了然的吗?

mark35
mark35
你咋不说windows下还能安装病毒程序呢
0
sniperBlank
sniperBlank
一个空格引发的血案。
0
君无畏
君无畏

引用来自“Jack.arain”的答案

引用来自“君无畏”的答案

引用来自“Jack.arain”的答案

所以我总觉得, linux的目录结构不好.
程序安装也是在/usr下, 系统的东东也基本上都在这下面...
而且混淆不清...

你可以安装软件到你喜欢的任意位置 .比如/home/username/xxxx 或者 /opt 里

Google Chrome一般默认会安装在  /opt 里.

一般的软件安装 都不是强制性的,除非在它的使用手册里明确指出必须安装到哪里.

这种方法好像不用说吧, 我不是不知道.
问题是你每次真的都使用prefix去指定安装目录了吗?  
问题是你apt-get(或yum、emerge等)还会每次指定安装目录了吗?
问题是你确定你/usr或bin目录下的东西是一目了然的吗?

看来,我不应该多说什么.但我还是想提醒下 "自己动手 丰衣足食".

而且我并不觉得多做一些操作而减少一些抱怨是件很麻烦的事.

 

ddatsh
ddatsh
@Jack.arain : 我虽然喜欢linux, 但我从不喜欢把它的缺点当优点来看+1
Jackarain
Jackarain
我虽然喜欢linux, 但我从不喜欢把它的缺点当优点来看, 我比较喜欢客观去看待这些东西. 如果是很普通的用户呢? 我相信感觉会比我更糟糕. 因为他安装了一个软件, 可能就根本不知道它到底安装到哪里了, 想知道也一时没办法...
Jackarain
Jackarain
确实可以自己动手, 我用gentoo, 我就喜欢什么都定制成自己喜欢的样子. 即便如此, 我还是不保证我的/usr下就是一目了然, 我也无法保证某个程序安装后, 到底添加了哪些文件, 除非我去阅读makefile或source file. 现在的/usr看来已经是一个大杂烩了, 并且是一种linux风俗了.
0
kkkkei
kkkkei

为什么你不用TAB补全。。。??

这是你的坏习惯造成,不怨人

0
jlmpp
jlmpp
不要老用root登陆,也可以避免这种错误。 
恋恋美食
恋恋美食
朋友,你没认真看。
0
mallon
mallon
Linux目录其实非常好管理,系统几个关键目录不要动,由发行版的包管理器管理,自己手工安装的软件都装在opt或者用户主目录中。
返回顶部
顶部