以当前学习进度判断命令执行优先级!

来源:互联网 发布:成都中科大cms漏洞 编辑:程序博客网 时间:2024/05/22 12:11

当运维人员运用LINUX的命令操纵计算机时,只是限于单纯的使用命令,而没有更深入的了解命令所执行的优先级,其实在操作系统内部,是有着严格的命令执行优先级的,这样才够保证系统的正常运作,避免命令执行时不分主序产生混乱。
在研究命令的主次执行顺序之前,我们应该先了解一下liunx系统中命令的分类基础知识:
(1)内部命令(builtin:内部命令又叫做内建命令,是系统创建之初就写入到内存之中的,其具有调用速率快的特点,可以通过enable来查看具体的内部命令。
(2)外部命令:外部命令是操作系统中程序所携带的指令,由于程序自身较复杂且数据量大,所以外部命令不得全部存储于内存中,只有在调用时才临时存储于内存中。
(3)别名(alias):别名是对当前命令的拓展,可以运用当前已有命令(包括内、外部命令)加以编制,实现更强大或更便捷的组合命令。
命令类型的分辨
如何才能有效的分辨命令的所属类型呢,这里了就要用到type命令了,type的作用就是判断命令的类别和当前执行路径信息,下面结合实验结果加以说明:

[root@localhost ~]# type nanonano is /bin/nano[root@localhost ~]# type catcat is hashed (/bin/cat)[root@localhost ~]# type -t catfile[root@localhost ~]# type cdcd is a shell builtin[root@localhost ~]# type lsls is aliased to `ls --color=auto'

这里可以看到的是,分别对ls,cd,cat,nano几条命令用type进行查看,通过分析,可以看出:
(1)nano是外部命令,命令路径为/bin/nano
(2)cat是存在于hash表中的外部命令
(4)cd是shell的内建命令
(3)ls的当前状态是别名


现在判断外部命令是如何判断执行的,这里就要提到$PATH变量了,外部命令通过该变量内的路径,一一对应外部命令进行查询,能查询到结果,进行执行,否则报错

[root@localhost ~]# echo $PATH/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin    <==观察到$PATH变量中是多个路径的列举[root@localhost ~]# type nanonano is /bin/nano[root@localhost bin]# ls /bin/nano/bin/nano    <==根据type只是成功找到nano命令文件[root@localhost bin]# mv /bin/nano /usr/sbin/   <==延路径列向右移动nano命令文件[root@localhost bin]# type nanonano is /sbin/nano <==观察到执行路径随之改变[root@localhost bin]# cp /sbin/nano /usr/local/sbin   <==把文件复制一份到列表前列一份[root@localhost bin]# type nanonano is /usr/local/sbin/nano    <==观察到外部命令执行靠左列位置,而忽略了右边命令文件

结论一:外部命令是延$PATH的内设路径由左至右搜寻的


由上可以观察到

cat is hashed (/bin/cat)

那么hashed是怎么一回事呢,hash指的就是哈希表,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。那么也就是说系统为了提高外部命令的查找执行速度,在外部命令执行后,就会将这个路径临时记录到内存中供下次快速查询使用。下面我们将判断hash和外部命令的执行优先级

[root@localhost bin]# type catcat is hashed (/bin/cat)    <==由于之前使用过cat命令,hash表中以存在路径[root@localhost bin]# cat /tmp/anaconda.log    <==可正常使用     11:32:33,978 DEBUG anaconda: setting locale to: en_US.UTF-811:32:48,700 DEBUG anaconda: Entered hub: InitialSetupMainHub...部分省略...11:33:19,398 DEBUG anaconda: network spoke (apply), no changes detected11:33:19,398 DEBUG anaconda: Left spoke: NetworkSpoke[root@localhost ~]# mv /bin/cat /usr/local/sbin    <==移动hash表中存储路径的cat文件到$PATH变量另一路径,理论上不产生影响[root@localhost ~]# cat /tmp/anaconda.log    <==但发现执行失败-bash: /usr/bin/cat: No such file or directory

由上可知,当hash表中存在了外部命令的缓存路径,就不会再去搜寻$PATH变量中路径。

结论二: hash表中外部命令优先级大于$PATH中存储的外部命令路径


[root@localhost ~]# type pwdpwd is a shell builtin

由上可以观察到cd命令是内部命令,那么我们仅用它,看看会发生什么

[root@localhost tmp]# enable -n pwd    <==禁用pwd[root@localhost tmp]# enable -n    <==查看禁用结果enable -n pwd    <==确定禁用生效[root@localhost tmp]# pwd    <==尝试运行/tmp    <==依然运行成功

这就奇怪了,为什么明明已经被禁用,然后却仍难能运行呢,为了研究透彻,我们接着查询该命令

[root@localhost tmp]# type pwdpwd is hashed (/usr/bin/pwd)

发现其被存入了hash缓存表,所以仍能运行,但是等等,不是只有外部命令才能存入这高效又神奇的缓存表么,你个内部命令,不来就在内存中,还抢什么抢,其实不尽然

[root@localhost tmp]# type -a pwdpwd is /usr/bin/pwd

现在再查,晕,原本的内部命令,变成了外部命令运行,也就是说当内部命令没被禁时,它以内部身份运行,被禁用了,就以hash缓存中外部命令身份运行了。

结论三:内部命令优先级高于hash缓存中外部命令


[root@localhost ~]# type lsls is aliased to `ls --color=auto'

这也就是别名,别名好理解了,上篇博客已经说明了别名的设置和使用,这里也就不在赘述。
下面证实别名的优先级

[root@localhost tmp]# type cd    <==查询cd类型cd is a shell builtin    <==证实cd为内部命令[root@localhost tmp]# alias cd="echo i am alias"    <==设置与cd同名的别名[root@localhost tmp]# cd ~    <==尝试运行cdi am alias /root    <==执行结果

由执行就过不难看出,生效的为别名,而非内部命令cd本身的作用,所以得出结论

结论四:别名优先级高于内部命令


总结:通过以上简单实验,验证出了LINUX中命令的执行优先级:别名alias >内部命令>缓存到hash里的外部命令>外部命令$PATH路径,并且PATH中靠左侧路径优先于右侧搜寻执行

PS:本结论只局限于当前的学习进度与认知水平,查阅网上资源得知还存在复合命令、函数,也应参与排序,随着后期的学习,会对本篇博客进行更新,愿谅解.

原创粉丝点击