使用Linux或者unix系统的同学可能都对#!这个符号并不陌生,但是你真的了解它吗?

Shebang这个符号通常在Unix系统的脚本中第一行开头中写到,它指明了执行这个脚本文件的解释程序。

1. 如果脚本文件中没有#!这一行,那么它执行时会默认用当前Shell去解释这个脚本(即:$SHELL环境变量)。

2. 如果#!之后的解释程序是一个可执行文件,那么执行这个脚本时,它就会把文件名及其参数一起作为参数传给那个解释程序去执行。

如果#!指定的解释程序不是一个可执行文件,那么指定的解释程序会被忽略,转而交给当前的SHELL去执行这个脚本。

5. 当然,如果你使用"bash test.sh"这样的命令来执行脚本,那么#!这一行将会被忽略掉,解释器当然是用命令行中显式指定的bash。

Linux kernel编译生成的版本多一个加号“+”

3. 如果#!指定的解释程序不是一个可执行文件,那么指定的解释程序会被忽略,转而交给当前的SHELL去执行这个脚本。

这是否矛盾呢?

不是很矛盾,不过我的语言没组织的好,我重新组织了一下;这两句话,调换了一下位置。

在如果加上可执行权限给error_intercept.log文件,那么上面这个脚本是可以正常执行的(交给$SHELL来执行了);如果error_intercept.log文件连执行权限都没有,那么就是会报错“bad interpreter: Permission denied”。