在Linux脚本中使用Shebang
Contents
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!');