Linux PATH環境變數及作用(初學者必讀)

2020-07-16 10:05:08
在講解 PATH 環境變數之前,首先介紹一下 which 命令,它用於查詢某個命令所在的絕對路徑。例如:
[[email protected] ~]# which rm
/bin/rm
[[email protected] ~]# which rmdir
/bin/rmdir
[[email protected] ~]# which ls
alias ls='ls --color=auto'
        /bin/ls
注意,ls 是一個相對特殊的命令,它使用 alias 命令做了別名,也就是說,我們常用的 ls 實際上執行的是 ls --color=auto。

通過使用 which 命令,可以查詢各個外部命令(和 Shell 內建命令相對)所在的絕對路徑。學到這裡,讀者是否有這樣一個疑問,為什麼前面在使用 rm、rmdir、ls 等命令時,無論當前位於哪個目錄,都可以直接使用,而無需指明命令的執行檔案所在的位置(絕對路徑)呢?其實,這是 PATH 環境變數在起作用。

首先,執行如下命令:
[[email protected] ~]# 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,範例命令如下:
[[email protected] ~]# mv /bin/ls /root
[[email protected] ~]# ls
bash: /bin/ls: No such file or directory

此時,如果仍想使用 ls 命令,有 2 種方法,一種是直接將 /root 新增到 PATH 環境變數中,例如:
[[email protected] ~]# PATH=$PATH:/root
[[email protected] ~]# echo $PATH
/usr/local/sbin:/usr/sbin:/usr/local/bin:/usr/bin:/bin:/root/bin:/root
[[email protected] ~]# ls
Desktop    Downloads    Music    post-install     Public    Videos
Documents  ls           Pictures post-install.org Templates

注意,這種方式只是臨時有效,一旦退出下次再登陸的時候,$PATH 就恢復成了預設值。


另一種方法是以絕對路徑的方式使用此命令,例如:
[[email protected] ~]# /root/ls
Desktop    Downloads    Music    post-install     Public    Videos
Documents  ls           Pictures post-install.org Templates

 

為了不影響系統的正常使用,強烈建議大家將移動後的 ls 檔案還原,命令如下:

[[email protected] ~]# mv /root/ls /bin