Shell编程之Sha-Bang(#!)疑问
来源:
- http://www.cnblogs.com/Simon-xm/p/4337828.html
- https://segmentfault.com/q/1010000000680188
- https://en.wikipedia.org/wiki/Shebang_(Unix)
Q1:#! 的名字为什么叫Sha-Bang?
A1:Sha-Bang是Sharp和Bang的组合词,Sharp for #,Bang for ! 。
Q2:Sha-Bang(#!)是注释嘛?
A2:Sha-Bang不是注释,所在行的作用是告知该脚本使用的哪种命令解释器,并不是可有可无的。虽然很多情况下省略了Sha-Bang(#!)仍然能够运行脚本,这是由于系统在这种情况下是默认使用了当前命令行解释器的。
Q3:Sha-Bang(#!)的编写有什么规范?
A3:Sha-Bang必须位于脚本的第一行。如果不是在首行,则不起效,系统会使用默认的命令行解释器。
Q4:Sha-Bang(#!)在同一脚本下出现多次,会有问题吗?
A4:只有在首行的Sha-Bang会生效,其余的会被视为注释。
Q5:Python头部 #! /usr/bin/python 和 #! /usr/bin/env python的区别。
A5:使用 /usr/bin/python写法,表示写死了必须用/usr/bin/python目录下的python来执行脚本;使用 /usr/bin/env python 写法,表示声明的时候,会去找PATH中指定的第一个python来执行脚本。这对系统中有多版本python、虚拟环境都是很有意义的,有利于移植脚本到其他平台。
【注】解释器的默认安装路径在各种操作系统是不太一样的,有的是/bin/,有的是/usr/bin,甚至有可能是用户自定义的路径,使用env就基本上能够通用。虽然env可能在/bin/或者/usr/bin/中,但通常的情况是在这两个路径下都有env,或者其中一个是另一个的符号链接。