6

我正在阅读Advanced Bash-Scripting Guide 的第 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 遇到 时#!,它会将该文件的(完全限定?)路径作为参数传递给在 之后指定的程序#!

4

4 回答 4

4

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

#!/bin/sh 

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

/bin/sh foo

在您的示例中,shebang 是:

#!/bin/rm

所以就像运行脚本一样:

/bin/rm foo

结果会自行删除。

于 2013-09-05T05:24:24.973 回答
3

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

这就是为什么 shell 脚本以#!/bin/sh或类似开头,而 Python 脚本以#!/usr/local/bin/python.

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

于 2013-09-05T05:24:03.183 回答
2

当脚本包含shebang并通过以下方式执行时:

./path/to/script

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

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

./selfdeletingscript.sh

将导致执行以下操作:

/bin/rm ./selfdeletingscript.sh

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

/bin/sh ./selfdeletingscript.sh

或者

bash ./selfdeletingscript.sh

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

于 2013-09-05T05:25:28.727 回答
1

是的,bash 将脚本执行为

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

从 bash 手册页

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

于 2013-09-05T05:31:59.220 回答