環境變數和使用者自定義變數最主要的區別在於,環境變數是全域性變數,而使用者自定義變數是區域性變數。使用者自定義變數只在當前的 Shell 中生效,而環境變數會在當前 Shell 和這個 Shell 的所有子 Shell 中生效。如果把環境變數寫入相應的組態檔,那麼這個環境變數就會在所有的 Shell 中生效。
這是有區別的,如果環境變數不寫入組態檔,那麼當前 Shell 一旦終止,這個環境變數就會消失,而只有寫入組態檔才會永久地在所有 Shell 中生效。
在 Linux 中一般通過環境變數設定作業系統的環境,如提示符、查詢命令的路徑、使用者家目錄等,這些系統預設的環境變數的變數名是固定的,我們只能修改變數的值。
當然,我們也可以手工定義環境變數,不過這些自定義的環境變數不能修改作業系統環境,其只是一個全域性變數而已。
環境變數設定
環境變數和使用者自定義變數的設定方法相比,只需通過 export 命令將變數宣告為環境變數即可。命令如下:
[[email protected] ~]# export age="18"
#使用export宣告的變數就是環境變數
這樣年齡就是環境變數了。當然也可以先把變數宣告為本地變數,再用 export 宣告為環境變數,命令如下:
[[email protected] ~]# gender=male
[[email protected] ~]# export gender
這樣性別也被宣告為環境變數了。前面說過,使用者自定義變數和環境變數的區別就是:使用者自定義變數只能在當前 Shell 中有效,而環境變數在當前 Shell 和所有子 Shell 中有效。比如:
[[email protected] ~]# name="zhang san"
#把姓名宣告為本地變數
[[email protected] ~]# export age="18"
#年齡宣告為本地變數
[[email protected] ~]# gender=male
#性別宣告為本地變數
[[email protected] ~]# export gender
#性別升級為環境變數
然後我們查詢一下這些變數:
[[email protected] ~]# set
…省略部分內容…
gender=male
name='zhang san'
age=18
在當前 Shell 中可以看到這三個變數。
[[email protected] ~]# bash
#再呼叫一次bash,也就是進入子Shell
[[email protected] ~]# set
#再次查詢變數
…省略部分輸出…
age=18
gender=male
#在子Shell中只能看到環境變數"age"和"gender",而不能查詢到使用者自定義變數"name"
可以看到,在子 Shell 中只能看到環境變數"age"和"gender",這就是環境變數和使用者自定義變數的區別。
環境變數查詢和刪除
set 既可以查詢所有的變數,也可以查詢環境變數,我們剛剛 的實驗就是使用 set 命令進行環境變數查詢。當然,也可以使用 env 命進行環境變數的查詢,命令如下:
[[email protected] ~]# env
HOSTNAME=localhost.localdomain
SELINUX_ROLE_REQUESTED=
SHELL=/bin/bash
…省略部分輸出…
env 和 set 命令的區別是,set 命令可以檢視所有變數,而 env 命令只能檢視環境變數。我們可以發現系統預設有很多的環境變數,這邊環境變數的具體含義會在後續章節中詳細介紹。
再來說說環境變數的刪除。其實環境變數的刪除方法和使用者自定義變數是一樣的,都使用 unset 命令,命令如下:
[[email protected] ~]# unset gender
[[email protected] ~]# env | grep gender
#刪除環境變數gender