我试图弄清楚 Linux 的不同组件以及它们如何协同工作,并且我有一个与术语相关的问题。终端运行 shell,通常是 Bash。还可以在终端中运行 Linux 命令(例如 ls、mkdir 和 cp)。但后来我了解到并非所有 Linux 命令都是 bash(或 shell)的一部分。这是否意味着终端不只运行 shell?
答案1
终端不运行任何东西:它只是用户界面。或者,对于操作系统运行的进程来说,它是一种特殊类型的“文件”,可以使用read()
和write()
系统调用进行读取和写入。 (加上一些特定于终端的特殊的。)
当您通过(例如)SSH 登录时,SSH 服务器会启动 shell 并为其提供连接到终端(代表设备节点)的文件描述符。如果您通过 GUI 登录并启动终端模拟器,会发生几乎相同的情况,只需将 SSH 服务器替换为终端模拟器即可。
无论您采用哪种方式,shell 现在都可以将提示打印到终端并从终端读取命令,并启动外部程序(例如ls
或git
其他),这些程序也可以访问终端。或者它可以类似地运行内置命令(read
,echo
)。
(请注意,您也可以运行非交互式 shell 会话。运行 shell 脚本几乎相同,shell 的输入来自文件而不是终端。无论 shell 启动什么,然后也从以下位置获取输入重点是程序大多不需要关心它们是否连接到终端或其他东西。)
在通常的通用系统上,您运行的大多数命令都不是内置于 shell 中的,而是外部程序。在一些带有 Busybox 的嵌入式系统上,常见的东西很可能在 Busybox 本身内实现。但即便如此,您可能有一些外部应用程序实际上执行系统应该执行的任何操作,即使这只是一个 Python 或 Lua 解释器。
答案2
这可能取决于终端,但我使用的终端已经能够运行任何命令(但许多命令终止得如此之快,以至于启动终端来运行它们是毫无意义的,它们是否产生输出并不重要)。我记得使用终端来运行 screen (然后让 screen 启动适当数量的 shell)。
正如您得到的另一个答案中所述,shell 有许多内置命令(有些 shell 比其他 shell 有更多命令,因此请检查您使用的命令的手册),以便访问这些命令,并且 shell 通常保持运行状态(直到你退出它们),你应该让终端作为 shell 启动,除非你知道你在做什么。 (在某些情况下,您可以保存一个进程,但除非您有非常特殊的需求,否则再运行一个进程也没什么坏处)。
答案3
简短的回答是肯定的。命令既可以是 shell 的内部命令,也可以是外部命令。
shell 只是一个用户界面,并且(忽略各种标准),是否要在内部或外部执行命令取决于 shell。例如,busybox shell 尝试在内部实现几乎所有基本命令,因此它是嵌入式系统上唯一必需的可执行文件。
如果您阅读 bash 的手册页,您会发现一个名为Shell 内置命令列出内部命令。有些命令如果在外部实现将无法工作,例如cd
, export
, source
。
在 中列出的目录中搜索外部命令$PATH
。有些命令在内部和外部都可用,并且两者不一定相同。
命令就是一个例子pwd
。内置版本为您提供了 bash 对当前目录的了解。如果您通过目录的符号链接,外部的可以运行,/bin/pwd
并且会给出不同的答案。cd
从技术上讲,未内置到 shell 中的外部命令不是由终端运行,而是由 shell 本身运行。话虽如此,您可以明确告诉终端以非 shell 或不同 shell 的命令启动。