如何用#!/ bin / rm开头的脚本自己删除?

我正在阅读高级Bash脚本指南的第2章 ,我在脚注中阅读了这个脚本:

#!/bin/rm # Self-deleting script. # Nothing much seems to happen when you run this... except that the file disappears. WHATEVER=85 echo "This line will never print (betcha!)." exit $WHATEVER # Doesn't matter. The script will not exit here. # Try an echo $? after script termination. # You'll get a 0, not a 85. 

通常rm接受一个参数并删除那个文件。 在这里, rm不知何故地执行它正在执行的脚本。 这是否意味着当一个shell遇到#! ,它将(完全限定的?)path传递给该文件,作为在#!之后指定的程序的参数#!

假设脚本文件的名字是foo ,它以shebang开头:

 #!/bin/sh 

就好像你运行脚本一样,就像你运行它一样:

 /bin/sh foo 

在你的例子中,shebang是:

 #!/bin/rm 

所以就好像运行脚本一样:

 /bin/rm foo 

这在结果中删除自己。

是的,当你说“它传递(完全限定的?)路径作为在#!之后指定的程序的参数时,你完全正确”。

这就是为什么shell脚本以#!/bin/sh或类似的方式启动的原因,Python脚本以#!/usr/local/bin/python类的东西开始。

“shebang”这一行旨在为脚本运行解释器,但是可以指定任何可执行文件。

当一个脚本包含一个shebang并执行时说:

 ./path/to/script 

指示程序加载器以脚本路径作为参数运行shebang行中指定的路径。

在你的情况下,脚本包含#!/bin/rm作为第一行,并通过说明来执行它

 ./selfdeletingscript.sh 

会导致执行以下内容:

 /bin/rm ./selfdeletingscript.sh 

此外,您可能已经观察到,执行脚本说:

 /bin/sh ./selfdeletingscript.sh 

要么

 bash ./selfdeletingscript.sh 

不会删除它,因为您已经指定了解释器的路径。

是的,bash执行脚本

 /bin/rm <Name of script file> [Optional arguments] 

从bash手册页

如果程序是以#!开始的文件,则第一行的其余部分指定程序的解释器。 shell在不处理这种可执行格式的操作系统上执行指定的解释器。 解释器的参数由程序第一行解释器名称后面的单个可选参数组成,后跟程序名称,后跟命令参数(如果有的话)。