根因早期计算机是大型主机主机本体放在机房运算、存储全部由主机完成。操作人员不可能趴在主机上操作于是就造出终端本身没有算力只负责接收人的输入、展示主机返回的输出通过线缆连接远端主机。到个人电脑时代硬件终端慢慢消失但这个概念保留下来。现在我们说的终端分为物理硬件终端和软件终端终端模拟器。一、终端的本质定义终端Terminal核心定位输入输出设备不具备独立计算能力负责人与计算机主机之间转发交互数据。它只做两件基础事捕获键盘按键把按键编码发送给主机接收主机发来的字符/控制指令在屏幕上渲染文字、移动光标、改变颜色。二、历史硬件终端真实终端机典型代表VT100最经典的硬件终端现代终端模拟器基本兼容VT100控制序列。硬件终端组成显示器、键盘、串口没有CPU、硬盘、内存来跑操作系统。工作链路键盘 → 终端硬件 → 串口线 → 大型主机主机运行程序把文本、光标控制命令发回终端终端负责显示。主机负责计算终端只负责IO。主机和终端之间约定一套控制指令ANSI转义序列用来控制光标位置、清屏、文字颜色。三、现代终端模拟器我们现在电脑上打开的终端现在的Windows终端、macOS的Terminal、Linux的gnome-terminal、xterm不是硬件终端是软件程序叫终端模拟器。它模拟老式硬件终端的全部行为底层依托操作系统流程拆解终端模拟器程序连接操作系统内的伪终端PTYpseudo-terminal。PTY分为两端主端、从端。从端绑定Shell程序bash/zsh/fish/cmd。你在终端窗口敲键盘模拟器捕获按键把字符写入PTY主端PTY转发给从端交给Shell。Shell拿到输入命令解析、执行程序比如php test.php、ls。程序产生标准输出stdout、标准错误stderr写入PTY从端流向PTY主端交给终端模拟器。终端模拟器解析收到的数据普通字符直接绘制到窗口遇到ANSI转义序列执行特殊动作移动光标、清屏、变色、下划线。PTY是关键桥梁伪终端PTY是内核提供的一对管道用来模拟老式串口硬件终端。应用程序终端模拟器操作主设备Shell/命令行程序附着在从设备上命令程序以为自己正在和一台老式硬件终端通信实际上只是内核里的虚拟通道。四、几个容易混淆概念庖丁拆解终端 Terminal负责界面显示键盘输入的设备/软件。Shell命令解释器负责解析你输入的命令、创建进程、调用程序。一句话区分终端是窗口载体Shell是里面听懂命令、跑程序的引擎。终端只是负责收发字符不会解析命令。举例子打开终端窗口窗口本身是终端模拟器里面运行的bash就是Shell。关掉终端窗口Shell进程收到SIGHUP信号退出里面运行的前台程序也会被终止。控制台 Console控制台是主机本地直接接入的输入输出。Linux上tty1~tty6就是原生控制台不需要图形界面黑屏字符界面。而我们图形界面里打开的窗口终端是PTY虚拟终端不是原生控制台。五、一次按键的完整链路实操例子敲ls回车按下键盘L键操作系统内核键盘驱动捕获硬件按键转成字符l。字符发送给终端模拟器程序。终端模拟器把字符写入PTY主端内核转发给PTY从端交给bashShell。Shell回显字符l回显是Shell/终端的功能把输入的字符再发回终端显示所以你能看到敲了什么。依次输入s按下回车。回车会触发Shell解析整行命令ls。Shell执行forkexec启动ls程序。ls读取目录信息输出文本字符串写入stdout输出流向PTY。终端模拟器拿到ls输出的文本绘制到窗口屏幕上。六、ANSI转义序列终端的隐藏指令主机不只可以发送普通文字还可以发送特殊的转义字符串控制终端行为。比如\033[31m代表红色文字\033[H\033[2J清屏。早期VT100硬件终端识别这套序列现在所有终端模拟器兼容这套标准。很多命令行工具彩色输出底层全靠ANSI转义序列。误区澄清误区1终端 Shell纠正完全两回事。终端负责界面IOShell负责命令解析、进程管理。可以换Shellbash/zsh终端窗口程序不变。误区2终端可以独立运行程序纠正终端本身不能执行命令。它只是转发字符执行命令是Shell或者你启动的程序php、ls完成。误区3PTY就是普通管道纠正普通管道只能单向数据流PTY额外实现终端特性行缓冲、信号传递、ANSI控制、回显功能专门模拟终端交互场景。一句话总结老式终端是无算力的硬件只负责键盘输入与屏幕输出现代终端模拟器是图形界面软件依托操作系统内核PTY伪终端和Shell通信转发输入输出依靠ANSI转义序列实现光标、颜色控制。终端只管收发字符解析和执行命令的是Shell。