3.21 Linux PATH環境變數及作用(初學者必讀)
在講解 PATH 環境變數之前,首先介紹一下 which 命令,它用於查詢某個命令所在的絕對路徑。例如:
[root@localhost ~]# which rm
/bin/rm
[root@localhost ~]# which rmdir
/bin/rmdir
[root@localhost ~]# which ls
alias ls='ls --color=auto'
/bin/ls
注意,ls 是一個相對特殊的命令,它使用 alias 命令做了別名,也就是說,我們常用的 ls 實際上執行的是 ls --color=auto。
通過使用 which 命令,可以查詢各個外部命令(和 shell 內建命令相對)所在的絕對路徑。學到這裡,讀者是否有這樣一個疑問,為什麼前面在使用 rm、rmdir、ls 等命令時,無論當前位於哪個目錄,都可以直接使用,而無需指明命令的執行檔案所在的位置(絕對路徑)呢?其實,這是 PATH 環境變數在起作用。
首先,執行如下命令:
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/root/bin
這裡的 echo 命令用來輸出 PATH 環境變數的值(這裡的 $ 是 PATH 的字首符號),PATH 環境變數的內容是由一堆目錄組成的,各目錄之間用冒號“:”隔開。當執行某個命令時,Linux 會依照 PATH 中包含的目錄依次搜尋該命令的可執行檔案,一旦找到,即正常執行;反之,則提示無法找到該命令。
如果在 PATH 包含的目錄中,有多個目錄都包含某命令的可執行檔案,那麼會執行先搜尋到的可執行檔案。
從執行結果中可以看到,/bin 目錄已經包含在 PATH 環境變數中,因此在使用類似 rm、rmdir、ls等命令時,即便直接使用其命令名,Linux 也可以找到該命令。
為了印證以上觀點,下面舉個反例,如果我們將 ls 命令移動到 /root 目錄下,由於 PATH 環境變數中沒有包含此目錄,所有當直接使用 ls 命令名執行時,Linux 將無法找到此命令的可執行檔案,並提示 No such file or directory,示例命令如下:
[root@localhost ~]# mv /bin/ls /root [root@localhost ~]# ls bash: /bin/ls: No such file or directory
此時,如果仍想使用 ls 命令,有 2 種方法,一種是直接將 /root 新增到 PATH 環境變數中,例如:
[root@localhost ~]# PATH=$PATH:/root
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/sbin:/usr/local/bin:/usr/bin:/bin:/root/bin:/root
[root@localhost ~]# ls
Desktop Downloads Music post-install Public Videos
Documents ls Pictures post-install.org Templates
注意,這種方式只是臨時有效,一旦退出下次再登陸的時候,$PATH 就恢復成了預設值。
另一種方法是以絕對路徑的方式使用此命令,例如:
[root@localhost ~]# /root/ls
Desktop Downloads Music post-install Public Videos
Documents ls Pictures post-install.org Templates
為了不影響系統的正常使用,強烈建議大家將移動後的 ls 檔案還原,命令如下:
[root@localhost ~]# mv /root/ls /bin