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命令執行的順序以下: