設置與查看Linux系統中的環境變量

  • 2020 年 8 月 17 日
  • 筆記

大家好,我是良許。

大家都知道,在 Linux 系統中,有環境變量Shell 變量這兩種變量。

環境變量是在程序及其子程序中全局可用的,常常用來儲存像默認的文本編輯器或者瀏覽器,以及可執行文件的路徑等等這樣的信息。而 Shell 變量僅在當前 Shell 中可用,可以用來存儲當前用戶的 ID 等信息。

那麼什麼是環境變量,什麼是 Shell 變量,該如何設置和查看這兩種變量呢?

接下來,讓良許為你解答:

環境變量

環境變量是以鍵值對的形式實現的,是在整個系統範圍內都可用的變量,並由所有派生的子進程和 Shell 繼承。而環境變量的名稱是區分大小寫的,且通常以大寫的形式命名 ( MYVAR1, MYVAR2… )

單個值的環境變量看起來是這樣的:

KEY=value1

如果你想要將多個值賦予環境變量,則通常用冒號 ( : ) 作為分隔符。每一對鍵值對最終看起來是這樣子的:

KEY=value1:value2:value3

如果要賦予環境變量的值包含空格,則需要使用引號:

KEY="value with spaces"

Shell 變量

Shell 變量是專門用於設置或定義它們的 Shell 中的變量。每個 Shell ,例如 zsh 和 bash ,都有一組自己內部的 Shell 變量。它們通常用於跟蹤臨時數據,比如當前工作目錄,而用法則與環境變量相同。

如果你想讓 Shell 變量作為全局變量使用,可以使用 export 指令:

$ export MYVAR=lxlinux.net
$ echo $MYVAR
lxlinux.net
$ env | grep MYVAR
MYVAR=lxlinux.net

常見的環境變量與 Shell 變量

一些環境變量和 Shell 變量是非常有用的,並且經常會被引用。以下是一些常見的,你以後可能會遇到的環境變量:

變量名 含義
TERM 這指定運行 Shell 時要模擬的終端類型。可以針對不同的操作需求模擬不同的硬件終端。不過,你通常不需要管這個變量。
USER 當前登錄的用戶
PWD 當前的工作目錄
OLDPWD 上一個工作目錄,這個變量由 Shell 保存,以便通過執行 cd - 切換回上一個工作目錄。
LS_COLORS 這定義了 ls 指令的顏色輸出代碼,用於向 ls 指令添加顏色輸出。這通常用於區分不同的文件類型並使用戶對文件類型等信息一目了然。
MAIL 當前用戶郵箱的路徑
PATH 系統在查找指令時會檢查的目錄列表。當用戶輸入一個指令時,系統將按此目錄列表的順序檢查目錄,以尋找相應的可執行文件。
LANG 當前的語言和本地化設置,包括字符編碼。
HOME 當前用戶的主目錄
_ 上一個被執行的指令

除了以上這些環境變量,你也可能會經常遇到以下這些 Shell 變量:

變量名 含義
BASHOPTS 執行 bash 時所啟用的選項列表,這對於確定 Shell 環境是否按照預期的方式運行很有幫助。
BASH_VERSION 人類可讀格式的正在執行的 bash 版本
BASH_VERSINFO 機器可讀格式的正在執行的 bash 版本
COLUMNS 用於設置繪製到屏幕上的輸出信息的寬的列數
DIRSTACK pushdpopd 命令可用的目錄堆棧。
HISTFILESIZE 存儲到文件中的命令歷史記錄的行數。默認為 ~/.bash_history 文件的行數。
HISTSIZE 內存中允許存儲的命令歷史記錄的行數,即 histroy 命令所能打印出來的行數。
HOSTNAME 計算機的主機名
IFS 內部字段分隔符,用於分隔命令行上的輸入。 默認以空格作為分隔符。
PS1 定義主命令提示符。 這用於定義啟動 Shell 會話時命令提示符的外觀。而 PS2 用於聲明跨越多行的命令的命令提示符。
SHELLOPTS 可以用 set 命令設置的 Shell 選項。
UID 當前用戶的 UID (用戶 ID)

查看 Shell 變量與環境變量

在 Linux 系統中,有以下幾種命令可以讓你查看環境變量:

env — 該命令可以讓你在自定義的環境中運行程序,並且不需要改變當前的環境。當不帶參數使用 env 命令時,它會打印出當前的環境變量列表。

printenv — 可以打印出所有的或者指定的環境變量。

set — 該命令可以設置或者刪除 Shell 變量。當不帶參數使用 set 命令時,它將打印出包括環境變量與 Shell 變量在內的所有變量以及 Shell 函數的列表。

默認狀態下,envprintenv 的功能是完全相同的:

$ printenv 
SSH_CONNECTION=10.0.2.2 37182 10.0.2.15 22
LESSCLOSE=/usr/bin/lesspipe %s %s
LANG=C.UTF-8
XDG_SESSION_ID=5
USER=alvin
MYVAR=lxlinux.net
PWD=/home/alvin
HOME=/home/alvin
SSH_CLIENT=10.0.2.2 37182 22
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
SSH_TTY=/dev/pts/0
MAIL=/var/mail/alvin
TERM=xterm-256color
SHELL=/bin/bash
SHLVL=1
LOGNAME=alvin
XDG_RUNTIME_DIR=/run/user/1000
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
LESSOPEN=| /usr/bin/lesspipe %s
_=/usr/bin/printenv

