我正在阅读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遇到#!
时,它会将(完全限定的?)路径传递给该文件,作为#!
之后指定的程序的参数?
答案 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在不处理这种可执行格式的操作系统上执行指定的解释器 - 自我。解释器的参数由跟随解释器名称的单个可选参数组成 程序的第一行,后跟程序名,后跟命令参数,如果有的话。