我正在阅读“rbenv”Ruby 版本管理器的开源代码,我看到该库的命令之一检查是否gawk
已awk
安装:
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
存在差异,这可能会破坏开发人员编写的内容。awk
gawk
rbenv
1请不要陷入这样的转移注意力的说法:Linux只是一个内核。一般所说的Linux是一个操作系统,其内核由Linus开发,并且有一组开源用户工具,通常来自GNU。