不仅包括
$HOME
,$PWD
等,还包括您定义的任何其他变量。#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
(或者,如果您没有
xterm
,gnome-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,修改登录名后的全局环境变量
,将显示相对于会话的所有本地环境变量(通常是本地变量是全局+会话的特定性)
评论
superuser.com/questions/420295/…您接受的答案不正确。 “ printenv”仅给您环境变量。如果您确实要在外壳程序中当前声明所有变量,请使用“ declare -p”或“ typeset -p”。