Bash Shell命令流程

  • 1当我们执行一个命令, 整个命令执行流程如下:
      1. 判断命令是否通过绝对路径执行
      1. 判断命令是否存在alias别名
      1. 判断用户输入的是内部命令还是外部命令
      1. Bash内部命令直接执行,外部命令检测是否存在缓存
      1. 通过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

别妄自尊大! 别妄自菲薄! QQ技术交流群:Linux架构师之路~ 471443208
原文地址:https://www.cnblogs.com/oldxu/p/14543084.html