一个脚本是如何以#开头的/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遇到#!时,它会将该文件的(完全限定?)路径作为#!之后指定的程序的参数?

假设脚本文件的名称是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在不处理此可执行文件格式的操作系统上执行指定的解释器自我。解释器的参数由一个可选参数组成,该参数位于程序的第一行,后面跟着程序名称,后面跟着命令参数(如果有的话)。

相关内容

  • 没有找到相关文章

最新更新