Bash Shebang

如果您通过阅读其他人的代码来学习 Bash 脚本,您可能已经注意到脚本中的第一行以 #! 字符和 Bash 解释器的路径开头。

这个字符序列 (#!) 称为 shebang,用于告诉操作系统使用哪个解释器来解析文件的其余部分。

Shebang 解释器指令

Shebang 解释器指令采用以下形式:

#!解释器 [arguments]
  • 该指令必须是脚本中的第一行。
  • 该指令必须从 shebang #! 开始 
  • shebang 字符后的空格是可选的。
  • 解释器是一个二进制文件的完整路径(例如: /bin/sh/bin/bash) 。
  • 解释器参数是可选的。

例子:

  • #!/bin/bash- 用于 bash 解析文件。
  • #!/usr/bin/env perl- 使用 env 命令查找 perl 可执行文件的路径。
  • #!/usr/bin/python使用 python 二进制文件执行文件。

在 Bash 脚本中使用 Shebang

如果未指定 shebang 且运行 Bash 脚本的用户正在使用另一个 Shell ,则该 Shell 将使用该 Shell 使用的任何默认解释器来解析该脚本。例如,对于 bash 来说默认的解释器就是 bash ,对于 zsh 来说默认的解释器是 sh 。为了确保您的脚本始终使用 Bash 进行解释,您需要使用 shebang 指定可执行路径。

有两种方法可以使用 Shebang 指令并设置解释器。

  1. 使用 bash 二进制文件的绝对路径:

    #!/bin/bash
    
  2. 使用 env 实用程序:

    #!/usr/bin/env bash
    

使用第二种方法的优点是它将在用户的 $PATH  环境变量中搜索可执行文件 bash 。如果找到多个 bash 的路径,则脚本将使用第一个路径。

使用第一个选项向 Bash shell 供应添加选项时,将其传递给解释器。例如,要以调试模式运行脚本,您将使用 #!/bin/bash -x 。如果您正在使用该 env 方法,则需要使用 set 声明该选项。要启用调试模式,您可以在 shebang 行的最后添加 set -x

示例脚本

让我们使用 shebang 创建一个简单的脚本,打印出 “Hello,World” 。打开文本编辑器并粘贴以下行:

nano hello_world

文件: hello_world

#!/bin/bash

echo "Hello, World"

为了能够在不指定解释器的情况下从命令行运行脚本,您需要使文件可执行:

chmod +x hello_world

现在,如果您可以通过键入 ./ 后跟脚本名称来运行脚本:

./hello_world
Hello, World

覆盖 Shebang

如果由于某种原因想要覆盖 Shebang 行中的解释器集,则需要通过显式指定所需的 shell 来运行脚本。

例如,要想在 bash shell 运行在 Shebang 行中指定为 #!/bin/sh 的脚本文件,您可以键入:

bash hello_world

请注意,覆盖 shell 解释器不是一个好主意,因为它可能会导致脚本的意外行为。

结论

到目前为止,您应该很好地理解什么是 Shebang 以及如何在 Bash 脚本中使用它。