为什么以下脚本会删除自身?


84

如果创建具有以下内容的可执行文件并运行它,它将自动删除。
这是如何运作的?

#!/bin/rm


@DigitalTrauma呵呵,那是我看到这个时的第一个念头。

这不是关于rm,而是关于#!。这个问题的措词,如何做有任何可执行的脚本#!作品。
njzk2

1
您是怎么发现这一点的?
user1717828

1
这绝对是一个史诗般的问题。很遗憾,我只能投票一次。
Danila Kiver

Answers:


112

内核解释以开头的行,#!并使用它来运行脚本,并传入脚本名称。所以这最终运行

/bin/rm scriptname

删除脚本。(正如StéphaneChazelas 指出的scriptname这里足以找到脚本-如果您指定了相对或绝对路径,PATH则按原样传递,否则,将在其中找到的任何路径作为前缀,如果PATH包含的则为空字符串,并且该脚本位于当前目录中。您可以使用echo脚本#!/bin/echo-来查看其工作原理。)

正如hobbs所指出的,这意味着您的脚本实际上是rm脚本,而不是bash脚本-后者以开头#!/bin/bash

有关在Linux中如何运行的详细信息,请参见程序的运行方式。该文章的评论提供了其他平台的详细信息。#!称为Shebang,通过搜索该词您会发现很多信息(感谢Aaron的建议)。正如jlp所指出的,您还会发现它被称为“磅爆炸”或“哈希爆炸”(#在不使用的国家/地区通常称为“磅” £或“哈希”,又!称为“爆炸” )。维基百科有更多信息。


9
“#!”的其他名称 您可能会听到是“磅爆炸”和“哈希爆炸”。有关详细信息,请参见en.wikipedia.org/wiki/Shebang_(Unix)
jlp

@jlp磅砰?就像“花钱买东西”吗?嘿...

让我想起了' CrunchBang
Xen2050 '16

1
从技术上讲,to的参数rm将是脚本的路径,即该进程对execve()系统调用的第一个参数。通常情况下,如果你跑了脚本./scriptname,这将是./scriptname,如果你调用它scriptname,那将是/path/to/scriptname哪里/path/to是入口$PATH,其中该脚本被发现。通常,只有scriptname在您输入了空字符串$PATH并且以scriptnamescriptname在当前目录中调用了脚本的情况下,才会执行此操作。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.