Menu Close

Shebang

经常看到:

 #!/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 可能导致脚本在不同环境下表现不一致,或者出现意外的错误。

Entires个相关

除教程外,本网站大部分文章来自互联网,如果有内容冒犯到你,请联系我们删除!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Leave the field below empty!