如何列出所有变量名称及其当前值?

Str*_*sky 442 command-line bash environment-variables

如何列出所有变量名称及其当前值?

不仅包括$HOME, $PWDetc 还包括您定义的任何其他。

Luc*_*cio 593

对于 bash:(Ubuntu 中的标准 shell)

在终端中输入以下命令以打印所有环境变量:

printenv
Run Code Online (Sandbox Code Playgroud)

有关此命令的更多信息,请阅读printenv手册页


要显示包含“shell 变量”的列表,您可以输入下一个命令:

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

不仅会显示shell 变量,还会显示环境变量。

有关与此主题相关的更多信息,请阅读:


对于 zsh:(高级 shell)

使用以下命令:

( setopt posixbuiltin; set; ) | less
Run Code Online (Sandbox Code Playgroud)

有关 ZSH 选项的更多信息,请参见zshoptions手册页

  • 如果我转到终端并写入“MYNEWVARIABLE=Ubuntu”并执行“printenv”,它不会显示在那里。为什么会这样,其他人是如何出现的? (18认同)
  • 您可能看到了 shell 变量和环境变量之间的区别。尝试`export MYNEWVARIABLE=Ubuntu`,它会按你的预期工作。 (6认同)
  • `printenv` 是一个外部命令,所以它只知道(并打印)导出的环境变量。`set` 是一个内部 bash 命令,因此它显示所有“shell 变量”(未导出的环境变量)以及导出的环境变量。 (5认同)
  • 如果你简单地执行`set`,它也会列出你创建的变量。或者做`set | grep myvar` (3认同)
  • 要扩展 @Rmano 对 @Strapakowsky 的回复...这将不起作用`unset MYNEWVARIABLE; 我的新变量=Ubuntu;打印环境 | grep MYNEW`,但这将`unset MYNEWVARIABLE; 导出 MYNEWVARIABLE=Ubuntu; 打印环境 | grep MYNEW`,这将`unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu 打印环境 | grep MYNEW`. 使用导出表示“我设置的变量应该是传递给进程的环境的一部分,而不仅仅是此 shell 中的变量。” 我的第三个例子说“变量应该是传递给这个进程的环境的一部分,但之后不会留下来。” (2认同)
  • `-o posix` 仅适用于 bash,不适用于 `sh` (2认同)
  • 这是不正确的。env 或 printenv 仅打印环境变量。要获取当前 shell 中声明的所有变量,请使用“declare -p”或“typeset -p”。请参阅本页上的另一个答案。 (2认同)

gei*_*rha 69

您可以使用declare内置函数查看所有变量。

declare -p
Run Code Online (Sandbox Code Playgroud)

如果您只对环境变量感兴趣,请使用

declare -xp
Run Code Online (Sandbox Code Playgroud)

运行help declare以查看其他选项是什么。

  • 这是比 `POSIXLY_CORRECT=1 set` 更简洁的解决方案,而且值得一提的是,`declare` 是 `typeset` 的 `alias`(在这种情况下),另一个 bash 内置函数。 (5认同)
  • @maoizm 如果您只想要变量名称而不需要其他内容,那么使用 compgen 会更容易。`compgen -e`。 (4认同)
  • 我想这就是大多数人所寻求的。 (3认同)
  • 这是正确答案。 (2认同)

Rma*_*ano 55

我知道这个问题已经很老了并且已经回答了,但我想我可以添加一些有用的信息。

在上述所有方法中,建议的程序是:

  • 启动终端
  • 使用env, printenv或其他方式显示环境变量

这些解决方案的问题是您看到的是运行到终端中的 shell的环境变量。例如,您看不到直接通过图形界面运行的应用程序可用的环境变量。

例如,如果您使用~/.profile, or .bashrc, or .zshenv(取决于您的 shell)来修改环境变量——就像经典的路径添加目录一样,这很明显。

