我是一名开发人员,所以我知道如何使用终端,但我从未真正深入研究过它。我可以编写 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 发行版都附带了这些程序的版本,但它们实际上不能被称为“操作系统的一部分” echo
,man
就像您将 %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
不仅仅是一个命令,它还是一个完整的脚本语言,用于模式搜索和文本处理。gawk
或mawk
(nawk
和原始的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
等等)都是单独的程序。man
ls
但 shell 本身也是一个单独的程序。shell 程序(ash
或bash
您的情况下)接收您的命令并尝试调用您指定的程序。因此,如果您ls
在提示符下键入,shell 将在其中查找PATH
是否有可执行文件被调用ls
,然后执行该程序。
你所说的“终端”也是一个程序。该程序可能是konsole
,xterm
或者许多其他终端程序。终端通常会启动你的交互式 shell,但这不是必需的。例如,尝试:
xterm -e 'ls ; sleep 3'
有终端,但没有交互式 shell。
pstree
将为您提供已启动程序的概述。尝试
pstree $PPID