为什么下面的脚本会删除自己?

use*_*751 84 executable shell-script rm files shebang

如果您创建一个包含以下内容的可执行文件并运行它,它会自行删除。
这是如何运作的?

#!/bin/rm
Run Code Online (Sandbox Code Playgroud)

Ste*_*itt 112

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

/bin/rm scriptname
Run Code Online (Sandbox Code Playgroud)

删除脚本。(正如Stéphane Chazelas 指出的那样scriptname这里足以找到脚本——如果您指定了相对或绝对路径,PATH则按原样传入,否则在其中找到的任何路径都被预先考虑,如果您PATH包含该路径,则可能包括空字符串,并且脚本在当前目录中。你可以玩一个回声脚本——#!/bin/echo看看它是如何工作的。)

正如hobbs 所指出的,这意味着您的脚本实际上是一个rm脚本,而不是一个bash脚本——后者将以#!/bin/bash.

有关这在 Linux 中如何工作的详细信息,请参阅程序如何运行;该文章的评论提供了其他平台的详细信息。#!被称为shebang,您会通过搜索该术语找到大量信息(感谢Aaron的建议)。正如jlp指出的那样,您还会发现它被称为“磅爆炸”或“哈希爆炸”(#通常称为“磅”——在不使用的国家/地区£——或“哈希”,以及!“爆炸” )。维基百科有更多信息。

  • “#!”的其他名称 您可能会听到“砰砰”和“哈希砰”。有关详细信息,请参阅 https://en.wikipedia.org/wiki/Shebang_(Unix)。 (9认同)
  • @SwissFrank是的,有一场竞赛,是的,有加载器(在Linux内核中)支持传递打开的文件描述符,但[不适用于脚本](https://elixir.bootlin.com/linux/latest/源/fs/binfmt_script.c#L108)。事实上,如果脚本的竞争被修复,任意命令将不再像 shebangs 一样工作,并且 rm 也不能以这种方式使用。 (5认同)