Shell識別三種基本命令:內(nèi)建命令鸠匀、Shell函數(shù)以及外部命令:
(1)內(nèi)建命令就是由Shell本身所執(zhí)行的命令施掏。
有些命令是由于其必要性才內(nèi)建的鸟辅,例如cd用來改變目錄,read會將來自用戶(和文件)的輸入數(shù)據(jù)傳給Shell外亮猿推。
另一種內(nèi)建命令的存在則是為了效率片习,其中最典型的就是test命令,編寫腳本時經(jīng)常會用到它蹬叭。另外還有I/O命令藕咏,例如echo于printf.
(2)Shell函數(shù)是功能健全的一系列程序代碼,以Shell語言寫成秽五,它們可以像命令那樣引用孽查。
(3)外部命令就是由Shell副本(新的進(jìn)程)所執(zhí)行的命令,基本的過程如下:
a. 建立一個新的進(jìn)程坦喘。此進(jìn)程即為Shell的一個副本盲再。
b. 在新的進(jìn)程里,在PATH變量內(nèi)所列出的目錄中瓣铣,尋找特定的命令答朋。
/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin為PATH變量典型的默認(rèn)值。
當(dāng)命令名稱包含有斜杠(/)符號時棠笑,將略過路徑查找步驟梦碗。
c. 在新的進(jìn)程里,以所找到的新程序取代執(zhí)行中的Shell程序并執(zhí)行蓖救。
d. 程序完成后洪规,最初的Shell會接著從終端讀取下一條命令,和執(zhí)行腳本里的下一條命令藻糖。
使用type可以查看是否是內(nèi)建命令:
type (不帶參數(shù))會顯示命令是內(nèi)建命令還是外部命令
-t :file 外部命令;alias 命令別名;builtin 內(nèi)置命令
-a :會將命令PATH路徑顯示出來
如何執(zhí)行交互式命令:
用戶在命令行輸入命令后淹冰,一般情況下Shell會fork并exec該命令,但是Shell的內(nèi)建命令例外巨柒,執(zhí)行內(nèi)建命令相當(dāng)于調(diào)用Shell進(jìn)程中的一個函數(shù)樱拴,并不創(chuàng)建新的進(jìn)程.
比如:cd、alias洋满、umask晶乔、exit等命令即是內(nèi)建命令,凡是用which命令查不到程序文件所在位置的命令都是內(nèi)建命令牺勾,內(nèi)建命令沒有單獨(dú)的man手冊正罢,要在man手冊中查看內(nèi)建命令,應(yīng)該man bash-builtins驻民,內(nèi)建命令雖然不創(chuàng)建新的進(jìn)程翻具,但也會有Exit Status履怯,通常也用0表示成功非零表示失敗,雖然內(nèi)建命令不創(chuàng)建新的進(jìn)程裆泳,但執(zhí)行結(jié)束后也會有一個狀態(tài)碼叹洲,也可以用特殊變量$?讀出