只有在更具體的功能上才能體現出 env 命令與 printenv 命令的區別。例如,使用 printenv 命令,你可以請求單個變量的值:

$ printenv SHELL
/bin/bash
$ printenv HOME
/home/alvin
$ printenv MYVAR
lxlinux.net

env 命令可通過將一組變量傳遞給命令來修改程序運行的環境:

env MYVAR=lxlinux.net command_to_run command_options

printenvenv 命令只能打印出環境變量,而如果你想打印出所有變量或者 Shell 函數的列表,你可以使用 set 指令。

$ set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_VERSINFO=([0]="2" [1]="8")
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="4" [2]="20" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
BASH_VERSION='4.4.20(1)-release'
COLUMNS=140
DIRSTACK=()
EUID=1000
GROUPS=()
HISTCONTROL=ignoreboth
HISTFILE=/home/alvin/.bash_history
HISTFILESIZE=2000
HISTSIZE=1000
HOME=/home/alvin
HOSTNAME=ubuntu-bionic
HOSTTYPE=x86_64
IFS=$' \t\n'
LANG=C.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
LESSOPEN='| /usr/bin/lesspipe %s'
LINES=35
LOGNAME=alvin
.....

該命令將顯示一個包含所有變量的大列表,因此你可能會希望將輸出傳遞給 less 命令。

$ set | less

設置 Shell 變量與環境變量

Linux 系統中可以設置環境變量的命令有以下幾種:

set — 該命令可以設置或者取消設置 Shell 變量。當不帶參數使用 set 命令時,它將打印出包括環境變量與 Shell 變量在內的所有變量以及 Shell 函數的列表。

unset — 該命令可以刪除 Shell 變量以及環境變量。

export — 該命令可以設置環境變量。

為了更好地理解 Shell 變量和環境變量之間的區別,我們先從設置 Shell 變量開始講,然後再講環境變量。

先從在當前會話中定義一個 Shell 變量開始:

$ MYVAR=lxlinux

你可以用 echo $MYVAR 來驗證變量是否已設置:

$ echo $MYVAR
lxlinux

使用 printenv 命令檢驗該變量是否為環境變量:

$ printenv MYVAR

沒有輸出返回,這就意味着 MYVAR 變量並不是環境變量。

export 命令可以用來設置環境變量。要創建環境變量,只需用 export 命令將 Shell 變量導出為環境變量:

$ export MYVAR

你可以用以下語句檢驗:

$ printenv MYVAR
lxlinux

當然,你也可以只用一行代碼來設置環境變量:

$ export MYNEWVAR="My New Variable"

但是以這種方式創建的環境變量只能用於當前會話,如果你打開一個新的 Shell 會話,或者退出登陸,所有的變量都將會丟失。

我們也可以將環境變量還原為 Shell 變量,或者將其完全刪除:

MYVAR 變量被定義為環境變量,我們可以通過輸入以下代碼將其還原為 Shell 變量:

$ export -n MYVAR

這樣,MYVAR 變量就不再是環境變量了,但依然還是 Shell 變量。

無論是 Shell 變量還是環境變量,想要完全刪除變量,都可以使用 unset 命令來刪除:

$ unset MYVAR

可以通過以下語句來驗證 MYVAR 變量已經刪除:

$ echo $MYVAR

由於變量已經刪除了,所以沒有任何返回。

環境變量的持久化

許多程序都需要使用環境變量來決定具體的執行方式,但是,我們並不希望每次啟動新的 Shell 會話時都必須重新設置重要的變量,因此我們需要將重要的環境變量寫入配置文件中。

Shell 會話有不同的啟動方式,比如,連接到終端的交互式 Shell 與未連接到終端的非交互式 Shell,還有登錄式 Shell 與非登錄式 Shell, 而 bash Shell 會根據會話不同的啟動方式而讀取不同的配置文件。

但是,在大多數 Linux 發行版中,當你啟動一個新的 Shell 會話時,一般都會從以下文件中讀取環境變量:

/etc/environment — 使用此文件來設置系統範圍內可用的環境變量。

/etc/profile — 每當 bash 登錄 Shell 時,都會加載此文件中設置的變量。

~/.bashrc — 每個用戶特定的 Shell 配置文件。例如, 如果你使用的是Bash,就可以在其中聲明變量。

如果要將新的環境變量加載到當前的 Shell 會話中,可以使用source命令:

$ source ~/.bashrc

如果你想要設置環境變量,你就可以考慮將其添加到 /etc/profile/etc/bash.bashrc/etc/environment 文件中。

結論

在本文章中,我們了解了一些常見的環境變量和 Shell 變量,也學習了如何設置和查看這些變量,其實這些變量一直都在我們的 Shell 會話中,而且對許多程序都很有用,有很多常見的場景都會引用到這些變量。希望這對你的工作也有幫助。如果你還對這兩種變量有任何疑問,請留言告訴我唄!


公眾號:良許Linux

有收穫?希望老鐵們來個三連擊,給更多的人看到這篇文章