Linux-命令执行流程

 

当我们执行一条命令ip add的时候

shell shell解析过程图

首先明白解释器 解释器:直接执行用编程语言编写的指令的程序 编译器:把源代码转换成(翻译)低级语言的程序 高级语言:是指高度封装了的编程语言,相对于机器语言,更加适合人类编写与阅读 解释型语言编译型语言的区别是 1.类型不同,解释型语言每次运行是需要将源代码解释成机器码,然后才能够执行,编译型语言一次编译成机器语言文件,以后就不需要再编译。 2.效率不同,解释型语言运行效率比较低,编译型语言运行效率高。 3.适用平台不同,解释型语言也是有优势的,那就是只要平台提供了解释器,就可以直接运行源代码,编译型的语言存在着不足之处,那就是编译型的语言是需要特定平台的,没有办法移植到其他的平台。

当我们执行命令,mkdir -p hunau/yutao

一、判断路径 判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/mkdir),如果是的话,直接执行。

二、检查别名 Linux 系统会检查用户输入的命令是否为“别名命令”。因为通过 alias 命令是可以给现有命令自定义别名的,即用一个自定义的命令名称来替换原本的命令名称。比如常用命令ll 在这里插入图片描述

三、判断用户输入的是内部命令还是外部命令

  • 内部命令实际上是shell程序的一部分,简单快速系统bash内置源码 比如:exit,history,cd,echo等。
  • 外部命令是linux系统中的实用程序部分,外部命令的实体并不包含在shell中,但是其命令执行过程是由shell程序控制的。外部命令是在bash之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin等。可通过“echo $PATH”命令查看外部命令的存储路径,比如:ls、vim等。
  • type命令可以分辨内部命令与外部命令 在这里插入图片描述 内部命令直接执行,外部命令检测是否存在缓存,mkdir属于外部命令(执行过的外面命令都会保存在内部缓存中,当再次执行相同的命令,会通过缓存调取执行,也就意味着不会搜索PATH路径)

四、查找外部命令对应的可执行文件 当用户执行的是外部命令时,系统会在指定的多个路径中查找mkdir的可执行文件,而定义这些路径的变量,就称为 PATH 环境变量,其作用就是告诉 Shell 待执行命令的可执行文件可能存放的位置,Shell 会在 PATH 变量包含的多个路径中逐个查找,直到找到为止(如果找不到,Shell 会提供用户“找不到此命令”)。

五、启动命令 找到mkdir命令,linux内核分配内存空间,启动mkdir命令的进程,返回结果给shell解释器

六、返回结果 shell解释器创建/hunau/yutao返回用户

总结:当我们执行一个mkdir命令之后,整个命令执行的流程步骤如下:

  1. 解释器解释这条命令mkdir是命令,-p是参数

  2. 去磁盘查找mkdir命令

  • 检查执行的是否是绝对路径执行
  • 检查mkdir命令是否存在别名
  • 检查mkdir命令是内部命令还是外部命令
  • 如果是内部命令直接执行
  • 如果是外部命令,检查mkdir命令是否有缓存,如果没有,shell解释器查找PATH变量
  • 检查PATH路径直到查找到该命令然后执行
  • 如果没有找到该命令则返回错误,command not found
  1. 如果找到告诉linux内核mkdir的位置,加载mkdir命令的二进制可执行程序到内存

  2. linux分配内存空间,启动mkdir命令进程

  3. 执行mkdir命令,返回结果给shell解释器

  4. shell解释器返回结果给用户