Section 2.1: Env shebang

可执行文件中的 env 通过使用在 $PATH 环境变量中找到的 bash 可执行文件的路径,脚本文件的第一行必须用参数 bash 标明 env 可执行文件的绝对路径:

#!/usr/bin/env bash

只有像这样直接启动脚本时,才会解析和使用 Shebang 中的 env 路径:

script.sh

脚本必须有执行权限。

当 bash 解释器被明确指示执行脚本时,shebang 会被忽略:

bash script.sh

Section 2.2: 指明 shebang

要使用 bash 解释器执行脚本文件,脚本文件的第一行必须指明要使用的 bash 可执行文件的绝对路径:

#!/bin/bash

只有像这样直接启动脚本时,才会解析并使用 Shebang 中的 bash 路径:

./script.sh

脚本必须有执行权限。

当 bash 解释器被明确指示执行脚本时,shebang 会被忽略:

bash script.sh

Section 2.3: 其他 shebangs

内核可以识别两种程序。二进制程序由 ELF(ExtenableLoadableFormat,可扩展加载格式)头文件识别,通常由编译器生成。第二种是任何类型的脚本。

如果文件的第一行以 #! 开头,那么下一个字符串必须是解释器的路径名。如果内核读到这一行,它就会调用以该路径名命名的解释器,并将这一行中下面的所有单词作为解释器的参数。

如果没有名为 “something ”或 “wrong ”的文件:

#!/bin/bash something wrong
echo "This line never gets printed"

bash 试图执行参数 “something wrong”,但该参数并不存在。脚本文件的名称也被添加进来。

要清楚地看到这一点,请使用 echo shebang:

#"/bin/echo something wrong
# and now call this script named "thisscript" like so:
# thisscript one two
# the output will be:
something wrong ./thisscript one two

一些程序(如 awk)使用这种技术来运行驻留在磁盘文件中的较长脚本。