環境變量是 Linux 管理的一個重要方面,它為工程師提供了一個強大的定制系統的工具。在本文中,我們將詳細了解什么是 Linux 環境變量,它們與 shell 變量有何不同,以及如何列出、設置和管理它們。
什么是 Linux 環境變量?
Linux 環境變量是 shell 及其子進程使用的動態變量。環境變量定義了與 Linux 系統如何工作相關的各個方面。例如,用戶的默認 shell 是在 SHELL 變量中定義的。同樣,許多管理員使用 JAVA_HOME= 環境變量將程序指向系統上特定版本的 Java。
使用 Linux 環境變量時要記住的幾個要點是:
- 環境變量遵循<NAME>=<VALUE>格式。
- 您可以通過用冒號分隔它們來為單個變量指定多個值,如下所示:
<NAME>=<VALUE1>:<VALUE2>:<VALUE3> - 環境變量區分大小寫。
- 按照慣例,但不是規則,環境變量名稱總是大寫。
- Shell 變量與環境變量不同。Shell 變量僅適用于當前 shell,不適用于任何子進程。我們將在 Linux shell 變量與 Linux 環境變量部分仔細研究這個主題。
考慮到所有這些,讓我們繼續學習本教程。
先決條件
我們的示例使用 Ubuntu 20.04 和 GNU Bash 5.0.17,但您可以在大多數現代 Linux 系統上進行操作。
如何列出 Linux 環境變量 列出 Linux 環境變量
的方法有多種,這里我們將演示一些最常見的方法。
使用 printenv 列出 Linux 環境變量
該printenv命令顯示當前環境變量。
您可以printenv通過運行不帶任何選項或參數的命令來列出所有當前的 Linux 環境變量。
printenv
的輸出應該與此類似:
SHELL=/bin/bash SUPERBREAKFAST=Pepper and Egg PWD=/root LOGNAME=root XDG_SESSION_TYPE=tty MOTD_SHOWN=pam HOME=/root LANG=C.UTF-8 LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36: SSH_CONNECTION=24.148.23.154 2068 84.32.188.154 22 EASTEREGG=You pay attention to detail, good job! LESSCLOSE=/usr/bin/lesspipe %s %s XDG_SESSION_CLASS=user TERM=xterm LESSOPEN=| /usr/bin/lesspipe %s USER=root SHLVL=1 XDG_SESSION_ID=839 XDG_RUNTIME_DIR=/run/user/0 SSH_CLIENT=24.148.23.154 2068 22 XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/bus SSH_TTY=/dev/pts/0 _=/usr/bin/printenv
您還可以printenv用來顯示各個環境變量。顯示單個 Linux 環境變量的基本語法printenv是:
printenv [name]
例如,要打印PWD環境變量,請使用以下命令:
printenv PWD
輸出應該顯示您的 shell 的當前工作目錄。
使用 env 列出 Linux 環境變量
env 命令可以列出所有環境變量,輸出類似于printenv.?要使用 env 列出所有 Linux 環境變量,請運行不帶任何選項或參數的命令,如下所示:
env
在大多數情況下,env輸出應與printenv除_=變量外的輸出相匹配。發生這種情況是因為該_=變量是用于調用 shell 或 shell 腳本的特殊 Bash 參數。如果您在現代 Linux 系統上使用 env,該?_=值將匹配env二進制文件的位置(例如/usr/bin/env)。如果您使用printenv,它將匹配 printenv 二進制文件的位置(例如/usr/bin/printenv)。
使用 echo 顯示 Linux 環境變量
顯示單個 Linux 環境變量的最快方法之一是使用echo命令。基本語法是echo $<variable_name>.
例如,要打印 PATH 環境變量,請使用以下命令:
echo $PATH
輸出應類似于:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
該echo $<variable_name>命令也適用于不是環境變量的 shell 變量。例如,如果我們創建一個 BREAKFAST 變量并將其設置為'Pepper & Egg',我們可以看到輸出 withecho $BREAKFAST但看不到 with?printenv。
列出 Linux 環境變量的其他方法
列出 Linux 環境變量的其他方法包括:
- declare- 這個內置的 shell 實用程序可以使用此命令顯示 shell 和環境變量。
- set- 顯示 shell 變量、環境變量和 shell 函數。
- compgen -v- 顯示所有 shell 和環境變量的名稱。
如何設置 Linux 環境變量
設置 Linux 環境變量的基本命令是
export <NAME>='<value>'
例如,要創建名為 SANDWICH 且值為 Pepper And Egg 的環境變量,請使用以下命令:
export SANDWICH='Pepper And Egg'
要確認環境變量已創建,請使用命令
printenv SANDWICH
輸出應如下所示:
如何創建 Shell 變量
您可以使用這個基本命令結構創建 shell 變量<NAME>='<value>'。
例如,要創建一個名為 COOLSERVER 且值為 Cherry 的 shell 變量,請使用以下命令:
COOLSERVER='Cherry'
您可以使用以下命令確認變量現在存在:
echo $COOLSERVER
輸出應該是:
Cherry
要確認該變量不是環境變量,請執行以下命令:
printenv COOLSERVER
因為變量不是環境變量,所以應該沒有輸出:
如何將 Shell 變量轉換為環境變量
要將 shell 變量轉換為環境變量,基本的命令語法是export <Shell_Variable_Name>.
例如,要將上一示例中的COOLSERVER變量轉換為環境變量,請使用以下命令:
export COOLSERVER
現在,該printenv COOLSERVER命令應打印 Cherry 作為輸出:
Linux Shell 變量與 Linux 環境變量
到目前為止,您可以看到 shell 變量和環境變量是不同的東西。現在,讓我們仔細看看差異及其重要性。
Linux shell 變量和 Linux 環境變量之間的主要區別在于:
shell 變量不與 shell 的子進程共享,環境變量與 shell 的子進程共享。
為了說明為什么這種差異很重要,讓我們通過一個簡單的 bash 腳本來演示一個示例。
首先,創建一個名為CLOUD的變量并將值設置為Cherry Servers!.
CLOUD='Cherry Servers!'
接下來,使用echo命令顯示變量。
echo $CLOUD
這是端到端的樣子:
現在,創建一個test.sh包含相同命令的 bash 腳本。該腳本應如下所示:
#!/bin/bash echo $CLOUD
使用此命令使腳本可執行:
chmod +x test.sh
現在,運行腳本:
./test.sh
輸出應為空白,如下所示:
輸出為空的原因是因為$CLOUD它是一個 shell 變量。它包含在當前 shell 實例中。同時,test.sh腳本啟動一個新進程,并且由于$CLOUD未設置環境變量,腳本不打印任何內容。
讓我們$CLOUD用這個命令創建一個環境變量(注意不要在變量名前使用 $):
export CLOUD
現在,再次運行 test.sh 腳本。
./test.sh
你應該看到這個輸出:
如何刪除 Linux 環境變量
刪除現有 Linux 環境變量的基本語法是unset <NAME>.
例如,要取消設置我們的COOLSERVER變量,請使用以下命令:
unset COOLSERVER
要確認變量現在已刪除,請執行以下命令:
printenv COOLSERVER
因為變量不是環境變量,所以應該沒有輸出:
如何使 Linux 環境變量永久化
到目前為止,我們創建的環境變量只會在您的 shell 會話期間持續存在。如果您注銷或重新啟動,您需要重新創建它們才能使用它們。
幸運的是,有幾種方法可以使 Linux 環境變量在不同的 shell 會話中保持不變。
使用 .profile 使登錄 Shell 的環境變量永久化
該.profiile文件存在于用戶的主目錄中。您可以通過編輯用戶的.profile文件以包含用于設置環境變量的導出命令來為用戶添加環境變量。
例如,要使我們的COOLSERVER環境變量對當前用戶永久有效,請遵循以下過程:
- 將目錄更改為用戶的主目錄cd ~
- .profile在文本編輯器(例如 nano、vi、vim 等)中打開文件
- 將以下行添加到文件底部:export COOLSERVER='Cherry'
- 保存更改
更改將在下次登錄時生效。您可以使用以下命令使它們對當前終端生效:
. ~/.profile
使用 .bashrc 使非登錄交互式 Shell 的環境變量永久化
對于非登錄 shell,您可以遵循與登錄 shell 相同的過程,但不是編輯~/.profile文件,而是編輯~/.bashrc.
使用 /etc/environment 使環境變量在系統范圍內永久化
??警告:?系統上的任何 shell 都可以訪問系統范圍的變量,因此請謹慎設置。
要設置系統范圍的 Linux 環境變量,您可以編輯該/etc/environment文件。不是將導出命令附加到文件,而是將該<NAME>='<VALUE>'對附加到文件末尾。
例如,要使我們的COOLSERVER環境變量對整個系統永久有效,請遵循以下過程:
- 將目錄更改為用戶的主目錄cd /etc
- environment在文本編輯器(例如 nano、vi、vim 等)中打開文件
- 將以下行添加到文件底部COOLSERVER='Cherry'
- 保存更改