为什么需要在这个“bash”脚本中检查“awk”?

为什么需要在这个“bash”脚本中检查“awk”?

我正在阅读“rbenv”Ruby 版本管理器的开源代码,我看到该库的命令之一检查是否gawkawk安装

  awk="$(type -p gawk awk 2>/dev/null | head -n1)"
  if [ -z "$awk" ]; then
    echo "rbenv: cannot find awk" >&2
    return 1
  fi

但我还在bash文件的最顶部看到了一个 shebang:

#!/usr/bin/env bash

awk起初我认为如果 shebang 保证我们在脚本中运行,我们应该能够假设我们可以运行bash,但我随后发现这awk是一个 UNIX 命令,而不是 shell 命令,并且我们可能正在运行这个脚本非 UNIX 系统(例如 Windows)上的文件。从这个链接,我推断这是非 UNIX 系统gawk最常见的风格。awk

我是否正确,我们不能假设已awk安装的原因是因为它是一个 UNIX 命令,而我们可能不在 UNIX 机器上运行?我们之所以还要检查,是gawk因为它是我们期望在未awk安装的系统(即非 UNIX 系统)上找到的最有可能的替代品吗?

答案1

awk我怀疑他们稍后可能还会在代码中使用该变量,例如"$awk" 'script' file,否则他们应该只编写if ! type -p gawk awk >/dev/null 2>&1; then ...error....如果他们使用该变量,他们将使用 gawk 或其他 awk,以他们的 PATH 中的第一个为准,如果没有它,他们可能会编写awk 'script' file并可能错过 PATH 中较早的 gawk。

啊,看起来是对的,如果你再多看一点他们的代码

  awk="$(type -p gawk awk 2>/dev/null | head -n1)"
  if [ -z "$awk" ]; then
    echo "rbenv: cannot find awk" >&2
    return 1
  fi

  # shellcheck disable=SC2016
  "$awk" '
    /^Summary:/ {
      summary = substr($0, 10)
      next
    }

所以他们真正想做的是在他们的 PATH 中找到 awk 或 gawk 的第一个版本并使用它,如果两者都不存在,则失败是恕我直言,更多的是一种防御性的事后想法。

答案2

bash 和 awk(或 gawk)之间没有固定的关系,除了两者都是可执行程序,可能存在于某个PATH路径中并且都是开源、免费且由 GNU 开发的。

GNU 可执行文件在 UNIX 系统中可以完全有效且可用。在 [Solaris 系统中我通常使用 bash (操作系统给出的默认列表中的多次), 没问题。并且 bash 符合大多数 POSIX 要求。例如:MacOS 使用 bash 获得 POSIX 认证。

Linux 是一个努力遵守 UNIX 哲学的操作系统。 GNU 被定义为的唯一原因GNU is not Unix是为了明确 Linux 是非专有

你说:发现 awk 是一个 UNIX 命令: 是的。它也是一个 Linux 命令。并且在Linux中使用,在安卓中,并在超过数百个版本操作系统。一切都是*nix。还:比如Windows是的,甚至 Windows 也有可用的 Unix 层。而且,GNU awk 是 *nix 系统中最常见的 awk 风格。是的,Windows 是极少数非 *nix 系统的操作系统之一。

可能无法安装的原因awk是因为某些系统开发人员可能决定安装nawk(或任何其他可执行文件)作为 的“最佳替代品” ,即使相似,它也与(和)awk存在差异,这可能会破坏开发人员编写的内容。awkgawkrbenv

1请不要陷入这样的转移注意力的说法:Linux只是一个内核。一般所说的Linux是一个操作系统,其内核由Linus开发,并且有一组开源用户工具,通常来自GNU。

相关内容