Environment-Variables

/usr/bin/env -0 用於非 Linux 系統

  • February 28, 2020

考慮我想以程式方式讀取互動式 shell 的環境。現在,啟動一個 shell,執行/usr/bin/env並擷取它的輸出似乎是一個很好的解決方案。但直到我們意識到變數值可以有換行符的那一刻:

$ export LINE0='VALUE0
> LINE1=VALUE1'
$ env | grep ^LINE
LINE0=VALUE0
LINE1=VALUE1

因此,擷取env -0( NULL-separated entries) 的輸出似乎是一種更好的方法,但這僅適用於 GNU env,因此主要是特定於 Linux 的。

是否有任何可移植的(POSIX 或 BSD)方法來獲取NULL- 分隔的環境變數列表,僅使用標準命令行工具(可以使用awk,但不允許perl// pythonruby

我想知道您打算如何恢復擷取的環境,因為除了 zsh 之外沒有 shell 支持其變數中的 nul 字節。

無論如何,您可以使用awkto 轉義\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

引用自:https://unix.stackexchange.com/questions/570206