如何列出所有变量名称及其当前值?
包括不仅限于$HOME、$PWD等已定义的任何其他变量。
包括不仅限于$HOME、$PWD等已定义的任何其他变量。
对于bash:(Ubuntu中的标准shell)
在终端中输入以下命令以打印所有环境变量:
printenv
printenv
man page。
( set -o posix ; set ) | less
这将向您显示不仅 shell 变量,还有环境变量。
有关此主题的更多信息,请阅读:
对于zsh:(一个高级的shell)
使用以下命令:
( setopt posixbuiltin; set; ) | less
zshoptions
man page。MYNEWVARIABLE=Ubuntu
,然后执行printenv
,它不会显示出来。为什么会这样,其他的变量又是如何显示出来的呢? - Strapakowskyexport MYNEWVARIABLE=Ubuntu
,它会按照你的期望工作。 - Rmanoset
,它会列出你创建的变量。或者执行 set | grep myvar
。 - Sergiy Kolodyazhnyyprintenv
是一个外部命令,因此它只知道(并打印)已导出的环境变量。set
是一个内部的 bash 命令,所以它显示所有的 "shell 变量"(未导出的环境变量)以及已导出的环境变量。 - Dan Prittsunset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW
,但这样可以
unset MYNEWVARIABLE; export MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW
,而这样也可以
unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu printenv | grep MYNEW
。使用export命令表示“我设置的变量应该成为传递给进程的环境的一部分,而不仅仅是此shell中的一个变量。”我的第三个示例表示“该变量应该成为传递给此进程的环境的一部分,但在此之后不会保留下来。” - Bruno Bronosky-o posix
只适用于 bash,不适用于 sh
。 - Derecksonset
命令忽略了一些shell变量。你可以使用declare -p | while read -r _ flags line; do printf "%s\n" "$line"; done
来获取它们全部。 - Colin Fraizerdiff <( set -o posix; set | while read -r line; do printf "%s\n" "${line%%=*}"; done | sort) <(declare -p | while read -r _ flags line; do printf "%s\n" "${line%%=*}"; done | sort)
来比较每个输出的差异。省略的变量包括:BASHPID
、BASH_ARGV0
、EPOCH{REALTIME,SECONDS}
、FUNCNAME
、HISTCMD
、LINENO
、OLDPWD
、RANDOM
和SECONDS
。 - Colin Fraizerdeclare
内建命令查看所有变量。declare -p
declare -xp
help declare
以查看其他选项。POSIXLY_CORRECT=1 set
更整洁的解决方案,值得一提的是,在这个上下文中,declare
是typeset
的别名,另一个bash内置命令。 - user359096declare -xp | grep --perl-regexp --only-match '(?<=^declare -x )[^=]+'
- maoizmcompgen -e
会更简单。 - geirhadeclare -p | while read -r _ flags line; do printf "%s\n" "${line%%=*}"; done
。(包含换行符的值,例如 IFS
,会添加一行空白。) - Colin Fraizercompgen -v
替代它 - geirhadeclare -p
包括 FUNCNAME
,但 compgen -v
不包括。当在函数内部调用时,输出是相同的。) - Colin Fraizerdeclare -p1
来美化打印的变量,以提高可读性。 - smac89declare
或compgen
没有列出除环境变量以外的所有选项,但你可以通过获取所有变量名(compgen -v
)并从中删除环境变量(compgen -e
)来获得变量名列表。例如,使用comm -23 <(compgen -v) <(compgen -e)
。 - geirha我知道这个问题已经很旧并且已经回答了,但是我认为我可以添加一些有用的信息。
在上面描述的所有方法中,建议的过程是:
env
或printenv
等显示环境变量这些解决方案的问题是你正在查看终端中正在运行的shell的环境变量。你没有看到图形界面直接运行的应用程序可用的环境变量。
如果例如你使用~/.profile
、.bashrc
或.zshenv
(取决于你的shell)来修改环境变量,比如将目录添加到路径中,那么这一点就会明显。
要查看直接在图形环境中启动的应用程序可用的环境变量,你可以执行以下操作(在Gnome Shell中,我确定其他DE中也有类似的方法):
xterm -e bash --noprofile --norc
xterm
,gnome-terminal -- bash --noprofile --norc
--- 感谢 @Mike Nakis 的评论)。env
命令在这里列出所有的环境变量:
明显地,新的 shell 将会拥有由系统文件添加的环境变量,但是这些变量应该通过继承可用于系统中的所有程序。
我发帖子是因为这已经是我第四次再次搜索这个技巧了,检查我的 .pam_environment 文件。所以现在我将更快地找到它(并且希望在此过程中帮助其他人...)xterm -e bash --noprofile --norc
,因为在 Ubuntu 开机时使用图形界面时,启动文件没有被读取和执行?请参考 https://askubuntu.com/q/1025845/1471 - Tim.bashrc
文件... - Rmanognome-terminal -- bash --noprofile --norc
。 - Mike Nakisenv
命令。[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
等等。
希望有所帮助。
compgen -v | while read line; do echo $line=${!line};done
compgen -v | while read line; do declare -p $line; done
- Eljaydeclare -p
和这个有什么区别? - DJCrashdummydeclare -p
дЄНдЉЪеМЕжЛђиѓЄе¶В BASH_COMMAND
, BASH_SUBSHELL
, COMP_WORDBREAKS
, HISTCMD
, LINENO
, RANDOM
, SECONDS
з≠ЙеЖЕеЃєгАВ - Eljaydeclare -p
"包括"或列出它们全部(并且还有FUNCNAME
),但你说得没错:不显示值,而且数组的值也不显示。你知道为什么吗?—所以在我看来,你的行是最详尽的方法,甚至包括所有数组的值和索引! - DJCrashdummy这里的大多数解决方案要么只打印环境变量,要么存在缺点,即env或(set -o posix; set)不以易于解析的形式打印值(尝试打印变量A = $'a \r\n b',它有多行...)。
这是一个函数,它将以POSIX转义形式打印所有变量,每个变量一行(对于简单文本变量有效,但不适用于数组):
function dump_vars {
local VARNAME
compgen -v | while read -r VARNAME; do
printf "$VARNAME=%q\n" "${!VARNAME}"
done
}
printenv
打印所有的变量,你可以通过echo "$PWD"
来打印特定的变量。echo $PATH
或echo $USER
。这将打印环境变量的值。美元符号操作符是访问变量或命令值所需的唯一元素。 - nocarrierenv 是一种 POSIX 7 的方式:
export asdf=qwer
env | grep asdf
示例输出:
asdf=qwer
printenv
相比,更推荐使用此方法。两者在没有参数的情况下似乎执行相同的操作: https://unix.stackexchange.com/questions/123473/what-is-the-difference-between-env-and-printenv
env
并进行更好的格式化,我已经添加了更多信息。 - Ciro Santilli OurBigBook.comprintenv
会显示所有全局环境变量printenv 只列出已导出的变量, command+alt+$ ( "\e$": complete-variable ) 将列出所有变量。