『忘了再學』Shell基礎 — 13、環境變數(一)

繁華似錦Fighting 發表於 2022-05-18

提示:

在Shell中,環境變數分為兩種。一種是使用者自定義的環境變數,另一種是系統自帶的環境變數。

而在系統自帶的環境變數中,PATH環境變數、PS1環境變數、LANG語系變數需要進行說明一下。

本篇文章主要說明使用者自定義的環境變數,和PATH環境變數。

1、使用者自定義的環境變數

(1)環境變數設定

使用export關鍵字宣告的變數就是環境變數。
格式:

[[email protected] ~]# export AGE="18"

也可以先定義一個自定義變數,然後把自定義變數宣告稱環境變數。如下:

[[email protected] ~]# AGE=18
[[email protected] ~]# export AGE

注:
環境變數名稱一般要用大寫。
環境變數的作用域,在父子Shell中都可檢視。

(2)查詢自定義環境變數

env命令和set命令的區別是,set命令可以檢視所有變數,而env命令只能檢視環境變數。(具體看上一篇文章)

這裡說明一下env命令和set命令所檢視的一些重要的內容,以後就不詳細說明了。

(1)env命令

image

(2)set命令

env命令可以查詢到所有的環境變數,但是還有一些變數是env命令檢視不到的,這些變數雖然不是環境變數,卻是和Bash操作介面相關的變數,這些變數也對我們的Bash操作終端起到了重要的作用。這些變數就只能用set命令來檢視了,只列出重要的內容,如下:

image

(3)刪除自定義環境變數

和使用者定義變數一樣,用unset命令刪除變數。

#刪除環境變數 gender
[[email protected] ~]# unset gender

2、系統自帶的環境變數——PATH環境變數

系統自帶的環境變數的名稱和作用都不能夠改變。

系統的環境變數,用上邊介紹的env命令和set命令都可以查出。我們接下來說明幾個比較重點的環境變數。

(1)PATH環境變數

檢視當前系統PATH環境變數的值:

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

每次執行env命令和set命令都要在好多變數中找我們需要檢視的變數很麻煩,可以使用上面的方式直接檢視我們所需的變數的值。

(2)PATH環境變數的作用

PATH變數的作用:系統查詢命令的路徑。

你回想一下,在說明Shell執行指令碼執行的時候說過,有兩種方法可以執行Shell指令碼,一個是通過絕對路徑或者相對路徑執行指令碼,如:/root/hello.sh或者./hello.sh。還有一種方法是直接執行bash命令執行指令碼,如:bash hello.sh。我們當時建議用第一種方式。(在Linux系統中,所有的執行檔案,都應該使用絕對路徑來執行它)

但是我們有沒有發現,比如我們之前所執行過的一些系統命令,如ls命令,我們知道ls命令在系統的bin目錄下。如下圖:

image

但是我們直接執行ls命令,並沒有使用絕對路徑,系統就能夠執行ls命令,這是為什麼呢?

根本原因就是在這個PATH環境變數中。
PATH環境變數中配置的這些路徑,就是系統查詢命令的路徑。也就是說當我們輸入了一個程式名,如果沒有寫命令的路徑,系統就會到PATH環境變數定義的路徑中去尋找,是否有可以執行的程式。從左到右一個一個目錄查詢你所要執行的命令,找到了就直接執行,而如果把所有的目錄都搜尋完了,也沒有找到你所執行的命令,就會報錯,提示你-bash:變數名:command not found(命令沒找到)。換句話說也就是你這個命令執行的不正確,也或者說你所執行的命令,並沒有配置在PATH環境變數中。

注意:PATH環境變數的值中,是用“:”分割的路徑。

(3)配置命令的環境變數

我們如何才能讓一個自定義的程式或者指令碼,不用輸入絕對路徑就能夠執行呢?

有兩種方式:

  • 第一種方式:直接把程式或者指令碼的可執行檔案,直接複製到PATH環境變數下的任一個目錄下即可。
    #拷貝hello.sh檔案到bin目錄下
    [[email protected] ~]# cp /root/sh/hello.sh  /bin/
    
    #hello.sh指令碼即可以直接執行
    [[email protected] ~]# hello.sh
    Perhaps only heart no holdings, to being on land, settle.
    也許只有心無所持,才能隨遇而安。
    
  • 第二種方式:把程式或者指令碼所有在的路徑,新增到PATH環境變數中即可。
    通過變數的疊加就可以實現:
    #在變數PATH的後面,加入/root/sh目錄
    [[email protected] ~]# PATH="$PATH":/root/sh
    
    #查詢PATH的值,變數疊加生效了
    [[email protected] ~]# echo $PATH
    /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root/sh
    

    注意的是,我們這樣定義的PATH環境變數只是臨時生效,一旦重啟或登出就會消失,如果想要永久生效,需要寫入環境變數配置檔案/etc/profile中。(可檢視後續文章)