Contents

在Linux脚本中使用Shebang

1. 概述

在本教程中,我们将看到如何使用 shebang (“#!”)来告诉我们的类 Unix 系统如何解释可执行文件。

2. 理论

当我们尝试运行一个可执行文件时,会调用execve 程序以用一个新进程替换当前进程(如果我们使用终端,则为bash shell)并决定应该如何完成。

如果我们尝试运行一个文本文件,execve期望文件的前两个字符是“#!” (阅读“shebang”或“hashbang”)后跟解释器的路径,该解释器将用于解释脚本的其余部分。

3. 编写Shell脚本

当我们编写 shell 脚本时,最常见的使用 shebang 的需求就出现了。

让我们编写一个简单的脚本来迎接用户:

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

“/bin/sh”实际上是sh (Shell 命令语言)的 sh 兼容实现的符号链接。

在大多数情况下,它会是*bash *(Bourne-Again SHell),但如果我们想要确保可移植性,我们应该使用符号链接。

另外,请记住,该脚本必须是可执行的才能正常工作。当我们创建一个新的脚本文件时,我们可以使用*chmod *命令使其可执行:

chmod +x name_of_the_file

4. 使用其他

我们可能希望使用与sh不同的解释器来编写易于执行的脚本——事实上,我们可以使用任何ELF 可执行文件。

例如,这是一个技术上正确(尽管可以说不是很有用)的脚本,它会在执行时自行打印:

#!/bin/cat
Hello World!

5.使用用户的PATH

在前面的示例中,我们使用了我们确定的程序位置,因为它们在类 Unix 系统中是标准的。

不幸的是,情况并非总是如此。但是,在这种情况下,有一个技巧可以帮助我们。

我们可以使用env 程序并将目标解释器的名称作为参数传递。然后env将在用户的 PATH 变量中查找解释器。

让我们再写一个“Hello world”脚本,这次使用 Node:

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