考虑我想以编程方式读取交互式 shell 的环境。现在,启动 shell、运行/usr/bin/env
并捕获其输出似乎是一个很好的解决方案。但直到我们意识到变量值可以有换行符的那一刻:
$ export LINE0='VALUE0
> LINE1=VALUE1'
$ env | grep ^LINE
LINE0=VALUE0
LINE1=VALUE1
env -0
因此捕获( -separated items)的输出NULL
似乎是一种更好的方法,但这仅适用于 GNU env
,因此主要是 Linux 特定的。
是否有任何可移植(POSIX 或 BSD)方法来获取NULL
- 分隔的环境变量列表,仅使用标准命令行工具(可以使用awk
,但不允许perl
// )?python
ruby
答案1
我想知道你打算如何恢复捕获的环境,因为除了 zsh 之外没有 shell 支持其变量中的 nul 字节。
无论如何,您可以使用awk
转义\
as\\
和换行符 as \n
,并且仍然使用换行符来分隔name=val
条目:
awk 'BEGIN{
for(e in ENVIRON){
v = e "=" ENVIRON[e];
gsub(/\\/, "&&", v); gsub(/\n/,"\\n",v); print v
}
}'
fzd$ env - $'foo\\bar\nquux=foo\\bar\nquux' lol=cat printenv
lol=cat
foo\bar
quux=foo\bar
quux
fzd$ env - $'foo\\bar\nquux=foo\\bar\nquux' lol=cat awk 'BEGIN{
for(e in ENVIRON){
v = e "=" ENVIRON[e];
gsub(/\\/, "&&", v); gsub(/\n/,"\\n",v); print v
}
}'
foo\\bar\nquux=foo\\bar\nquux
lol=cat