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

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

评论

superuser.com/questions/420295/…

您接受的答案不正确。 “ printenv”仅给您环境变量。如果您确实要在外壳程序中当前声明所有变量,请使用“ declare -p”或“ typeset -p”。

#1 楼

对于bash:(Ubuntu中的标准外壳)

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

printenv


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


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

( set -o posix ; set ) | less


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

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



如何在bash中列出脚本中声明的变量?从SO和

如何打印从
UnixSE
环境变量vs Shell变量中bash中定义的(但不一定是
导出的)所有环境变量,有什么区别?


对于zsh :(高级shell)

使用以下命令:

( setopt posixbuiltin; set; ) | less


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

评论


如果我去终端并输入MYNEWVARIABLE = Ubuntu并执行printenv,它不会在那里显示。为什么会这样,其他人又如何出现?

– Strapakowsky
13年3月30日在3:30

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

–罗马诺
13-10-12在0:41

如果仅执行set,它也会列出您创建的变量。还是做| grep myvar

– Sergiy Kolodyazhnyy
15年1月4日在15:01

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

–丹·普里兹(Dan Pritts)
15年7月30日在15:33

扩展@Rmano对@Strapakowsky的回复...如果未设置MYNEWVARIABLE,则无法使用; MYNEWVARIABLE = Ubuntu; printenv | grep MYNEW,但这不会设置MYNEWVARIABLE;出口MYNEWVARIABLE = Ubuntu; printenv | grep MYNEW,这将取消设置MYNEWVARIABLE; MYNEWVARIABLE = Ubuntu printenv | grep MYNEW。使用export表示“我正在设置的变量应该是传递给进程的环境的一部分,而不仅仅是此shell中的变量。”我的第三个示例说:“变量应该是传递给THIS流程的环境的一部分,但不能紧随其后。”

–布鲁诺·布鲁诺斯基(Bruno Bronosky)
16年8月26日在17:39



#2 楼

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

declare -p


如果您只对环境变量感兴趣,请使用>
运行help declare来查看其他选项。

评论


这比POSIXLY_CORRECT = 1设置的解决方案更整洁,还值得一提的是,声明是该bash内置的排版的别名(在这种情况下)。

–user359096
18年2月7日在16:50

这是正确的答案。

–弗洛林·安德烈(Florin Andrei)
19年7月26日在19:11

我认为这是大多数人想要的。

–WinEunuuchs2Unix
19-10-18在23:56

为了方便起见,以下bash oneliner会打印所有环境变量的名称:define -xp | grep --perl-regexp --only-match'(?<= ^声明-x)[^ =] +'

– maoizm
20年2月2日在7:25

@maoizm如果只需要变量名,而不需要别的,那么使用compgen会更容易。 compgen -e。

– Geirha
20-2-3在20:33

#3 楼

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

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


启动终端
使用env
printenv或任何其他方法显示环境变量

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

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

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


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


(或者,如果您没有xtermgnome-terminal -- bash --noprofile --norc ---谢谢到@Mike Nakis进行评论)。

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



显然,新的shell将具有系统文件添加的环境变量,但是该变量应该可用(通过继承)到系统中的所有程序。

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

评论


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

– K7AAY
13-10-21在18:21

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

–罗马诺
13-10-21在20:36

感谢您提供非常有用的答案!我只是从help.ubuntu.com/community/…链接到它

– Gunnar Hjalmarsson
2014年1月2日,17:06

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

– Tim
18年4月17日在14:49

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

–迈克·纳基斯(Mike Nakis)
19年4月28日在11:10



#4 楼

要使用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


等。 br />
希望有所帮助。

评论


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

–雷神召唤师
17年8月2日在19:43

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

– geooraldc
17年8月14日在17:48

#5 楼

使用compgen在bash中:

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


评论


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

–门
17年11月9日15:20

一个变体:compgen -v |边读边;声明-p $ line;完成

– Eljay
18/12/13在17:58

#6 楼

env是POSIX 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
2015年11月30日的15:00

@muru足够公平。希望它通过更好的格式使env更加可见,并且我添加了更多信息。

– Ciro Santilli郝海东冠状病六四事件法轮功
2015年11月30日15:01

这就是编辑的目的。

–muru
15年11月30日在15:02

#7 楼

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

#8 楼

这里的大多数解决方案要么仅打印环境变量,要么具有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
}

@tmgoblin指出了compgen -v的使用。

评论


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

–法比
18/12/15在16:29

#9 楼

printenv仅列出导出的变量,
command + alt + $
(“ \ e $”:complete-variable)
将列出所有变量。

#10 楼



printenv将显示所有全局环境变量
env,修改登录名后的全局环境变量
,将显示相对于会话的所有本地环境变量(通常是本地变量是全局+会话的特定性)