为什么 Linux 中的终端和 Shell 是两个独立的程序?

为什么 Linux 中的终端和 Shell 是两个独立的程序?

在 Windows 中,使用 CLI 时,仅使用一个程序 ( cmd.exe)。您将输入发送到cmd.exe,然后cmd.exe又向您发送输出(在屏幕上显示输出):

在此输入图像描述

但在 Linux 中,使用了两个程序:终端和 Shell。

您将输入发送到终端(例如:gnome-terminal),gnome-terminal然后将此输入发送到 Shell(例如:bash),然后bash将输出发送到gnome-terminalgnome-terminal然后再向您发送输出。

在此输入图像描述

我的问题是:为什么终端和 Shell 在 Linux 中是两个独立的程序,而不是像 Windows 中那样是一个程序?

答案1

你的前提是不正确的。 Windows 中“终端”的角色或多或少是由 conhost.exe 扮演的 - 控制台子系统的设计方式并不像 Linux 中的终端那样可互换(并且还有其他差异,例如,当您启动控制台模式进程(例如尚未附加到控制台的 cmd.exe )时,启动该进程的系统库将负责为您创建一个),但它是由单独进程管理的单独层。

答案2

我想说 1)因为历史,2)因为这是一个好主意。

通常我们调用gnome-terminalxterm终端模拟器。过去,没有终端模拟器,因为没有图形用户界面。一切都是正确的终端、通过串行电缆连接的带有屏幕和键盘的设备到计算机。 Shell 在当时也很有用,并且被编写为支持从终端获取命令。 (可能来自任意文件描述符,但这并不重要。)

对于 Linux 虚拟终端和 GUI 之类的东西,让它们模拟原始终端是很有用的,这样旧的软件就可以正常工作,或者至少可以进行最小的更改。这不仅意味着 shell,还意味着与“终端”接口的其他程序。 (ls???)viemacs

此外,分离也是一个好主意,因为它允许人们独立地交换终端仿真器和 shell。我可以在 xterm 上使用 Bash,或者在 gnome 终端上使用 zsh,或者通过 SSH 连接使用 Bash,或者...

如果将各个部分捆绑在一起,这个选择就会更加困难。


顺便说一句,我也不太确定cmd.exe终端仿真部分本身的实现。我已经有一段时间没有接触过 Windows 上的编译器了,但如果我没记错的话,可以在不涉及cmd.exe.看这里这里

答案3

gnome-terminalbash将作为默认应用程序 运行,但是xtermgnome-terminal系列旨在运行任意命令,而不仅仅是 shell,您可以运行例如:

xterm -e /bin/bash
xterm -e /usr/local/bin/fish
xterm -e tail -f /var/log/messages
xterm -e man ls

在最后一种情况下,xterm 将显示 ls 手册页,如果我退出,xterm将退出。

对于 /var/log/messages,我可能会使用 xterm 选项来设置字体或更改颜色。

请注意,gnome-terminal还使用-e语法来运行命令。

答案4

我认为,因为在Linux中你可以有多个shell(bash ksh ....)

在Windows中只有1个程序,cmd。现在微软需要 2 个程序来添加更多功能(power shell)

在Linux中只需更改shell即可提高您的要求

相关内容