脚本如何以#!/ bin / rm开头自行删除?

时间:2013-09-05 05:17:49

标签: linux bash shell unix

我正在阅读Chapter 2 of the Advanced Bash-Scripting Guide,我在footnote中了解了这个脚本:

#!/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遇到#!时,它会将(完全限定的?)路径传递给该文件,作为#!之后指定的程序的参数?

4 个答案:

答案 0 :(得分:3)

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

这就是shell脚本以#!/bin/sh或类似内容开头的原因,Python脚本以#!/usr/local/bin/python开头。

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

答案 1 :(得分:3)

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

#!/bin/sh 

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

/bin/sh foo

在你的例子中,shebang是:

#!/bin/rm

所以就像运行脚本一样:

/bin/rm foo

结果会自行删除。

答案 2 :(得分:2)

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

./path/to/script

指示程​​序加载程序运行shebang行中指定的路径,并将脚本路径作为参数。

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

执行它
./selfdeletingscript.sh

会导致执行以下操作:

/bin/rm ./selfdeletingscript.sh

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

/bin/sh ./selfdeletingscript.sh

bash ./selfdeletingscript.sh

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

答案 3 :(得分:1)

是的,bash将脚本作为

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

来自bash手册页

  

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