终端输入命令,背后发生了什么--shell,tty,terminal解析
日常编程会接触到命令行
打开一个窗户输入命令(比如切换目录运行程序等),这样一个黑底白字可以输入指令的窗口有很多名字,这里是zsh,但是还有shell,bash,cmd,terminal,console,powershell,不能说搞混,甚至我一直以为大概这些都是指一个东西,打开一个终端,输入命令,或者安装配置一些依赖,而且也没有影响到写代码或者按照依赖,唯一的前提就是在项目文件夹打开这个终端。
1.区分shell,terminal。
shell是什么东西?一个概念,指操作系统和你交互的程序,shell一定运行在terminal中。shell有很多实现,sh,zsh,bash,window下的cmd,powershell都是指的shell.sh:bourne shell 最经典的unixshell,bash:bourne-again shell大多数linux默认版本的shell。
那么和terminal的关系呢?
terminal是一个终端模拟器,是一个图形化界面,提供输入输出结果的显示,运行在一个桌面环境里面,shell运行在terminal里面,负责处理terminal传过来的数据,shell去解析输入使用系统调入和内核进行交互,然后把输出结果返回terminal,terminal将输出结果显示在页面上。
2.shell,terminal,tty之间的关系
首先一个完整的下定义。
这就是shell terminal tty的定义。很难去理解对我来说。云里雾里的。用案例来解释的一下吧。
当我们输入一个命令的时候,整个处理流程是什么。
用户输入命令----》terminal----》PTY master----》PTY driver(line discipline)---->PTY slavs--->bash(shell)。好像明朗了,但是tty好像没有出现啊。
总结一下,Terminal 是用户可见的图形界面,Shell 是解析和执行命令的大脑,而 TTY 是内核中处理字符输入输出的“通道”和“中枢神经系统”。
当你在终端中输入命令时,Terminal 将字符发送给伪终端 master(/dev/ptmx),随后进入 TTY 子系统的处理流程。TTY 中的 line discipline 负责处理回显、删除、换行等字符规则,然后将处理后的输入传给伪终端 slave(/dev/pts/N)。
Shell(如 bash 或 zsh)正是挂载在 slave 端,读取用户输入并解析命令,通过 fork + exec
生成新的进程交由内核执行。执行结果(标准输出)被写回到 slave 端,TTY 子系统再将其传给 master 端,Terminal 从 master 读取输出并显示在屏幕上。
这个完整的字符输入→Shell解析→内核执行→结果输出 的循环过程,都离不开 TTY 的支持。TTY 是连接用户与 shell 的桥梁,也是整个交互流程的幕后英雄。