当你打开终端并输入命令时会发生什么?(下)

哈喽大家好,我是咸鱼

我们先来大致回顾一下文章《当你打开终端并输入命令时会发生什么?(上)》的内容

终端设备是由电传打字机演变过来的,电传打字机通过物理线与大型计算机连接在一块来实现输入输出

如上图,分别是二战时期的电传打字机和西门子 “Fernscheiber 100” 电传打字机

随着技术的不断发展(尤其是显示技术),带显示屏的终端设备随之诞生

而现在随着个人电脑的普及,出现了基于屏幕显示的图形用户界面(GUI),演变成了现在的计算机终端

现在的终端大多都是计算机上的一个应用程序,它们通常被称为终端模拟器,充当用户与操作系统交互的界面(比如说 Linux 中的 Xterm、Xshell,Windows 中的控制台),而不必使用专门的终端。输出系统是屏幕,输入系统是键盘

以 Linux 为例,当我们打开终端时,通常会启动一个 shell 进程,用于与用户交互。用户在终端中输入的命令将传递给 shell 进程,然后由 shell 解释和执行这些命令


这个过程包括将用户输入的命令解析为操作系统可以理解的指令,执行这些指令,并将执行结果返回给终端显示给用户

输入命令

当我们在终端中输入命令时,键盘输入的字符会被转换成相应的字符编码(比如说 backspace 键被转译成 ASCII 字符 0x08

这些字符通过终端写入到 PTY leader,接着 TTY driver 从 PTY leader 中读取字符并存储到 line discipline 中(line discipline 为 PTY 两端之间的中间缓冲区)

不但如此,line discipline 还负责解释来自 PTY leader 的字符然后根据自己的规则去处理它们(比如进行回退、删除字符等,或者处理特殊字符)

举个例子,line discipline 收到 backspace 时,它会根据自己的规则解释成 ERASE 字符,然后进行编辑,方法是删除最后一个字符

接着将删除操作返回给 PTY leader,这样终端就可以从 PTY leader 那里读取到更改并将其反映在终端显示中

需要注意的是,上面这段过程里字符还没有被写入到 PTY follower 中,只是处在【编辑】部分

当我们在键盘敲下 CTRL+C 时,line discipline 会解释成 INTR (INTERRUPT 的缩写),这时候就会向 PTY follower 发送一个 SIGINT 信号去中断在前台运行的任何进程

如果不是特殊字符(比如输入 ls),line discipline 会将字符返回给 PTY leader,终端程序读取并显示在屏幕上,这就是为什么你在键盘敲一个字符,显示器就会显示一个字符(echo 功能)

现在 shell 进程也会缓冲用户的输入,以实现一些高级的功能:比如命令历史记录或 tab 键自动补全

执行并解析命令

当我们输入完命令之后,就要按下回车键(Enter)来执行命令了

一旦按下回车键,line discipline 解释为换行字符(newline),通常表示为 NL

然后一并将用户的命令转发到 PTY follower ,而 shell 进程跟 follower 相连,shell 拿到命令之后就会去解析并执行

当 shell 进程接收到用户的输入和换行符时,它会开始解析并执行命令。这个过程包括命令解析、查找可执行文件或内置命令,以及执行相应的操作

首先对命令解析成一个一个 token 并进行语法/语义分析,以 ls 命令为例:

  • ls > foo.txt :正确
  • ls > :语法不正确, > 后面缺少内容
  • ls | foo.txt :语义不正确,管道的两端都需要是可运行的进程

然后接着解析那些不是 shell 关键字或者路径的 token,shell 需要知道这些 token 的含义,所以 shell 会去根据下面几个部分去递归查找 token 引用的内容:

  • aliases:命令别名,通常用于缩写复杂的命令(例如 alias ll="ls -lh"
  • function:函数
  • environment variables:环境变量
  • builtins:shell 内嵌命令(例如 cd pwd exit kill
  • PATH executables:shell 可以找到(通过 $PATH 变量)并运行的外部命令

我们可以通过 type 命令知道对应的类型

[root@minion1 ~]# type ll
ll 是 'ls -l --color=auto' 的别名

[root@minion1 ~]# type cd
cd 是 shell 内嵌

[root@minion1 ~]# type python
python 是 /usr/bin/python

与 shell 内嵌命令不同的是,可执行命令是单独的程序或脚本文件,具有执行权限,可以作为单独的进程执行

当用户在 shell 中输入一个命令时,shell 会查找可执行文件的位置,并在找到后创建一个新的子进程来运行该可执行文件,并将相应的命令参数传递给这个新的子进程

我们可以通过 pstree 命令来查看进程之间的关系

返回输出

当 shell 执行完命令之后,把生成的输出写入到 PTY follower ,接着传到 line discipline 中,line discipline 不会处理这些输出,而是转发给 PTY leader,然后终端就会读取并显示到屏幕上

参考文章:https://www.warp.dev/blog/what-happens-when-you-open-a-terminal-and-enter-ls

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/247483.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【高效开发工具系列】DataGrip入门

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【回眸】Tessy 单元测试软件使用指南(三)怎么打桩和指针测试

目录 前言 Tessy 如何进行打桩操作 普通桩 高级桩 手写桩 Tessy单元测试之指针相关测试注意事项 有类型的指针(非函数指针): 有类型的函数指针: void 类型的指针: 结语 前言 进行单元测试之后,但凡…

【Proteus仿真】【51单片机】电子门铃设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器,使共阴数码管,按键、无源蜂鸣器等。 主要功能: 系统运行后,数码管默认显示第一种门铃音调,可通过K1键切…

对不起,必须放弃SQL!

尽管SQL很受欢迎,也很成功,但它又总是充斥着种种矛盾。 SQL可能笨拙又冗长,但开发人员又经常发现它往往是他们提取所需数据的最简单直接的方法。当查询写入正确时,它可以快如闪电,当查询出错时,它就会慢如…

LeetCode(62)删除排序链表中的重复元素 II【链表】【中等】

目录 1.题目2.答案3.提交结果截图 链接: 删除排序链表中的重复元素 II 1.题目 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 示例 1: 输入:head [1…

像素、分辨率、频率、精度、延迟,关于光学动作捕捉镜头参数的那些事

精准度、分辨率、频率、延迟等参数是影响光学动作捕捉效果和还原度的关键因素。下面逐一介绍NOKOV度量动作捕捉系统的基础参数。 NOKOV度量动作捕捉系统的核心产品是光学动作捕捉镜头,用于捕捉被测物表面反光标记点的三维坐标数据。 从表中可以看到,不同…

Python自动化测试(unittest框架)

一、什么是框架 框架是由大佬开发或者专业的研发团队研发的技术骨架,框架是一个半成品,框架是对常用的功能,基础的代码进行封装的一个工具,这个工具对外提供了一些API,其他的开发者只需要调用框架的接口即可&#xff…

Windows进程机制

进程 进程要做任何事情,必须让一个线程在它的上下文运行。该线程负责执行进程地址空间包含的代码。每个进程至少要有一个线程来执行进程地址空间包含的代码。当系统创建一个进程的时候,会自动为进程创建第一个线程,这称为主线程(…

word文档怎么压缩?超级好用!

当Word文档体积过大时,会遇到传输慢、无法上传等问题,这时候可以通过压缩软件、压缩图片等方式减小Word文档体积,下面就一起来看下具体的操作方法吧。 方法一:嗨格式压缩大师 嗨格式压缩大师是一个专业的压缩软件,可以…

分享10个国内免费的AI绘画工具

谈到 AI 绘画,许多人会联想到 Midjourney、Stable Diffusion、DALLE2 等国外的知名绘画工具。 然而,这些国外的 AI 绘画工具大部分都是付费的,并且需要借助科学上网才能使用。这两个条件让许多人望而却步。 考虑到很多人无法进行科学上网&a…

绿色视角下的高校校园建设及能耗管理

摘 要:2019年住建部发布了《绿色校园评价标准》(GB/T51356—2019),将创建绿色校园提上了日程。绿色校园建设的目标是践行绿色发展理念,建立生态文明教育工作长效机制。创建绿色校园要从政府、社会、学校三个层面来实施,以加快高校…

【Spring Boot】Starter机制的使用及案例

一、引言 1、什么是SpringBoot Starter SpringBoot中的starter是一种非常重要的机制(自动化配置),能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启…

【MIMO 从入门到精通】[P3]【Channel Estimation】

前言: MIMO 是无线通讯里面的核心技术之一.这里面主要参考 《Quick Introduction to MIMO Channel Estimation》 Professor and an IEEE Fellow:Iain 讲解一下 MIMO (multiple transmit antennas and multiple receivers)里面的信…

电脑出现错误0x80004005怎么解决,解决0x80004005的问题

当电脑出现0x80004005错误时,通常是由于系统或应用程序之间的通信问题或文件系统损坏引起的。该错误代码表示未指定错误,在Windows系统中较为常见。 一.解决0x80004005错误的步骤 重新启动电脑 有时候,错误只是一个暂时的问题,重…

后端项目操作数据库-中枢组件Service调用Mapper实现增删改查-实例

接上篇 使用MyBatis配置Mapper实现增删改查 1.Service的基本作用 Service在代码中的的作用是调用Mapper、被Controller调用。是后端项目中非常重要的组件。 用于设计业务流程、业务逻辑,以保障数据的完整性、有效性、安全性。 2. Service使用举例——“添加相册”…

MyBatis的逆向工程

MyBatis的逆向工程 正向工程:先创建Java实体类,由框架负责根据实体类生成数据库表。 Hibernate是支持正向工 程的 逆向工程:先创建数据库表,由框架负责根据数据库表,反向生成如下资源: Java实体类 Mapp…

【Trino权威指南(第二版)】Trino的架构、trino架构组件、 trino连接器架构的细节、trino的查询执行模型

文章目录 一. Trino架构1. 架构概览2. 协调器3. 发现服务4. 工作节点 二. 基于连接器的架构三. 查询执行模型1. 解析—>查询计划2. 查询计划 —> 分布式查询计划3. 运行阶段3.1. 基础概念切片:并行单元page 与 exchange算子pipeline切片的driverOperator 3.2.…

Python高级算法——线性规划(Linear Programming)

Python中的线性规划(Linear Programming):高级算法解析 线性规划是一种数学优化方法,用于求解线性目标函数在线性约束条件下的最优解。它在运筹学、经济学、工程等领域得到广泛应用。本文将深入讲解Python中的线性规划&#xff0…

连续型随机变量的概率密度

如果对于随机变量的分布函数,存在非负可积函数,使得对于任意实数,有: 那么就称为连续型随机变量,称为的概率密度函数,简称密度函数。

微信小程序合集更更更之实现雪花随机飘落

实现效果 写在最后🍒 更多相关内容,关注🍥苏苏的bug,🍡苏苏的github,🍪苏苏的码云~