設定與檢視Linux系統中的環境變數
阿新 • • 發佈:2020-08-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 | `pushd` 和 `popd` 命令可用的目錄堆疊。 |
| 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 函式的列表。
預設狀態下,`env` 和 `printenv` 的功能是完全相同的:
```
$ 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
```
`printenv` 與 `env` 命令只能打印出環境變數,而如果你想打印出所有變數或者 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
### 有收穫?希望老鐵們來個三連擊,給更多的人看到這