经常看到:
#!/bin/bash
or
#!/usr/bin/env bash
在编写或阅读 Bash 脚本时,shebang 通常作为第一行出现。Shebang 以 #!
字符开头,后面跟着 bash 或其他你选择的解释器的路径。让我们来看看在 Linux 和 Unix Bash 脚本中的 shebang 是什么。
什么是 bash shebang?
Bash shebang 是一种在脚本文件的第一行指定解释器的方式,以确保脚本在正确的环境中运行。具体来说,它是一个以 #!
开头的标记,后面跟着解释器的完整路径。对于 Bash 脚本,shebang 通常写作 #!/bin/bash
。
详细解释:
- Shebang (
#!
): 这是一个特殊的字符序列,用于告诉操作系统该脚本应该由哪个解释器来执行。 - 解释器路径:
#!/bin/bash
指定了 Bash 解释器的路径。在不同的系统中,解释器的路径可能不同,因此需要使用系统上实际的解释器路径。
示例:
#!/bin/bash echo "Hello, world!"
在这个例子中,#!/bin/bash
告诉系统使用 /bin/bash
作为解释器来运行脚本。即使脚本在其他 shell 环境中被调用,系统也会使用指定的 Bash 解释器来执行脚本。
为什么使用 Bash Shebang:
- 确保一致性: 使用 shebang 确保脚本在不同环境中都能使用相同的解释器运行。
- 兼容性: 不同的解释器可能有不同的语法和功能,指定 shebang 可以避免由于解释器不同而导致的兼容性问题。
- 简化运行: 脚本可以直接执行,而不需要显式指定解释器。例如,你可以通过
./script.sh
直接运行脚本,而不需要先调用bash script.sh
。
总之,Bash shebang 是脚本中指定解释器的一种标准方式,使得脚本在指定的解释器下运行,从而确保脚本的兼容性和一致性。
你可以在 shebang 字符后添加参数,这是可选的。请确保解释器是指向二进制文件的完整路径。
例如: /bin/bash
.
语法
The syntax is:
#!/path/to/interpreter [arguments]
#!/path/to/interpreter -arg1 -arg2
使用 #!
启动脚本
这被称为 shebang 或 “bang” 行,它实际上是指向 Bash 解释器的绝对路径。它由一个数字符号(#
)和一个感叹号字符(!
)组成,后面跟着解释器的完整路径,例如 /bin/bash
。在 Linux 中,所有脚本都使用第一行指定的解释器来执行。
几乎所有的 Bash 脚本通常以 #!/bin/bash
开头(假设 Bash 安装在 /bin
目录下)。这确保了即使在其他 shell 中执行脚本时,也会使用 Bash 来解释该脚本。
shebang 由 Dennis Ritchie 在贝尔实验室开发的 Unix 第七版到第八版之间引入。后来,它也被添加到了伯克利的 BSD 系统中。
优点
- 使 shell 脚本更像实际的可执行文件,因为它们可以成为 ‘exec’ 的目标。
- 如果在脚本运行时使用
ps
查看进程状态,会显示脚本的实际名称,而不是 ‘sh’ 或 ‘bash’。同样,系统统计也基于实际名称进行。 - Shell 脚本可以设置用户 ID(set-user-ID)。
- 使用其他 shell 更加简单。例如,如果你喜欢 Berkeley csh,就无需担心哪个 shell 来解释文件。
- 它可以让其他解释器更顺畅地融入系统。
忽略解释器行(shebang)
如果你没有指定解释器行,默认情况下通常会使用 /bin/sh
。但是,建议你在 Bash 脚本中设置 #!/bin/bash
行。
在命令行上是可以覆盖 shebang 的。例如,如果你的 shell 脚本以 #!/bin/ksh
作为 shebang 开头,但你希望以 bash 运行它,则可以这样执行:
bash your-script.ksh ## or ## bash /path/to/your-script.ksh
尽管你可以覆盖和忽略脚本中设置的默认 shebang,但这样做可能会导致意外的行为,因此在覆盖 shebang 行时需要小心。不同的 shell 解释器可能有不同的语法和功能,覆盖 shebang 可能导致脚本在不同环境下表现不一致,或者出现意外的错误。