這裡介紹 UNIX/Linux 系統中內部(internal)指令與外部(external)指令的差異所在。
一般的 UNIX 或 Linux 系統中的指令可分為兩種,分別為內部(internal)指令與外部(external)指令,對於一般的 Linux 新手而言,可能很少注意到這個問題,而了解它們之間的差異對於撰寫指令搞會有一些幫助。以下我們會說明這兩種指令的定義與其中的差別。
所謂的內部指令就是指內建在 shell 中的指令,也就是說當你執行這類的指令時,系統並不會因為要執行這個指令而產生額外的行程(process),所以內部指令的執行效率非常高,例如最常用的更換工作目錄指令 cd 就是一個典型的內部指令,執行這個指令時,不會產生任何額外的行程,只會單純變更工作目錄而已。除了 cd 之外,也有很多指令都是屬於內部指令,如:source、bg、fg 與 pwd 等。
外部指令就是指那些不是內建於 shell 中的指令,這類的指令通常是一個二進位的執行檔或是一個可執行的指令稿(script),在執行這類的指令時,系統就會產生而外的行程,所以執行效率也就會比較低一些。一些常見的外部指令有:cat、mv、sed 與 perl 等。
如果想要知道一個指令是屬於哪一種,可以只用 type command 來判斷,其中 command 就是想要檢查的指令名稱。例如若要檢查 cd 這個指令,就用:
type cd
輸出為
cd is a shell builtin
這就表示 cd 是內建於 shell 中的指令,也就是內部指令。如果是外部指令,就會直接顯示該指令的絕對路徑,例如:
type cat
輸出為
cat is /bin/cat
根據上面的說明,你應該就會了解在撰寫指令稿時可以盡量使用內部指令,以增加執行效率,但是大部分的人其實都很少會去注意自己所使用的是內部指令還是外部指令,因為如果指令稿根本就沒幾行,你可能根本看不出內部指令與外部指令的差異,這個差異大概只有在指令稿很大的時候才會比較明顯。
另外,在撰寫指令稿時也不見得常常有機會可以使用內部指令來代替外部指令,而且這也要自己對於 shell 的程式設計功力夠強才有辦法。
舉例來說,如果要算兩個數值相加可以使用
n=`expr $i+$j`
其中的 expr 就是一個外部指令,這時候就可以用
let n=i+j
這個內部的指令來代替,這樣執行效率就可以提升,而其效果是一樣的。