1.查看CentOS7系统默认使用的shell类型
[root@CentOS7 ~]#echo $SHELL /bin/bash
默认是bash,在系统启动时就已经加载到内存中。一般,咱们把集成在shell中的命令就称为内部命令,可直接运行。 shell
2.shell中的命令类型
内部命令:集成在shell中,可直接在内存中运行。 缓存
3.如何判断一个命令的类型
[root@CentOS7 /]#help type type: type [-afptP] name [name ...] Display information about command type.
例如: bash
[root@CentOS7 ~]#type more more is /usr/bin/more [root@CentOS7 ~]#type pwd pwd is a shell builtin
根据上面所划分的类型能够看出more是一个外部命令,pwd是一个内部命令。 ide
ps:内部命令集成在shell中,系统优先使用内部命令。 工具
4.内部命令管理工具
[root@CentOS7 /]#help enable enable: enable [-a] [-dnps] [-f filename] [name ...] Enable and disable shell builtins.
a.查看内部命令 测试
[root@CentOS7 ~]#enable enable . enable : enable [ enable alias enable bg enable bind enable break enable builtin enable caller enable cd ...
b.启用内部命令 ui
enable cmd
c.禁用内部命令或显示已禁用的内部命令列表 code
禁用 orm
enable -n cmd [root@CentOS7 ~]#enable -n cd [root@CentOS7 ~]#enable -n echo
显示 blog
[root@CentOS7 ~]#enable -n enable -n cd enable -n echo
5.外部命令执行后发生了什么?
先来看下用type命令判断两个外部命令发生的结果:
[root@CentOS7 ~]#type uname uname is hashed (/usr/bin/uname) [root@CentOS7 ~]#type ifconfig ifconfig is /usr/sbin/ifconfig
由于在执行命令的时候,系统会先判断执行的命令是啥类型,若是是内部命令则直接运行,若是是外部命令就会根据系统PATH变量路径来查找该命令所在的路径而后运行,而且运行后会把该命令路径缓存在内存中,当下次运行时就不用再从PATH路径中挨个搜索了,而是直接在内存中找,这样不只能减小磁盘压力,并且还能提升命令的执行效率。ifconfig命令的判断结果中之因此没出现hashed字样,是由于这个命令尚未被执行过。
6.命令缓存在内存中除了能提升执行效率还有啥“优点”?
[root@CentOS7 ~]#tty /dev/pts/0 [root@CentOS7 ~]#uname -r 3.10.0-957.el7.x86_64 [root@CentOS7 ~]#which uname /usr/bin/uname [root@CentOS7 ~]#mv `!!` /usr/sbin/ mv `which uname` /usr/sbin/ [root@CentOS7 ~]#uname -r bash: /usr/bin/uname: No such file or directory [root@CentOS7 ~]#hash hits command 1 /usr/bin/tty 1 /usr/bin/which 1 /usr/bin/mv 2 /usr/bin/uname
有时候会由于一些须要或者误操做移动了命令的路径,再次执行的时候就会报“-bash: xxx: No such file or directory”这种错误,这是为啥呢?根据上面的示例来分析一下:
a.当外部命令第一次执行后就会被缓存到内存中,当下次再执行这条命令的时候bash就会直接从内存中去找;
b.可是,因为命令路径被移动了,而内存中缓存的倒是原来的路径,故会报错,经过上面的hash命令来能够发现命令的当前路径和缓存在内存中的路径是不一致的。
可经过如下方法来解决该问题:
执行hash -d cmd来删除命令被缓存在内存中的位置,再次执行就会使用被移动后的路径;
7.总结
前面比较了内部命令和外部命令的区别,发现内部命令的执行效率要比外部命令的高,由于内部命令直接内置在shell中,而外部命令是存在磁盘中的。但事实上还有一种命令优先级比内部命令还要高。
[root@CentOS7 ~]#alias history='uname -r' [root@CentOS7 ~]#history 3.10.0-957.el7.x86_64 [root@CentOS7 ~]#hash hits command 1 /usr/bin/uname
能够看出显示的结果是别名执行获得的,当别名和原始命令同名,可是要使用原始命令的时候能够经过如下方式执行:
[root@CentOS7 ~]#\history 1 179 \history 1 [root@CentOS7 ~]#'history' 1 180 'history' 1
经过以上测试能够得出Linux命令执行的顺序以下: