• 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
  • 相关阅读:
    【IT笔试面试题整理】字符串的组合
    【IT笔试面试题整理】字符串的排列
    进程与线程的区别?转
    【IT笔试面试题整理】判断一个树是否是另一个的子树
    【IT笔试面试题整理】连续子数组的最大和
    【IT笔试面试题整理】反转链表
    【IT笔试面试题整理】不用加减乘除做加法
    java Singleton 几种方式解析转
    【IT笔试面试题整理】判断链表是否存在环路,并找出回路起点
    【IT笔试面试题整理】删除无序链表中重复的节点
  • 原文地址:https://www.cnblogs.com/oldxu/p/14543084.html
Copyright © 2020-2023  润新知