1. 內部命令與外部命令
內部命令:由shell自帶的,而且通過某命令形式提供
內部命令在系統啟動時就調入內存,是常駐內存的,所以執行效率高。
外部命令:在文件系統路徑下有對應的可執行程序文件
外部命令是系統的軟件功能,用戶需要時才從硬盤中讀入內存。
2. 命令類型
(1)判斷命令類型
使用type可以判斷一個命令是內部命令還是外部命令
如圖,cd為內部命令,ifconfig為外部命令。
(2)enable 顯示所有啟用的內部命令
enable -a顯示所有內部命令
(3)enable |wc -l 統計啟用的內部命令數量(l是字母不是數字1)
統計出共61條
(4)enable -n COMMAND禁用命令
例如,輸入enable –n bg,就可以禁用bg。
輸入enable |wc –l 查詢發現只有60個
再用enable查詢,發現果然沒有bg了,即被禁用了。
輸入enable –n可以查詢所有被禁用的命令
同樣,可以使用enable
-n |wc -l 統計被禁用的內部命令數量,可以使用enable
-a |wc -l 統計所有的內部命令數量
(5)enable COMMAND啟動命令
使用enable可以使被禁用的命令重新啟動
將那三條命令重新啟動,查詢被禁用里面為空,且啟動命令數又恢復到61個了。
(6)關于禁用
禁用內部命令并不是說不能使用,而是需要從硬盤當中去其路徑中尋找所對應的外部命令。
3. hash
(1)緩存路徑
系統初始hash表為空,當外部命令執行時,默認會從PATH路徑下尋找該命令,找到后會將這條命令的路徑記錄到hash表中,當再次使用該命令時,shell解釋器首先會查看hash表,存在將執行之,如果不存在,將會去變量PATH路徑下尋找。
使用 echo 查看PATH的路徑:
以冒號為間隔符,從左到右依次尋找。
利用hash緩存表可大大提高命令的調用速率。
如圖,fdisk是一個外部命令,當運行過后,這個命令就多了一個hash,即將路徑緩存了下來。
緩存過后就不用去PATH路徑依次去找了。
※這里舉一個例子。分別運行pwd和ifconfig,使其緩存到hash里,可以看到ifconfig的路徑在pwd之前。然后我們使用cp命令,將ifconfig復制到pwd之前的路徑并且也命名為pwd。從理論上來說,應該通過路徑按照順序從左到右去尋找,會先找到/usr/local/sbin/pwd,內容應該為ifconfig的內容,但是我們執行pwd之后發現仍然是pwd的結果,并且查詢pwd的路徑仍然為/bin/pwd。
這就說明,在之前運行的時候就已經將pwd的路徑緩存到/bin/pwd中了,所以再次運行時不需要在PATH路徑中依次尋找,而是調用hash緩存中的路徑。
(2)hash 顯示當前被hash的所有外部命令
hash -l 顯示當前被hash的外部命令,包含別名
(3)hash -d name刪除hash
現在我們將hash中的緩存的pwd刪除,刪除時需要輸入的name就是用hash –l查到的別名。
可以看出列表中沒有了pwd。
然后我們查看一下pwd的類型,發現地址變成之前復制過去的地址了,因為緩存被刪除了。
所以此時執行pwd,應該是ifconfig的內容了。
PS:也可以使用hash -r 清空所有的hash。
hash -p /…/…. name 可以手動增加一個hash緩存。
總結:當執行一個命令時,它的優先級為:
內部命令> hash
> PATH
原創文章,作者:T_endless,如若轉載,請注明出處:http://www.www58058.com/80244