文章目录
在 Unix 和 Linux 系统中,有一些术语常常让人困惑,比如 “terminal”、“shell”、“tty” 和 “console”。本文试图通过通俗易懂的语言来解释这些概念,并结合一些历史背景,帮助大家更好地理解它们。
1 Terminal
1.1 传统意义上的 Terminal
最初,终端(terminal)是指一种物理设备,通过它用户可以与计算机进行交互。早期的终端通常是电传打字机(teletypewriter,简称 TTY),一种类似打字机的设备,可以通过电缆与计算机连接,进行输入和输出操作。
也就是说,最初程序员可以通过类似于下图这种设备连接到计算机,于计算机进行交互。
下图是 Teletype Model 15:https://www.youtube.com/watch?v=fLkBb9MuTjE
1.2 现代的 Terminal
随着计算机的发展,终端的概念逐渐虚拟化。今天,我们在图形用户界面(GUI)中看到的终端窗口,其实是终端模拟器(terminal emulator),它模拟了传统终端的功能,允许用户在图形环境中使用命令行界面(CLI)。
下图为 GNOME 桌面的终端模拟器
2 TTY
2.1 TTY 的起源
TTY 是 teletypewriter 的缩写,最早用于描述一种机械设备,可以远程发送和接收文本信息。在 Unix 系统中,TTY 逐渐演变为一种抽象设备,用于处理用户与系统之间的交互。
2.2 Linux 中的 TTY
在 Linux 中,TTY 通常指的是终端设备文件,这些文件位于 /dev
目录下,比如 /dev/tty1
、/dev/pts/0
等。TTY 设备可以是物理连接的(如串口终端),也可以是虚拟的(如通过 SSH 连接的终端)。
在 Linux 和类 Unix 操作系统中,有一种核心设计哲学,即“一切皆文件” (Everything is a file)。这意味着系统中的大多数资源和设备都可以通过文件系统接口进行访问和操作。
下图为 /dev 下的 tty 文件:
2.3 虚拟终端
- 虚拟终端(virtual terminal):在 Linux 系统中,用户可以通过按
Ctrl
+Alt
+F1
到F6
切换到不同的虚拟终端。这些虚拟终端允许多个独立的登录会话。虚拟终端是一个全屏终端,与图形桌面上的终端窗口不同。
当我在ubuntu桌面版中按下 Ctrl
+ Alt
+ F3
时,出现了下图这样的界面:
2.3.1 虚拟终端为什么是虚拟的?
虚拟终端是一个模拟物理终端功能的程序。
在早期的计算机系统中,终端通常是物理设备,例如电传打字(Teletypewriter,TTY)或视频终端(Video Terminal),这些设备通过键盘输入数据并在屏幕上显示输出。物理终端是实际存在的硬件设备,直接连接到计算机,用于输入和输出操作。
虚拟终端通过软件模拟了物理终端的功能,通过软件实现键盘输入和屏幕输出。常见的虚拟终端包括 gnome-terminal
和 konsole
等终端模拟器,它们在图形用户界面(GUI)环境中运行。
2.4 伪终端
- 伪终端(pseudo-terminal,简称 pty):伪终端在两个或多个进程之间建立异步双向通信(IPC)通道的虚拟设备端点对,用于模拟终端设备,为终端模拟器提供支持。常见的伪终端设备文件位于
/dev/pts/
目录下。
2.4.1 伪终端的组成
伪终端由一对设备文件组成:
- 主设备(Master):负责与终端模拟器或远程登录服务器(如 Telnet 或 SSH 服务器)进行通信。
- 从设备(Slave):模拟硬件串口设备,供终端导向程序(如 Shell)读取和写入数据。
2.4.2 伪终端的工作原理
伪终端的工作流程如下:
- 用户与终端模拟器交互:用户通过终端模拟器(如 xterm、GNOME Terminal、Konsole 等)输入命令。
- 终端模拟器与主设备通信:终端模拟器将用户输入的命令发送到主设备。
- 主设备与从设备通信:主设备将命令传递给从设备,从设备模拟实际终端设备,供 Shell 等进程使用。
- 返回输出:Shell 执行命令后,将输出结果返回给从设备,从设备再通过主设备传回终端模拟器,最终显示给用户。
2.4.3 伪终端的应用
- 终端模拟器:如 xterm、GNOME Terminal 等,允许用户在图形界面中使用命令行。
- 远程登录:如 SSH 和 Telnet 服务器,允许用户远程连接并操作系统。
- 会话管理:如 Screen 和 Tmux,提供会话持久性,允许用户断开连接后重新连接会话。
当你在终端中输入 tty
命令时,系统会返回当前终端设备的文件路径。
上图中,系统返回了 /dev/pts/7,这表示当前使用的是一个伪终端设备。
下图表示通过 vscode ssh 连接到 Linux 后,使用的内嵌终端也是伪终端:
3 Console
3.1 Console 的定义
Console 通常指的是直接连接到计算机的主要终端设备。在物理意义上,Console 是计算机的键盘和显示器,通常用于系统的初始设置和维护操作。
3.2 Linux 中的 Console
在 Linux 系统中,Console 也可以是一个虚拟终端,通过特殊的按键组合(如 Alt
+ Fn
键)进行切换。系统启动时的日志信息和内核消息通常会输出到 Console 上。
4 Shell
4.1 Shell 的定义
Shell 是一种命令行解释器,是用户与操作系统之间的桥梁。用户在终端中输入命令,Shell 负责解释并执行这些命令。Shell 本身并不是终端,但它通常运行在终端或终端模拟器中。
4.2 常见的 Shell
- Bash:最常用的 Shell,默认安装在大多数 Linux 发行版中。
- Zsh:功能强大且高度可定制的 Shell,近年来越来越受欢迎。
- Fish:以用户友好和简洁著称的 Shell。
总结
- Terminal:用户与计算机交互的设备或模拟器,可以是物理的或虚拟的。
- TTY:源自电传打字机,现为 Unix/Linux 中的终端设备文件。
- Console:主要的终端设备,直接连接到计算机,用于系统管理。
- Shell:命令行解释器,运行在终端中,用于解释和执行用户的命令。
参考链接
- What is the concept behind “tty” in linux? - Unix & Linux Stack Exchange
- What is the exact difference between a ‘terminal’, a ‘shell’, a ‘tty’ and a ‘console’? - Unix & Linux Stack Exchange
- Why is a virtual terminal “virtual”, and what/why/where is the “real” terminal? - Ask Ubuntu
- Pseudoterminal Wiki