在 Linux 中,当我们准备运行一个可执行文件时,execve 程序会建立一个新的进程替代当前的进程(如终端下的 bash),同时决定如何完成这个执行任务。

当我们执行一个文本文件时,execve 需要文本文件的开头两个字符为 “#! 读作:shebang,同时跟随一个解释器的路径用来解释后续的脚本文本内容。

下面我们举例说明。

shell 脚本

最常用的就是在 shell 脚本中使用 shebang,下面是一个简单的示例:

#!/bin/sh
echo "Hello, ${USER}"

我们定义了此脚本的解释器为 /bin/sh,后续的脚本内容会通过此解释器来运行。

实际上 /bin/sh 是当前系统可执行 shell 命令的程序的软链接,大多数情况下它表示 bash,但为了不同系统的兼容性和安全性,我们直接使用此软链接来表示当前系统支持的 shell 可执行程序。

同时需要注意的是,可执行文本文件必须有执行权限,当创建一个新的脚本文件时,需要对其设置执行权限:

chmod +x test.sh

其他解释器

当然我们可以根据需要定义其他的解释器,而不仅仅是 sh。下面的示例我们将 cat 作为解释器,这样就会输出脚本本身的内容:

#!/bin/cat
Hello World!

调用 PATH

上面的示例中,我们定义的解释器的绝对路径,但是当我们不知道一个程序的明确的路径时,我们可以通过将解释器定义为 env 程序,并传递实际需要的解释器程序名称,env 会自动在当前用户 PATH 环境变量中查询程序的路径并作为解释器执行脚本。

下面我们通过 env 来查询 node 并作为解释器执行 node 脚本:

#!/usr/bin/env node
console.log('Hello world!');

以上就是对 shebang 的简单解释。

参考链接

Using Shebang #! in Linux Scripts

标签: none

添加新评论