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


348

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

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



您接受了错误的答案。“ printenv”仅给您环境变量。如果您确实需要外壳中当前声明的所有变量,请使用“ declare -p”或“ typeset -p”。
Florin Andrei

Answers:


479

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

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

printenv

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


要显示包括“外壳变量”的列表,您可以输入以下命令:

( set -o posix ; set ) | less

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

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


对于zsh :(高级shell)

使用以下命令:

( setopt posixbuiltin; set; ) | less

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


14
如果我去终端并编写MYNEWVARIABLE=Ubuntu并执行printenv,则不会显示该终端。为什么会这样,其他人又如何出现?
Strapakowsky

4
可能您看到的是Shell变量和环境变量之间的差异。尝试一下export MYNEWVARIABLE=Ubuntu,它将按您期望的那样工作。
Rmano

3
如果只执行set,它也会列出您创建的变量。或做set | grep myvar
Sergiy Kolodyazhnyy 2015年

4
printenv是一个外部命令,因此它仅知道(并打印)导出的环境变量。 set是内部bash命令,因此它显示所有“ shell变量”(未导出的环境变量)以及导出的环境变量。
Dan Pritts 2015年

1
要进一步了解@Rmano对@Strapakowsky的回复...这是行不通的unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW,但是可以unset MYNEWVARIABLE; export MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW,而且可以unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu printenv | grep MYNEW。使用export表示“我正在设置的变量应该是传递给进程的环境的一部分,而不仅仅是此shell中的变量。” 我的第三个示例说:“变量应该是传递给THIS流程的环境的一部分,但不能紧随其后。”
布鲁诺·布罗诺斯基

52

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

在上述所有方法中,建议的过程为:

  • 启动一个终端
  • 显示环境变量使用env,或 printenv或任何

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

例如,如果您使用~/.profile,或.bashrc.zshenv(取决于您的外壳)来修改环境变量-就像在路径中经典添加目录,这将引起注意。

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

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

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

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

裸壳示例

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

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


要求您拥有一个桌面环境,这对仅用于服务器CLI的人员没有帮助。
2013年

5
是的---但是对于CLI,只有上一个答案是可以的。我只是指出,有时您需要检查由图形环境启动的应用程序可用的环境变量,这与在其中启动终端时看到的设置不同。例如,如果您想了解为什么您的Kile应用程序不能编译LaTeX文件,而在终端机中可以,我在这里发布的技巧将大有帮助。
Rmano

3
感谢您提供非常有用的答案!我只是从help.ubuntu.com/community/…
Gunnar Hjalmarsson 2014年

谢谢。是否建议您xterm -e bash --noprofile --norc使用图形界面启动Ubuntu时不读取和执行启动文件,因为这些文件不会被执行?参见askubuntu.com/q/1025845/1471
蒂姆(Tim)

1
现在执行的正确命令(Ubuntu 18.04)是gnome-terminal -- bash --noprofile --norc
Mike Nakis,

45

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

declare -p

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

declare -xp

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


这是比这更整洁的解决方案POSIXLY_CORRECT=1 setdeclare并且alias(在这种情况下)值得一提的是typeset另一个内置的bash。

1
这是正确的答案。
Florin Andrei

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

等等

希望能有所帮助。


我注意到env缺少一些变量o_O。特别是在获取VAR = VAL文件之后。
ThorSummoner

1
@ThorSummoner此处的答案可能会帮助stackoverflow.com/questions/15474650/…–
georaldc

7

在使用compgen的bash中:

compgen -v | while read line; do echo $line=${!line};done  

2
这应该是一个可以接受的答案,因为其他所有人列出的不只是名称本身。在我的情况下,一些变量包含多行值,这使得其他解决方案不可行。
Mene

1
一个变形:compgen -v | while read line; do declare -p $line; done
Eljay

4

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

这是一个将以POSIX转义格式打印所有变量(每行一个变量)的函数:

function dump_vars {
    local VARNAME
    compgen -v | while read -r VARNAME; do
        printf "$VARNAME=%q\n" "${!VARNAME}"
    done
}

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


1
优秀的第一答案! +1 继续努力!
Fabby

3

envPOSIX 7方式

export asdf=qwer
env | grep asdf

样本输出:

asdf=qwer

它仅显示导出的变量:非导出的变量通常不被视为“环境变量”。

优先选择printenv,而不是POSIX。两者似乎都没有参数就做同样的事情:https : //unix.stackexchange.com/questions/123473/what-is-the-difference-between-env-and-printenv


两年前已经提到过:askubuntu.com/a/276162/158442
muru

@muru足够公平。希望它能env以更好的格式显示出来,并且我添加了更多信息。
Ciro Santilli新疆改造中心法轮功六四事件

这就是编辑的目的。
muru 2015年

2

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


0

printenv只列出出口变量, command+ alt+ $ (“\ E $”:完整的变量)将列出所有变量。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.