重要概念
起源
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
同上