要查看直接在图形环境中启动的应用程序可用的环境变量,您可以执行以下操作(在 Gnome Shell 中,我确定所有其他 DE 中都有等效的方法):

  • 按 Alt-F2
  • 运行命令 xterm -e bash --noprofile --norc

(或者,如果你没有xtermgnome-terminal -- bash --noprofile --norc---感谢@Mike Nakis 的评论)。

您现在有一个没有添加任何环境变量的 shell 终端。您可以使用env此处列出所有环境变量:

裸壳示例

显然,新 shell 将具有由系统文件添加的环境变量,但无论如何,这些变量应该(通过继承)可用于系统中的所有程序。

我发布这个是因为这是我第四次必须再次搜索这个技巧,检查我的.pam_environment文件。所以现在我会更快地找到它(在这个过程中,我希望能帮助别人......)

  • 是的 --- 但是对于 CLI,只有以前的答案是可以的。我只是指出,有时您需要检查图形环境启动的应用程序可用的环境变量,这与您在其中启动终端时看到的设置不同。例如,如果您想了解为什么您的 Kile 应用程序无法编译 LaTeX 文件,而在终端中则可以,我在此处发布的技巧将大有帮助。 (5认同)
  • 感谢您提供非常有用的答案!我只是从 https://help.ubuntu.com/community/EnvironmentVariables#Desktop_environment_specifics 链接到它 (3认同)
  • 现在执行的正确命令(Ubuntu 18.04)是`gnome-terminal -- bash --noprofile --norc` (2认同)

rɑː*_*dʒɑ 12

要列出与终端环境变量CTRL+ ALT+ T,你可以使用env命令。

例如 :

[raja@localhost ~]$ env
XDG_VTNR=1
SSH_AGENT_PID=3671
XDG_SESSION_ID=3
HOSTNAME=localhost.localdomain
IMSETTINGS_INTEGRATE_DESKTOP=yes
GPG_AGENT_INFO=/home/raja/.gnupg/S.gpg-agent:3691:1
GLADE_PIXMAP_PATH=:
TERM=xterm-256color
SHELL=/bin/bash
XDG_MENU_PREFIX=xfce-
DESKTOP_STARTUP_ID=
HISTSIZE=1000
XDG_SESSION_COOKIE=0250277dd805498381e96c05d88068b0-1364679772.845276-1676152201
WINDOWID=65011716
GNOME_KEYRING_CONTROL=/home/raja/.cache/keyring-N3QoQ2
IMSETTINGS_MODULE=none
QT_GRAPHICSSYSTEM_CHECKED=1
USER=raja
Run Code Online (Sandbox Code Playgroud)

等等。

希望有帮助。

  • @ThorSummoner这里的答案可能会有所帮助 /sf/ask/1083225531/ Between-source-and-export (3认同)

小智 11

在 bash 中使用 compgen:

compgen -v | while read line; do echo $line=${!line};done  
Run Code Online (Sandbox Code Playgroud)

  • 一个变体:`compgen -v | 读取行时;声明 -p $line; 完成` (3认同)
  • 这应该是公认的答案,因为所有其他人列出的不仅仅是名称本身。在我的情况下,一些变量包含多行值,这使得其他解决方案不可行。 (2认同)

Ján*_*ský 9

这里的大多数解决方案要么仅打印环境变量,要么具有 env 或 (set -o posix; set) 不以易于解析的形式打印值的缺点(尝试打印变量 A=$'a\r\nb',它有多行...)。

下面是一个函数,它将以 POSIX 转义形式打印所有变量,每行一个变量(适用于简单文本变量,不适用于数组):

function dump_vars {
    local VARNAME
    compgen -v | while read -r VARNAME; do
        printf "$VARNAME=%q\n" "${!VARNAME}"
    done
}
Run Code Online (Sandbox Code Playgroud)

感谢 @tmgoblin 指出 compgen -v 的使用。


小智 7

如果您想要一个特定的环境变量,而不是用 打印它们printenv,您可以通过执行以下操作来打印它echo "$PWD"