当我们执行一条命令的时候,整个命令执行流程如下:
1、判断路径
判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是的话,直接执行。
2、检查别名
Linux 系统会检查用户输入的命令是否为“别名命令”。要知道,通过 alias 命令是可以给现有命令自定义别名的,即用一个自定义的命令名称来替换原本的命令名称。
3、判断用户输入的是内部命令还是外部命令
Linux命令行解释器(又称为 Shell)会判断用户输入的命令是内部命令还是外部命令。其中,内部命令指的是解释器内部的命令,会被直接执行;而用户通常输入的命令都是外部命令。
内部命令: Shell 自带,会随着系统启动,可以直接从内存中读取
外部命令:在系统PATH变量的某个路径下的可执行文件
判断一个命令属于内部命令还是外部命令,可以使用 type 命令查看。
4、内部命令直接执行,外部命令检测是否存在缓存
5、检测PATH路径,有执行,无报错。
当用户执行的是外部命令时,系统会在指定的多个路径中查找该命令的可执行文件,而定义这些路径的变量,就称为 PATH 环境变量,其作用就是告诉 Shell 待执行命令的可执行文件可能存放的位置,也就是说,Shell 会在 PATH 变量包含的多个路径中逐个查找,直到找到为止(如果找不到,Shell 会提供用户“找不到此命令”)。
事实上执行过的外面命令都会保存在内部缓存中,当再次执行相同的命令,会通过缓存调取执行,也就意味着不会搜索PATH路径。
总结,当我们执行一个ping命令之后,整个命令执行的流程步骤如下:
1.检查执行的是否是绝对路径执行
2.检查ping命令是否存在别名
3.检查ping命令是内部命令还是外部命令
4.如果是内部命令直接执行
5.如果是外部命令,检查ping命令是否有缓存,如果没有,查找PATH变量
6.检查PATH路径直到查找到该命令然后执行
7.如果没有找到该命令则返回错误,command not found。