- 1当我们执行一个命令, 整个命令执行流程如下:
-
- 判断命令是否通过绝对路径执行
-
- 判断命令是否存在alias别名
-
- 判断用户输入的是内部命令还是外部命令
-
- Bash内部命令直接执行,外部命令检测是否存在缓存
-
- 通过PATH路径查找命令,有执行,无报错
-
- 2.什么是内部命令,什么是外部命令
- 内部命令: shell程序自带的命令。
- 外部命令: 在系统PATH变量的某个路径下的可执行程序。
3.如何检查用户输入的命令是内部命令还是外部命令*
#cd命令属于shell内部命令
[root@linux-node1 ~]# type -a cd
cd is a shell builtin
cd is /usr/bin/cd
#ping属于外部命令, 同时会打印当前命令路径
[root@web ~]# type -a ping
ping is /bin/ping
4.如果是外置命令,Bash可以通过查找PATH变量,获取该命令的绝对路径。
#打印当前环境变量目录
[root@web ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PS: PATH由多个路径组成,每个路径值之间用冒号间隔,对这些路径的增加和删除操作都将影响到Bash解释器对Linux命令的查找
5.如果是外置命令还会涉及到一个内存缓存,也就是说,当我们出现重复执行相同的命令,会通过缓存调取执行,也就意味着不会搜索PATH路径。
#表缓存命令所在位置
[root@web ~]# hash
hits command
1 /usr/bin/tty
3 /sbin/ifconfig
#已缓存命令,如果移动位置会导致无法找到该命令
[root@web ~]# mv /sbin/ifconfig /bin/
[root@web ~]# ifconfig
-bash: /sbin/ifconfig: No such file or directory
#删除缓存过的ifconfig命令, 即可执行
[root@web ~]# hash -d ifconfig
[root@web ~]# ifconfig
#当然可以清空缓存表
[root@web ~]# hash -r
#注意: 命令缓存hash需要注意如下情况:
1.只要执行外部命令1次就会对该命令进行缓存
2.如果将命令移动了位置,该如何执行
a.使用绝对路径执行
b.删除hash表的缓存指令
6.命令执行流程总结: 当我们执行了一个ping
命令之后, 整个命令执行的流程步骤如下:
1) 检查执行的命令是否使用的是绝对路径执行的。
2) 检查ping命令是否存在alias别名
3) 检查ping命令是内部命令还是外部命令
4) 如果是内部命令Bash直接执行,如果是外部命令,首先检查Hash缓存,存在则直接调取
5) 如果该命令不存在Hash缓存,则通过PATH路径进行逐行查找该命令所在的位置
6) 如果PATH路径没有查找到该命令所在的路径,则返回错误码。command not found