Linux 命令(grep、awk 等)是系统的一部分,还是 shell 的一部分?

Linux 命令(grep、awk 等)是系统的一部分,还是 shell 的一部分?

我是一名开发人员,所以我知道如何使用终端,但我从未真正深入研究过它。我可以编写 bash 脚本(尽管是初学者水平,不是我的专业领域),但现在我需要为工作了解一些东西。我有 2 个 docker 镜像(带有 busybox 和 ash 的 alpine 和带有 bash 的 ubuntu)。两者都有 awk - 一个运行 gawk,另一个运行 mawk,我需要运行同一个。

问题:

现在我开始疑惑 - gawk/mawk 是不是终端和/或或者它是操作系统? 不仅仅是 awk — 我猜还有其他命令,例如 grep、echo、man 等等,对吧?

答案1

其实都不是。

Shell 包含一些内置命令。这些命令很容易通过网络搜索找到,例如以下Bash 内置命令部分gnu网站 Bash 参考手册

grep、、、awk等不是内置程序,而是可执行二进制文件。虽然大多数 Linux 发行版都附带了这些程序的版本,但它们实际上不能被称为“操作系统的一部分” echoman就像您将 %WINDIR% 中的可执行文件称为 Windows 操作系统的一部分一样。它们只是标准工具。

从技术上讲,“Linux”并不是操作系统,它只是提供用户和硬件之间接口的内核。Debian、Ubuntu、Alpine、Gentoo……它们是“基于 Linux 的操作系统”,而“操作系统的一部分”则取决于发行版。例如,apt可以将其视为基于 Debian 的发行版的一部分,因为它是主要的 SW 安装/维护工具,但不是基于 RedHat 的 - 在那个场景中,等同于的是yum

which <cmd>您可以使用命令- 例如which grep返回找到包含二进制文件的目录/usr/bin/grep。通常,二进制文件位于bin和中sbin的子目录中。//usr/usr/local

awk不仅仅是一个命令,它还是一个完整的脚本语言,用于模式搜索和文本处理。gawkmawknawk和原始的awk)是awk解释器。 Baeldung 有一个很好的页面,解释了差异

BusyBox 是完全不同的 ghoti 工具。它是一个多调用二进制文件,可以代替许多不同的工具和实用程序,包括awk。因此,如果您检查/usr/bin/awk运行 BusyBox 的系统中实际有什么,您很可能会发现它是指向的符号链接/usr/bin/busybox

您无法真正busybox awk与完整的 GNU进行比较awk。 BusyBox 就像一把瑞士军刀,它只包含它所替换的原始二进制文件中可用选项的一小部分。除此之外, BusyBox 提供的工具和选项完全取决于所使用的版本。 您可以在以下位置找到可用的功能BusyBox 文档

例如gawk,如果您的两个系统都需要使用 ,则需要确保它在两个系统上都可用,并确保所有引用都awk指向gawk。如果您需要相同的版本在两者上都运行,您可能需要在至少一个系统上从源代码构建。

答案2

除了@Peregrino69 的回答之外:大多数命令(例如,grep等等)都是单独的程序。manls

但 shell 本身也是一个单独的程序。shell 程序(ashbash您的情况下)接收您的命令并尝试调用您指定的程序。因此,如果您ls在提示符下键入,shell 将在其中查找PATH是否有可执行文件被调用ls,然后执行该程序。

你所说的“终端”也是一个程序。该程序可能是konsolexterm或者许多其他终端程序。终端通常会启动你的交互式 shell,但这不是必需的。例如,尝试:

xterm -e 'ls ; sleep 3'

有终端,但没有交互式 shell。

pstree将为您提供已启动程序的概述。尝试

pstree $PPID

相关内容