在与posix兼容的方法中,如何在没有值的情况下打印当前定义的环境变量的列表?
在某些实现(mksh、freebsd /bin/sh)上,仅使用export
本身就符合要求:
$ export
FOO2
FOO
但是对于其他一些实现(bash、zsh、dash),export
也会显示值。例如,使用bash:
$ export
export FOO2='as df\
asdk=fja:\
asd=fa\
asdf'
export FOO='sjfkasjfd kjasdf:\
asdkj=fkajdsf:\
:askjfkajsf=asdfkj:\
safdkj'
$ printenv | sed -n l
FOO2=as\tdf\$
asdk=fja:\$
asd=fa\$
asdf$
FOO=sjfkasjfd kjasdf:\$
asdkj=fkajdsf:\$
\t:askjfkajsf=asdfkj:\$
safdkj$
其他选项,如env
或printenv
,没有选择只打印没有值的变量名,至少在我尝试过的linux平台上没有。
可以使用管道(awk/sed/等)或使用参数展开技术(例如,${foo%%=*}
)对列表进行修整,但它必须使用可能跨越行的值,并在值中包含=
和空格(参见上面的示例)。
特定于特定shell实现的答案是有趣的,但我主要是在寻找跨实现兼容的内容。
发布于 2018-04-21 12:34:17
在awk里很容易。
awk 'BEGIN{for(v in ENVIRON) print v}'
但是,请注意,一些awk实现添加了自己的环境变量(例如,GNU将AWKPATH
和AWKLIBPATH
添加到ENVIRON
中)。
如果环境变量的名称包含换行符,则输出是模棱两可的,这是非常不寻常的,但在技术上是可能的。纯sh解决方案将是困难的。最好的方法是从export -p
开始,但是用纯sh进行按摩是很困难的。您可以使用sed来按摩export -p
的输出,然后使用eval
获取shell以删除它引用的内容。Bash和zsh打印非标准前缀。
report () { echo "${1%%=*}"; };
eval "$(export -p | sed "s/^export /report /;
s/^declare -x /report /;
s/typeset -x /report /")"
请注意,根据shell的不同,export -p
可能显示或不显示其名称在shell中无效的变量,如果没有,则可以或不正确地引用名称。例如,dash、mksh和zsh忽略了其名称包括换行符的变量,BusyBox dash和ksh93将它们打印为raw,而bash则打印它们的raw值。如果您需要抵抗不受信任的输入,请不要依赖纯POSIX解决方案,并且绝对不要对从eval
输出中派生出来的任何内容调用export -p
。
发布于 2019-09-25 09:30:07
我喜欢简单的东西;这将适用于POSIX系统:
printenv | sed 's;=.*;;' | sort
HOME
HOSTNAME
PATH
PWD
SHLVL
TERM
发布于 2021-02-05 08:58:13
下面是我的解决方案,它很好地处理具有多行值的环境变量:
env -0 | cut -z -f1 -d= | tr '\0' '\n' | sort | column
这将打印环境,使用NUL来分隔变量,而不是换行符(env -0
)。
然后我们使用cut -z -f1 -d=
消除变量值,其中-z
选项指定NUL分隔的记录,-f1
是第一个字段,-d=
表示字段由=
分隔。
tr '\0' '\n'
将将NUL分隔符转换为换行符。
然后,我喜欢对变量名进行排序,并在列中显示它们。
https://unix.stackexchange.com/questions/439145
复制相似问题