用一条命令’pwd’判断并证明系统命令的执行顺序。

一、命令分类
    
    在Linux系统中命令分为两类:
    
        1.内部命令:shell buildin 每次启动系统都会重新加载入内存。
        2.外部命令:即某目录下的文件,通过外部介质安装的命令工具包,如通过yum、rpm等方式安装,具体安装路径在$PATH下。

二、命令执行顺序
    
    在命令执行过程中,命令形态主要分为4类:alias(别名命令)、内部命令、hash缓存命令和外部命令。

三、命令执行顺序
    
    1. type command 查看是否是内部命令
    2. alias 定义别名 ualias取消别名
    3. enable command 启用内部命令
              -n command 关闭内部命令
    4. hash 显示hash缓存
            -d 删除具体缓存命令路径
    5. cp src dst/name 复制文件
    6. mv src dst  移动文件
    7. echo $PATH 显示PATH的内容
    8. which -a  command  查看所有包含command的路径
    9. rm 删除文件
    

四、实例:‘pwd’即是内部命令又是外部命令,以‘pwd’为例实验证明其执行顺序

1.type命令判断pwd命令是内部命令,新建alias pwd条目为ls命令并执行,结果为列出当前目录文件,说明alias优先于内部命令。

    [root@h(Brad) etc]#type pwd
    pwd is a shell builtin
    [root@h(Brad) ~]#alias -p pwd=’ls’
    [root@h(Brad) ~]#pwd
    123      723.txt          dead.letter  Documents  install.log
    
2.禁用内部命令pwd,清空hash,执行pwd仍然显示ls结果,说明不论内部命令是否启用,都会执行alias。

    [root@h(Brad) etc]#enable -n pwd
    [root@h(Brad) ~]#hash -r
    [root@h(Brad) ~]#pwd
    123      723.txt          dead.letter  Documents  install.log
    
3.删除aliaspwd,使用pwd命令,仍然有效,并且判断为外部命令,hash路径在/bin/pwd。说明相比外部命令,系统优先使用内部命令。

    [root@h(Brad) ~]#unalias pwd
    [root@h(Brad) etc]#pwd
    /etc
    [root@h(Brad) etc]#type pwd
    pwd is hashed (/bin/pwd)
    
4.删除hash -d pwd,用hash -p命令创建一条pwd的hash,cp /sbin/ifconfig到/usr/sbin/pwd执行pwd结果为查看网络信息。说明执行的是/usr/sbin/pwd,hash路径优先。

    [root@h(Brad) etc]#hash -d pwd
    [root@h(Brad) ~]#cp /sbin/ifconfig /usr/sbin/pwd
    [root@h(Brad) ~]#hash -p /usr/sbin/pwd pwd
    [root@h(Brad) ~]#pwd
    eth0      Link encap:Ethernet  HWaddr 00:0C:29:03:75:7F  
          inet addr:172.16.253.154  Bcast:172.16.255.255  Mask:255.255.0.0
    
    
5.显示PATH路径

    [root@h(Brad) etc]#echo $PATH
    /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
    
6.hash -d 删除pwd条目
  

    [root@h(Brad) etc]#hash
    hits    command
      20    /bin/grep
       1    /bin/pwd
    [root@h(Brad) etc]#hash -d pwd
    [root@h(Brad) etc]#hash
    hits    command
      20    /bin/grep
       2    /usr/sbin/groupadd

7.move pwd到/usr/sbin并执行,可以执行,并hash /usr/bin,说明在PATH的其他目录中也可以执行,并hash。      

    [root@h(Brad) etc]#mv /bin/pwd /usr/sbin
    [root@h(Brad) etc]#pwd
    /etc
    [root@h(Brad) etc]#hash
    hits    command
      20    /bin/grep
       1    /usr/sbin/pwd
       
8.删除hash中pwd ,cp /sbin/ifconfig到/bin/pwd并执行,执行pwd结果为查看网络信息。说明执行的是/bin/pwd,在PATH中左面目录为优先执行目录。

    [root@h(Brad) etc]#hash -d pwd
    [root@h(Brad) etc]#cp /sbin/ifconfig /bin/pwd
    [root@h(Brad) ~]#which -a pwd                   
    /bin/pwd
    /usr/sbin/pwd[root@h(Brad) etc]#hash -d pwd
    [root@h(Brad) etc]#pwd
        eth0      Link encap:Ethernet  HWaddr 00:0C:29:03:75:7F  
          inet addr:172.16.253.154  Bcast:172.16.255.255  Mask:255.255.0.0
          
9.rm删除/bin/pwd,执行pwd显示找不文件,说明相比PATH顺序,优先读取hash中的缓存目录命令。

    [root@h(Brad) ~]#rm /bin/pwd
    rm: remove regular file `/bin/pwd’? y
    [root@h(Brad) etc]#pwd
    -bash: /bin/pwd: No such file or directory
    
五、结论:系统执行命令的优先顺序依次为:
alias——> shell builtin——> hash ——> PATH

原创文章,作者:manbinn,如若转载,请注明出处:http://www.178linux.com/86057

(1)
manbinnmanbinn
上一篇 2017-09-02 21:08
下一篇 2017-09-03 14:40

相关推荐

  • init中的服务故障如何排除

    我们假设ypbind出故障 首先我们设 ypbind服务开机启动 chkconfig yubind on 然后查看服务 chkconfig –list    默认是2345启动   然后更改这个脚本,里面寄一个长期的休眠时间,模仿为错误 sleep 休眠时间 然后重新启动,看看系统如何报错。 然后系统等到要启动该服务的时候回一…

    2017-07-22
  • N25第三周作业

    一、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [root@centos01 ~]# who | cut -d " " -f1 | uniq -u root qufudcj 二、取出最后…

    Linux干货 2016-12-26
  • 马哥教育网络班21期+第五周课程练习

    马哥教育网络班21期+第5周课程练习 [TOC] 1. 显示/boot/grub/grub.conf中至少以一个空白字符开头的行。 [root@rhel-5 ~]# grep -E '^[[:space:]]+' /boot/grub/grub.conf  root (hd…

    Linux干货 2016-08-02
  • 初学正则表达式

      前言:     在学正则表达式之前,有小伙伴讲解说,正则表达式在文本处理上功能非常强大、使用非常普遍,并且现在很多的工具软件都支持它,以后的学习工作中会经常使用,非常灵活,但是灵活的同时又是繁琐,需要小心翼翼的仔细推敲。抱着认真、好奇的心思听完了王老的课。我自己理解的正则表达式是,给一些符号赋予一定的涵义…

    Linux干货 2016-08-12
  • 教你如何在Fedora,CentOS,RHEL中检查RPM包的依赖性

    我们都知道,在基于红帽的Linux系统中,一个RPM包,需要把先将它依赖的其他包安装好才能正常的工作。对于终端用户,RPM的安装、更新、删除中存在的依赖关系已经被工具透明化了(如 yum或 DNF等)。但如果你是系统管理员或者RPM包的管理员,你需要谙熟RPM包的依赖关系,以便及时更新、删除适当的包来保证系统的正常运行。 在本教程中,我将教大家如何检查RPM…

    Linux干货 2015-02-10
  • 马哥教育网络班21期+第四周博客作业

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 [root@C67-X64-A0 ~]# cp -a /etc/skel/ /home/tuser1 [root@C67-X64-A0 ~]# ls&nb…

    Linux干货 2016-07-29