以当前学习进度判断命令执行优先级!
来源:互联网 发布:成都中科大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:本结论只局限于当前的学习进度与认知水平,查阅网上资源得知还存在复合命令、函数,也应参与排序,随着后期的学习,会对本篇博客进行更新,愿谅解.
- 以当前学习进度判断命令执行优先级!
- dd命令显示当前进度
- 查看dd命令的执行进度
- 查看dd命令的执行进度
- 判断当前进程是否以管理员权限运行
- 如何使用pv命令监控Linux命令的执行进度
- 【linux学习笔记】命令执行判断依据(';'、'&&'、'||')管线命令('|')以及cut、grep命令
- 判断命令是否成功执行 .
- 命令执行的判断依据: ; , &&, ||
- android查看当前手机中的进程、优先级(命令)
- APK以ROOT身份执行命令
- Linux强制退出当前执行命令
- 如何判断是否以独占方式打开当前数据库?
- 如何判断是否以独占方式打开当前数据库?
- 如何判断是否以独占方式打开当前?
- 如何判断是否以独占方式打开当前数据库?
- 判断当前进程是否"以管理员身份运行"的
- 判断当前进程是否"以管理员身份运行"的
- 大学生活随笔
- hdu 1754 I Hate It【线段树入门+模板详解】
- 16-Vue事件处理
- acm 快速排序
- 在hadoop集群上安装hive和mysql
- 以当前学习进度判断命令执行优先级!
- 并行开发笔记-3.使用互斥元(临界区)保护
- android中RGB颜色查询对照表
- 环境配置-mysql安装
- Node--Sequlize搭建服务
- 1002. 写出这个数
- App复活
- python dict 和set 详解
- 解决Maven的Could not calculate build plan的方法