/usr/bin/env -0 对于非 Linux 系统

/usr/bin/env -0 对于非 Linux 系统

考虑我想以编程方式读取交互式 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// )?pythonruby

答案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

相关内容