內部命令與外部命令

今天用串口線操作開發板時,由於串口線的問題,輸入的命令老有錯誤顯示。再次開機時輸入命令時有時提示命令找不到。cd命令可以,ls、vi等命令一律提示命令找不到。

想不通是哪裏錯了,重新燒錄內核還是有一樣的問題。我便認爲是文件系統什麼地方出問題了,想要重新燒錄文件系統。可是原來文件系統裏的東西便都沒了,謹慎起見先給師兄打電話問了一下。結果師兄一席話點醒夢中人。

原來linux中的命令分爲內部命令和外部命令:

所謂的內部命令是寫在bash原始碼裡面的(這邊假設談的是bash),你要修改這些內部命令除非透過修改bash的原始碼。

而外部命令纔是bash之外自己額外安裝的,比方通常在/bin, /usr/bin, /sbin, /usr/sbin.....等。

例如:type是個內建命令。

  1. # type type
  2. type is a shell builtin
  3. # echo $PATH
  4. /sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/opt/kde3/bin:/usr/lib/jvm/jre/bin:/usr/lib/mit/bin:/usr/lib/mit/sbin
  5. # which type
  6. which: no type in (/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/opt/kde3/bin:/usr/lib/jvm/jre/bin:/usr/lib/mit/bin:/usr/lib/mit/sbin)


上面很容易發現,type是個內建命令。

像ls、vi屬於外部命令,必須將其所在目錄包含進PATH環境變量才能正常使用,而cd、echo屬於內部命令,一直都可使用。

我用echo $PATH命令查看了一下PATH環境變量,果然PATH的內容被破壞了。重新將/bin, /usr/bin, /sbin, /usr/sbin等目錄加入後恢復正常。

 

補充:

命令可能是一個關鍵詞(if, while, function, untill等),一個別名(如:alias ll='ls -l'),一個函數(如:function hello { echo "Hello"; }),一個內置命令(cd, type等),應用程序(可執行程序或shell腳本)。

shell會按照命令的類型按先後順序來執行它們。下面會用實驗來檢驗一下。

以下摘自《Learning the bash shell, 3rd Edition》
1, Aliases

2, Keywords such as function and several others, like if and for

3, Functions

4, Built-ins like cd and type

5, Scripts and executable programs, for which the shell searches in the directories listed in the PATH environment variable

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章