我将 bash 理解为一个可以向 linux 输入命令的窗口。阅读维基百科,我了解到历史上有各种 shell 应用程序。首先,我将 bash 理解为键入命令并获得响应的东西。每次您输入内容并按 Enter 时,它都会用另一行文本进行响应。但还不止于此。您实际上可以在 bash 中创建“应用程序”。例如,有文本编辑器 nano 和 vim。所以看起来你实际上可以控制窗口内的一些图形。
另一个例子是树莓派的 raspi-config 命令中出现的这个窗口。当我键入此命令时,它会出现在腻子窗口内。它是什么?如何使彩色和矩形的东西出现在 bash 中?
我想了解发生了什么:bash 在 Linux 内部哪里运行?它如何与系统通信?我还年轻,因此对计算机终端的历史一无所知,我不知道当 GUI 出现时,一切发生了怎样的变化。
答案1
有几个抽象层次参与展示您在提供的屏幕截图中看到的内容。我将尝试总结一下,尽管这是一个相当广泛的主题。
终端仿真器
你所描述的:
我可以在其中向 linux 输入命令的窗口
实际上并不是 bash,至少不是 bash 本身。您正在查看一个终端仿真器运行你的 shell(可能/bin/bash
)。
经常被引用的终端仿真器示例是xterm
,它几乎包含在所有桌面 Unix 和 Linux 系统中。然而,有许多终端模拟器,其中一些比 具有更多的功能xterm
,例如附加的鼠标控件、选项卡(类似于浏览器选项卡)等。
Linux 控制台(又名“文本模式”)
您还可以像使用 Linux 机器一样使用物理终端,这是当您在没有图形环境的情况下启动 Linux/Unix 系统时会看到的内容(许多系统配置为服务器就是这种情况)。 Linux 仍然对这些进行了一定程度的抽象(允许一台物理计算机上有多个虚拟终端),但实际上这些类似于您的显示器是专用的“纯文本”显示器。
壳
终端模拟器可以运行它喜欢的任何命令行程序。默认情况下,它只运行交互式 shell(例如 bash、sh、csh、ksh 等)。那么,什么是贝壳呢?
很简单,shell 是一个与其他程序一样的命令行程序。如果以交互模式运行(即不运行预编程的 shell 脚本),它会向您显示提示(通常类似于type_outcast:~$
),然后接受您键入的任何内容并根据其自己的规则集(语言)对其进行解释。每个 shell 都略有不同,但大多数常见的 shell 大致相似。
当您输入命令时会发生什么?
当您键入命令(例如,ls -l
)并按 Enter 键时,shell 会查看您键入的字符串并决定要执行的操作。在这种情况下,它会查找在变量ls
中调用的程序$PATH
,当找到它时,它会在子进程中运行它(fork()
并且exec()
系统调用如果您想了解内部结构)以及您提供的参数(-l
)。
默认情况下,命令的输出(称为stdout
“标准输出”,也stderr
称为“标准错误”)连接到终端,因此您可以看到程序的输出。同样,stdin
默认情况下也会连接(“标准输入”),因此您可以在交互式程序中键入输入。 (有时程序会更直接地控制终端,这是一个中级编程主题。)
命令'输入和输出可以重定向,这本身就是另一个相当广泛的话题。
那些奇特的颜色和菜单怎么样?
大多数终端仿真器接受颜色和各种控制代码(通常是ANSI 转义序列,加上一些特定于终端的代码)。这些代码可用于绘制彩色界面,例如您在屏幕截图中看到的对话框。
换句话说,这里没有明显的新巫术。我的系统在 80 年代初(早在 Windows 出现之前)就可以理解 ANSI 代码并显示类似的对话框,当时我的终端只是一个 80x25 彩色 (EGA) 显示器。
那么发生了什么变化呢?
从那时起,变化相对较小,除了图形桌面的广泛流行之外,它激发了终端仿真器应用程序,以便人们可以享受更大的终端尺寸,并让他们的终端与图形应用程序一起运行,而不必专门致力于他们的显示器和键盘到 80x25 或 80x43 纯文本显示器。