重要概念

起源

Linux 中嘅環境變量源自早期 UNIX 系統嘅設計需求。 通過環境變量,用戶同進程能夠動態咁影響系統行為,而唔需要修改系統嘅核心代碼。 呢種靈活性同可配置性使環境變量成為 Linux 系統同應用程序配置嘅關鍵部分。

喺 UNIX 中,每個進程都有自己嘅環境(即一組環境變量),呢啲環境變量喺進程嘅啟動時由父進程傳遞畀子進程。 最典型嘅例子係當用戶登錄系統時,系統啟動嘅 Shell 進程會繼承一組默認嘅環境變量,例如用戶嘅主目錄、Shell 類型等。 用戶可以喺呢個基礎上修改或添加環境變量,影響自己啟動嘅程序或進程嘅行為。

概念勘誤

有啲書籍同文章會把環境變量分為全局環境變量同局部環境變量,但呢種分類係唔準確嘅, 因為喺官方嘅文檔中,從來冇呢兩種分類嘅定義,甚至連英文名稱都冇。 因此,為咗避免語義上嘅邏輯問題,本文唔會對環境變量進行上述嘅分類。

《Linux 命令行與Shell 腳本編程大全》

《Linux Command Line and Shell Scripting Bible》

上面呢本書關於環境變量嘅章節係有問題嘅,唔係翻譯嘅問題,原版就有問題。

打印環境變量

命令:printenv

唔帶參數會打印所有環境變量。

printenv | head -n 3
SHELL=/bin/bash
PWD=/home/kuga
LOGNAME=kuga

打印指定環境變量。

printenv PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

命令:env

唔帶參數會打印所有環境變量。

env | head -n 3
SHELL=/bin/bash
PWD=/home/kuga
LOGNAME=kuga

命令:echo

打印指定變量,可以係環境變量或 Shell 變量。

echo $HOME
/home/kuga

自定義 Shell 變量

定義名為 soda 嘅 Shell 變量,值為 green。

soda=green
echo $soda
green

使用 printenv 訪問

printenv soda

輸出為空,因為 soda 唔係環境變量,佢只係一個 Shell 變量

使用命令分組 () 訪問

(echo $soda)
green

使用命令分組 () 修改

(soda=yellow; echo $soda); echo $soda
yellow
green

Subshell 內部嘅修改唔會影響外部嘅數據。

創建 Bash 實例訪問

bash
echo $soda

輸出為空,呢就係普通 Shell 變量嘅基本作用域。

自定義環境變量

可以通過 export 指令把 Shell 變量轉變為環境變量,官方手冊嘅定義如下。

Mark each name to be passed to child processes in the environment.
翻譯:標記變量名稱,使其喺環境中可以傳遞畀子進程。

可以同時定義和導出變量,或分開操作。

export soda=green
soda=green; export soda;

使用 printenv 訪問

轉變為環境變量之後,使用 printenv 就能正常打印了。

printenv soda
green

使用命令分組 () 訪問

(printenv soda)
green

使用命令分組 () 修改

(soda=yellow; echo $soda); echo $soda
yellow
green

同樣,內部修改環境變量是唔會影響外部嘅數據。

創建 Bash 實例訪問

bash -c "printenv soda"
green

環境變量喺新創建嘅 Bash 實例中係能訪問嘅。

查看所有 export 變量

唔帶參數,或使用 -p 就能打印所有 export 變量。

export
export | grep soda
declare -x soda="green"

取消 export 環境變量

使用 -n 選項就能取消 export,變回普通嘅 Shell 變量。

export -n soda
printenv soda; echo $soda

printenv 無輸出,echo 正常輸出,因為 soda 已經唔再係環境變量。

刪除變量

下面會刪除整個變量,無論係環境變量或 Shell 變量。

unset soda
echo $soda

命令:declare

用於聲明變量和屬性,唔帶任何參數就輸出所有嘅變量聲明和當前值。

Declare variables and give them attributes. If no names are given, then display the values of variables instead.

常用參數:

  • -i:將變量聲明為整數。
  • -r:將變量聲明為只讀。
  • -x:將變量導出為環境變量。
  • -p:顯示變量嘅聲明和當前值。

不帶參數聲明

效果和普通嘅 Shell 變量一樣。

declare soda="green"
echo $soda

顯示當前變量嘅聲明

declare -p soda
declare -- soda="green"

顯示所有變量嘅聲明

declare -p

聲明環境變量

declare -x soda="green"
printenv soda
green

export 中亦能睇到 soda 嘅定義。

export | grep soda

-x 與 -- 嘅區別

不難發現,可以通過聲明嘅符號區分不同嘅變量類型。

  • -x:環境變量嘅聲明。
  • --:普通 Shell 變量嘅聲明。
declare -p soda
declare -x soda="green"

取消 export 後。

export -n soda
declare -p soda
declare -- soda="green"

內建命令手冊

有啲內建命令使用 man 係無法查看手冊嘅,但可以使用 help 命令,或 --help 選項。

export

type -a export
export is a shell builtin

help export
export --help

declare

同上

unset

同上