Linux命令有內(nèi)部命令(內(nèi)建命令)和外部命令之分,內(nèi)部命令和外部命令功能基本相同,但是其工作機(jī)制相差很大。本文就內(nèi)建命令和外部命令做一下介紹。
一、內(nèi)部命令(內(nèi)建命令)
內(nèi)部命令,實(shí)際上是shell程序的一部分,其中包含的是一些比較簡單的linux系統(tǒng)命令,這些命令由shell程序識別并在shell程序內(nèi)部完成運(yùn)行,通常在linux系統(tǒng)加載運(yùn)行時(shí)shell就被加載并駐留在系統(tǒng)內(nèi)存中。內(nèi)部命令是寫在bashy源碼里面的,其執(zhí)行速度比外部命令快,因?yàn)榻馕鰞?nèi)部命令shell不需要創(chuàng)建子進(jìn)程。比如:exit,history,cd,echo等。
所以在內(nèi)部命令被執(zhí)行的時(shí)候是先去內(nèi)存里面查找,然后再被執(zhí)行。
二、外部命令
外部命令是linux系統(tǒng)中的實(shí)用程序部分,因?yàn)閷?shí)用程序的功能通常都比較強(qiáng)大,所以其包含的程序量也會很大,因此系統(tǒng)加載時(shí)并不隨系統(tǒng)一起被加載到內(nèi)存中。只有在需要時(shí)才被系統(tǒng)調(diào)用到內(nèi)存。通常外部命令的實(shí)體并不包含在shell中,但是其命令執(zhí)行過程是由shell程序控制的。shell程序管理外部命令執(zhí)行的路徑查找、加載存放,并控制命令的執(zhí)行。外部命令是在bash之外額外安裝的,通常放在/bin,/usr/bin,/sbin,/usr/sbin……等等??赏ㄟ^“echo $PATH”命令查看外部命令的存儲路徑,比如:ls、vi等。
三、內(nèi)部命令和外部命令的其他相關(guān)介紹
1)如何區(qū)分二者
判斷一個(gè)命令是內(nèi)部命令還是外部命令的方法是:type command
[root@localhoast ~]# type pwdpwd is a shell builtin
[root@localhoast ~]# type vimvim is /usr/bin/vi
顯示的builtin就表示該命令是內(nèi)部(內(nèi)建命令),顯示出執(zhí)行路徑的命令就是外部命令。
2)二者的執(zhí)行過程
內(nèi)部命令被用戶執(zhí)行時(shí)系統(tǒng)會從內(nèi)存中去調(diào)用,調(diào)用的速率快。外部命令被執(zhí)行的時(shí)候,系統(tǒng)將會讀取環(huán)境變量文件.bash_profile、/etc/profile去找PATH路徑。
然后在提一下命令的調(diào)用,有些外部命令被使用過后,會存在在hash表中,當(dāng)你再次輸入該命令它的調(diào)用會是這樣一個(gè)過程。
hash——>內(nèi)置命令——>PATH 命令的調(diào)用其實(shí)應(yīng)該是這樣一個(gè)過程。hash的優(yōu)先級最高,然后是內(nèi)部命令,最后是外部命令。
[root@localhost ~]# pwd
/root
[root@localhost ~]# ls
anaconda-ks.cfg install.log install.log.syslog
[root@localhost ~]# hash -l
//顯示hash表
builtin hash -p /bin/cat cat
builtin hash -p /bin/ls ls
從hash表中可以看出,hash表不存放系統(tǒng)內(nèi)置命令。
文章來源:運(yùn)維部落