原文地址 https://en.wikipedia.org/wiki/Shebang_(Unix)
shebang 来自英文缩写sharp bang, sharp 表示 # , bang 表示 !
如果一个名为 path/to/script 的脚本,在首行包含 #!/bin/sh
这一句话,那么程序加载器就会运行 /bin/sh
,并把脚本名 path/to/script 作为参数,类似与在命令行中运行:
/bin/sh path/to/script
shebang的语法:
#!interpreter [optional-arg]
其中,interpreter 是一个可执行程序的绝对路径名。
#! 后面可以跟空格。
可选参数只能一个。
shebang的作用:
允许把脚本文件当作命令来使用。一个例子:
一个脚本的名字为 some/path/to/foo
其首行为 #!/bin/sh -x
带两个参数来运行这个脚本 some/path/to/foo bar baz
此时,相当与在命令行中输入 /bin/sh -x some/path/to/foo bar baz
运行时,脚本中的每一个命令都会带上这两个参数,并且首行会被当作注释略过。
注意:不是所有的解释器都会略过首行,例如:
#!/bin/cat Hello world!
shebang移植的时候要注意:
不同版本的linux对于解释器的安装位置可能不同,例如 python, 有些系统会安装在 /usr/bin/python ,而有一些系统会安装在 /usr/local/bin/python ,当从别的电脑拿到脚本的时候,要检查一下,解释器的位置是否不同。对于这种问题,有一个预防方法:
#!/usr/bin/env sh
因为大部分系统都会有 env 程序,当它调用的时候,会在 PATH变量给出的路径中进行查找 sh, 并运行第一个找到的 sh
如果上面的调用含有参数,例如
#!/usr/bin/env python -c
有一些系统会出现错误,它们会把 python -c 作为一个整体参数给 env 去查找,这时候就会找不到,Cygwin系统中就会出现这种情况。
还有一种常见问题,就是在 windows 中编辑的shebang,会在首行末尾出现回车符号。一些系统会因此出现错误信息。