インタラクティブシェルをプログラムで読みたい環境を考えてみましょう。これで、シェルを起動して実行し、/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)方法はありますかperl
?python
ruby
答え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