
在 Linux bash 終端機中,通常會設定許多環境變量,例如$PATH
和$HOME
。
是否可以看到已設定的所有環境變數?如何?
答案1
長話短說:使用(set -o posix ; set)
根據 Bash 手冊你可以使用set
內建指令顯示所有環境變數已設定。該set
命令還將顯示任何函數的定義。如果您只想查看變數而不是函數,則可以在執行 set 命令之前開啟 POSIX 模式。最簡單的方法是使用set -o posix
,但這將使 POSIX 模式保持開啟狀態,直到您使用 關閉它set +o posix
。
因此,以下命令將使用子 shell 顯示所有定義的環境變量,而不影響目前 shell 中的 POSIX 合規性。
(set -o posix ; set)
@RedGrittyBrick 和 @iglvzx 建議使用該env
命令,但是該命令不會提供完整的環境變數清單。env
只會顯示已標記為匯出的變數。比較env | sort
和的輸出export -p
,您就會明白我的意思。comm -23 <(set -o posix; set) <(env|sort)
如果您想查看哪些環境變數沒有被匯出,您可以執行。
差異的原因是它env
是一個單獨的可執行文件,而不是set
一個 shell 內建命令。根據 Bash 手冊,當執行的命令不是 shell 內建命令或函數時,它只會接收已在 Bash 中標記為導出的環境變量。有許多變數未導出。因此,如果您希望查看 shell 定義的所有變量,則必須使用set
手冊中所述的命令。
您可以使用以下命令輕鬆地自行測試此行為。
MY_TEST_VARIABLE="This is my test variable."
set | grep MY_TEST_VARIABLE
env | grep MY_TEST_VARIABLE
您將看到set
提供輸出,而env
沒有。
答案2
不帶參數的命令env
將列印「導出的」環境變數及其值的清單。這些變數對子進程可見 - 許多其他環境變數未與此一起顯示,並且僅在運行的 shell 內部使用,例如用於配置。
答案3
compgen -v
列印 shell 變數(但不列印值)。
compgen -e
列印導出的變量,即由該 shell 啟動的進程繼承的變數(但不列印它們的值)。
shell變數和導出變數的差異:https://unix.stackexchange.com/questions/3507/difference- Between-environment-variables-and-exported-environment-variables-in-b?rq=1
答案4
結合之前的一些答案,我發現以下內容很有用:
compgen -v | sort | while read var; do [ -z "${!var}" ] || echo $var=${!var} ; done
compgen -v
:列印所有變數名稱,無論是本地變數還是導出變數。sort
: 按字母順序。${!var}
:取得$var的值(變數間接尋址)。-z
條件:檢查值是否為空,否則列印「變數=值」。
注意:
printenv
也很棒,但它只會顯示已匯出的環境變數列表,而不是本地/bash 變數。