如何查看 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 | sortexport -pcomm -23 <(set -o posix; set) <(env|sort)

造成这种差异的原因是它env是一个单独的可执行文件,而不是setshell 内置命令。根据 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条件:检查值是否为空,否则打印“variable=value”。

注意: printenv也很棒,但它只会显示已导出的环境变量列表,而不是本地/bash 变量。

相关内容