Linux命令優(yōu)先級(jí)

image.png

基礎(chǔ)概念

linux命令是對(duì)Linux系統(tǒng)進(jìn)行管理的命令。對(duì)于Linux系統(tǒng)來說,無論是中央處理器、內(nèi)存、磁盤驅(qū)動(dòng)器、鍵盤、鼠標(biāo),還是用戶等都是文件,Linux系統(tǒng)管理的命令是它正常運(yùn)行的核心,與之前的DOS命令類似。linux命令在系統(tǒng)中有兩種類型:內(nèi)部Shell命令和外部命令。

內(nèi)部命令:集成在bash的命令,就是內(nèi)部命令。內(nèi)部命令依賴于shell類型。這些命令由shell程序識(shí)別并在shell程序內(nèi)部完成運(yùn)行,通常在linux系統(tǒng)加載運(yùn)行時(shí)shell就被加載并駐留在系統(tǒng)內(nèi)存中。內(nèi)部命令是寫在bash源碼里面的,其執(zhí)行速度比外部命令快,因?yàn)榻馕鰞?nèi)部命令shell不需要?jiǎng)?chuàng)建子進(jìn)程。

外部命令:外部命令是在bash之外額外安裝的,在文件系統(tǒng)路徑$PATH有對(duì)應(yīng)的可執(zhí)行程序文件,就是外部命令。在系統(tǒng)加載時(shí)并不隨系統(tǒng)一起被加載到內(nèi)存中,而是在需要時(shí)才將其調(diào)用內(nèi)存。

命令別名:在管理和維護(hù)Linux系統(tǒng)的過程中,將會(huì)使用到大量命令,有一些很長的命令或用法經(jīng)常被用到,重復(fù)而頻繁地輸入某個(gè)很長命令或用法是不可取的。這時(shí)可以使用命令別名功能將這個(gè)過程簡單化。

hash:系統(tǒng)初始hash表為空,當(dāng)外部命令執(zhí)行時(shí),默認(rèn)會(huì)從PATH路徑下尋找該命令,找到后會(huì)將這條命令的路徑記錄到hash表中,當(dāng)再次使用該命令時(shí),shell解釋器首先會(huì)查看hash表,存在將執(zhí)行之,如果不存在,將會(huì)去PATH路徑下尋找。利用hash緩存表可大大提高命令的調(diào)用速率。

Linux命令執(zhí)行過程
1、當(dāng)輸入一個(gè)命令后,系統(tǒng)會(huì)先判斷該命令是否是內(nèi)部命令,如果是內(nèi)部命令,則直接在內(nèi)存當(dāng)中讀取運(yùn)行。
2、系統(tǒng)初始hash表為空,當(dāng)外部命令執(zhí)行時(shí),默認(rèn)會(huì)從PATH路徑下尋找該命令,找到后會(huì)將這條命令的路徑記錄到hash表中,當(dāng)再次使用該命令時(shí),shell解釋器首先會(huì)查看hash表,存在將執(zhí)行之,如果不存在,將會(huì)去PATH路徑下尋找。利用hash緩存表可大大提高命令的調(diào)用速率。

Linux命令的優(yōu)先級(jí)

實(shí)驗(yàn)內(nèi)容:本實(shí)驗(yàn)將比較別名命令,內(nèi)部命令,外部命令,以及hash 的優(yōu)先級(jí)

1、內(nèi)部命令和hash和外部命令

首先我們先比較內(nèi)部命令和外部命令,以及hash的優(yōu)先級(jí)。這里我們拿Linux最簡單的echo命令做一次實(shí)驗(yàn)。
我們先查看一下echo這個(gè)命令的基本情況:

[root@CentOS6 ~]#type echo
echo is a shell builtin
[root@CentOS6 ~]#which echo
/bin/echo
[root@CentOS6 ~]#type -a echo
echo is a shell builtin
echo is /bin/echo

上面可以看到echo既有內(nèi)部命令,也有外部命令。
上面的操作中,我們禁用了echo的內(nèi)部命令。當(dāng)我們兩次使用echo的時(shí)候,系統(tǒng)都調(diào)用了echo的外部命令,hash上面有兩次執(zhí)行記錄。

[root@CentOS6 ~]#enable -n echo
[root@CentOS6 ~]#type echo
echo is /bin/echo
[root@CentOS6 ~]#echo Hello World!
Hello World!
[root@CentOS6 ~]#hash
hits    command
   1    /bin/echo
 [root@CentOS6 ~]#echo Hello World!
Hello World!
[root@CentOS6 ~]#hash
hits    command
   2    /bin/echo
[root@CentOS6 ~]#

接下來我們使能echo的內(nèi)部命令,再觀察一下我們使用echo命令時(shí),系統(tǒng)調(diào)用的是內(nèi)部命令還是外部命令。

[root@CentOS6 ~]#enable echo
[root@CentOS6 ~]#
[root@CentOS6 ~]#hash
hits    command
   2    /bin/echo
[root@CentOS6 ~]#echo Laowang
Laowang
[root@CentOS6 ~]#hash
hits    command
   2    /bin/echo
[root@CentOS6 ~]#

當(dāng)使能了echo內(nèi)部命令后,再次執(zhí)行echo命令后,hash的echo執(zhí)行記錄還是2次??梢耘袛喑?,當(dāng)內(nèi)部命令以及外部命令都可用的情況下,系統(tǒng)優(yōu)先調(diào)用了echo的內(nèi)部命令。

小結(jié):內(nèi)部命令>hash>外部命令

2、別名命令和內(nèi)部命令

這次我們依舊用echo做一次實(shí)驗(yàn),我們先給echo設(shè)定一個(gè)別名,alias echo='echo -n',然后再執(zhí)行echo命令,看看最終系統(tǒng)輸出的是echo原命令,還是echo -n命令。

[root@CentOS6 ~]#alias echo='echo -n'
[root@CentOS6 ~]#alias
alias cp='cp -i'
alias echo='echo -n'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@CentOS6 ~]#

上面可以看到,我們成功設(shè)置了alias echo='echo -n'這個(gè)別名。接下來我們執(zhí)行以下echo命令進(jìn)行驗(yàn)證。

[root@CentOS6 ~]#echo Hello World!
Hello World![root@CentOS6 ~]#

可以看到,此處echo命令執(zhí)行的是別名命令echo -n!
小結(jié):當(dāng)一個(gè)內(nèi)部命令有同名的別名命令,系統(tǒng)會(huì)執(zhí)行它的別名命令。

3、別名命令和外部命令

可以看到ls有個(gè)同名的別名命令ls='ls --color=auto',當(dāng)執(zhí)行l(wèi)s命令時(shí),優(yōu)先使用別名命令。
小結(jié):當(dāng)一個(gè)外部命令有同名的別名命令,系統(tǒng)會(huì)執(zhí)行它的別名命令。


感謝閱讀這篇筆記,如有錯(cuò)誤的地方,謝謝指正!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容