如何在 Linux bash 终端中查看所有当前定义的环境变量的列表?

Cor*_*ein 37 environment-variables

在 Linux bash 终端中,通常会设置许多环境变量,例如$PATH$HOME

是否可以查看所有已设置的环境变量?如何?

Sta*_*ish 35

TL;DR:使用(set -o posix ; set)


根据 Bash 手册,您可以使用set内置命令来显示已设置的所有环境变量。该set命令还将显示任何函数的定义。如果您只想查看变量而不是函数,那么您可以在运行 set 命令之前打开 POSIX 模式。最简单的方法是使用set -o posix,但这将使 POSIX 模式保持打开状态,直到您使用 将其关闭set +o posix

因此,以下命令将使用子 shell 显示所有定义的环境变量,而不会影响当前 shell 中的 POSIX 合规性。

(set -o posix ; set)
Run Code Online (Sandbox Code Playgroud)

@RedGrittyBrick 和 @iglvzx 建议使用该env命令,但是该命令不会提供完整的环境变量列表。env将只显示已标记为导出的变量。比较env | sortand的输出,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
Run Code Online (Sandbox Code Playgroud)

您将看到set提供输出而env没有提供输出。


Red*_*ick 25

env不带参数的命令将打印“导出”环境变量及其值的列表。这些变量对子进程可见——许多其他环境变量没有与此一起显示,仅在运行的 shell 内使用,例如用于配置。

  • 我更喜欢 `printenv`,因为 `env` 和 `set` 都有其他功能,而不仅仅是输出环境。 (10认同)
  • @Starfish 是对的 - 这意味着这个被接受的答案是非常错误的。编辑说它仅列出导出的变量。 (4认同)
  • `env` 只会打印已标记为导出的环境变量列表。它不会打印所有变量。 (3认同)

Evg*_*eev 15

compgen -v
Run Code Online (Sandbox Code Playgroud)

打印 shell 变量(但不打印值)。

compgen -e
Run Code Online (Sandbox Code Playgroud)

打印导出的变量,即那些被这个 shell 启动的进程继承的变量(但不是它们的值)。

shell 和导出变量的区别:https : //unix.stackexchange.com/questions/3507/difference-between-environment-variables-and-exported-environment-variables-in-b?rq=1


ste*_*vec 8

我是通过搜索如何env 按字母顺序排列输出而来到这里的;这很简单

env | sort -f
Run Code Online (Sandbox Code Playgroud)
  • -f选项使排序忽略大小写,这可能是您 99% 的时间想要的