Shell PATH變數用法詳解:系統查詢命令的路徑

2020-07-16 10:04:34
前面章節我們說過,程式指令碼要想在 Linux 中執行,需要使用絕對路徑或相對路徑指定這個指令碼所在的位置。但是為什麼系統命令都沒有指定路徑而是直接執行的?比如,ls 命令並沒有輸入"/bin/ls"來執行,而是直接執行"ls"命令。這就是 PATH 環境變數的功能了。

先查詢一下 PATH 環境變數的值,如下:

[[email protected] ~]# echo $PATH
/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/
bin:/root/bin

PATH 變數的值是用":"分隔的路徑,這些路徑就是系統查詢命令的路徑。也就是說,我們輸入了一個程式名,如果沒有寫入路徑,系統就會到 PATH 變數定義的路徑中去尋找是否有可以執行的程式,如果找到則執行,否則會報"命令沒有發現"的錯誤。

那麼,是不是我們把自己寫的指令碼複製到 PATH 變數定義的路徑中也可以不輸入路徑而直接執行呢?當然是可以的,我們試試吧,就拿最開始的 hello.sh 來舉例吧。

[[email protected] ~]# cp /root/sh/hello.sh /bin/
#複製hello.shi到/bin/目錄中
[[email protected] ~]# hello.sh
c.biancheng.net
#hello.sh可以直接執行了

我們只要把程式指令碼複製到 PATH 變數定義的任意路徑中,比如 /bin/ 目錄下,以後這個指令碼就可以直接執行了,不用再指定絕對路徑或相對路徑。

如果我們把自己寫的所有程式指令碼都放在 /bin/ 目錄下,那麼有時會搞不清系統命令和自己寫的程式(其實筆者很反對改變系統目錄的結構的)。我們是不是可以修改 PATH 變數的值,而不把程式指令碼複製到 /bin/ 目錄中?

當然是可以的,通過變數的疊加就可以實現了。

[[email protected] ~]# PATH="$PATH":/root/sh
#在變數PATH的後面,加入/root/sh目錄
[[email protected] ~]# echo $PATH
/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/
bin:/root/bin:/root/sh
#查詢PATH的值,變數疊加生效了

當然,這樣定義的 PATH 變數只能臨時生效,一旦重新啟動或登出系統就會消失。如果想要永久生效,則需要寫入環境變數組態檔,我們會在後續章節中再詳細介紹。