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