Linux 以外のシステムでは /usr/bin/env -0

Linux 以外のシステムでは /usr/bin/env -0

インタラクティブシェルをプログラムで読みたい環境を考えてみましょう。これで、シェルを起動して実行し、/usr/bin/env出力をキャプチャするのが良い解決策のようです。ただし、変数の値に改行文字がある可能性があることに気づいた瞬間までは、次のようになります。

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

env -0したがって、(区切り項目)の出力をキャプチャする方がNULL良い方法のように見えますが、これはGNUでのみ動作するため、envほとんどの場合Linuxにのみ当てはまります。

NULL標準のコマンドラインツール( // は使用できますがawk許可されていません)を使用して分離された環境変数のリストを取得する移植可能な(POSIXまたはBSD)方法はありますかperlpythonruby

答え1

あなたの計画が何であるかを知りたいですまた覆うzshを除くどのシェルも、その変数でNULLバイトをサポートしていないため、キャプチャされた環境です。

awkとにかく、escape \as\\とnewline 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

関連情報