首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >posix shell:打印环境变量名称列表(没有值)

posix shell:打印环境变量名称列表(没有值)
EN

Unix & Linux用户
提问于 2018-04-21 07:41:21
回答 4查看 7.9K关注 0票数 18

在与posix兼容的方法中,如何在没有值的情况下打印当前定义的环境变量的列表?

在某些实现(mksh、freebsd /bin/sh)上,仅使用export本身就符合要求:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ export
FOO2
FOO

但是对于其他一些实现(bash、zsh、dash),export也会显示值。例如,使用bash:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ 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$

其他选项,如envprintenv,没有选择只打印没有值的变量名,至少在我尝试过的linux平台上没有。

可以使用管道(awk/sed/等)或使用参数展开技术(例如,${foo%%=*})对列表进行修整,但它必须使用可能跨越行的值,并在值中包含=和空格(参见上面的示例)。

特定于特定shell实现的答案是有趣的,但我主要是在寻找跨实现兼容的内容。

EN

回答 4

Unix & Linux用户

发布于 2018-04-21 12:34:17

在awk里很容易。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
awk 'BEGIN{for(v in ENVIRON) print v}'

但是,请注意,一些awk实现添加了自己的环境变量(例如,GNU将AWKPATHAWKLIBPATH添加到ENVIRON中)。

如果环境变量的名称包含换行符,则输出是模棱两可的,这是非常不寻常的,但在技术上是可能的。纯sh解决方案将是困难的。最好的方法是从export -p开始,但是用纯sh进行按摩是很困难的。您可以使用sed来按摩export -p的输出,然后使用eval获取shell以删除它引用的内容。Bash和zsh打印非标准前缀。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

票数 14
EN

Unix & Linux用户

发布于 2019-09-25 09:30:07

我喜欢简单的东西;这将适用于POSIX系统:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
printenv | sed 's;=.*;;' | sort
HOME
HOSTNAME
PATH
PWD
SHLVL
TERM
票数 2
EN

Unix & Linux用户

发布于 2021-02-05 08:58:13

下面是我的解决方案,它很好地处理具有多行值的环境变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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分隔符转换为换行符。

然后,我喜欢对变量名进行排序,并在列中显示它们。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/439145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文