如何在 Linux bash 終端機中查看目前定義的所有環境變數的清單?

如何在 Linux bash 終端機中查看目前定義的所有環境變數的清單?

在 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 變數。

相關內容