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