我正在阅读“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 系统)上找到的最有可能的替代品?
我怀疑他们稍后可能还会
awk
在他们的代码中使用该变量,例如"$awk" 'script' file
,否则他们应该刚刚编写if ! type -p gawk awk >/dev/null 2>&1; then ...error...
. 如果他们使用该变量,他们将使用 gawk 或其他 awk,以他们的 PATH 中的第一个为准,如果没有它,他们可能会编写awk 'script' file
并可能在他们的 PATH 中更早地错过一个 gawk。啊,看起来是正确的,如果你多看一点他们的代码:
因此,他们真正想做的是在他们的 PATH 中找到 awk 或 gawk 的第一个版本并使用它,如果两者都不存在,则恕我直言,这更像是一种防御性的事后思考。
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、Android和数百个版本的操作系统中使用。都是*nix。另外:例如 Windows是的,甚至 Windows 也有可用的 unix 层。而且,是的,GNU awk 是 *nix 系统中最常见的 awk 风格。而且,是的,Windows 是为数不多的非 *nix 系统的操作系统之一。
可能未安装的原因
awk
是因为某些系统开发人员可能决定安装nawk
(或任何其他可执行文件)作为 的“最佳替代品”awk
,即使相似,也与awk
(andgawk
) 存在差异,这可能会破坏开发人员rbenv
所写的内容.¹请不要误入歧途,说 Linux只是一个内核。通常所说的 Linux 是一个由 Linus 开发的内核和一组开源用户工具的操作系统,一般来自 GNU。