
確認すると、/proc/1/environ
プロセス環境変数のヌルバイトで区切られた文字列が表示されます。1
これらの変数を現在の環境にインポートしたいと思います。見つけることができるショートカットがありますか?
マニュアルproc
ページでは、各環境変数を1行ずつ印刷するのに役立つフラグメントを提供しました(cat /proc/1/environ; echo) | tr '\000' '\n'
。これは内容が正しいことを確認するのに役立ちますが、実際にやるべきことは、これらの変数を現在のbashセッションにソースとして追加することです。
どうすればいいですか?
答え1
次のコードは、各環境変数をステートメントに変換し、export
それを正しく引用してシェルに読み込み(LS_COLORS
たとえば、セミコロンを含めることができる)インポートします。
[残念ながら、printf
inは/usr/bin
通常サポートされていないため、%q
組み込みbash
。 ]
. <(xargs -0 bash -c 'printf "export %q\n" "$@"' -- < /proc/nnn/environ)
答え2
bash
次のことができます。これは変数のすべての可能な内容に対して機能し、次のことを防ぎますeval
。
while IFS= read -rd '' var; do declare +x "$var"; done </proc/$PID/environ
これは、実行中のシェルで読み取り変数をシェル変数として宣言します。実行中のシェル環境に変数をエクスポートするには、次の手順に従ってください。
while IFS= read -rd '' var; do export "$var"; done </proc/$PID/environ
答え3
/proc/$pid/environ
この回答では、変数定義の間にnullバイトがあり、指定されたPIDを使用してプロセスコンテキストを返すシステムを想定しています。 (Linux、Sigwin、Solaris(?))。
ジッシュ
export "${(@ps:\000:)$(</proc/$pid/environ)}"
(zshが言ったように、とても簡単です。コマンドなしの入力リダイレクト <FILE
cat FILE
パラメータ拡張後の.command代替出力と同じバナー ps:\000:
「ヌルバイトに分割」を意味します。@
これは、「内容全体が二重引用符で囲まれている場合、各配列要素を別々のフィールドとして扱う」ことを意味します(一般化"$@"
)。 )
バッシュ、mksh
while IFS= read -r -d "" PWD; do export "$PWD"; done </proc/$pid/environ
PWD=$(pwd)
(このシェルでnull区切り文字を渡すと、read
nullバイトが区切り文字になります。PWD
最終的にインポートできる他の変数が破損するのを防ぐために、それを一時変数名として使用します。技術的にインポートPWD
することはできますが、そのままです。同じcd
)。
POSIX
POSIX 移植性は Curve があるシステムにのみ適用されるため、/proc/PID/environ
現在/proc/PID/environ
サポートされているため、この質問ではそれほど面白くありません。 Linuxでは、GNU UtilitiesとBusyBoxはどちらもnullから安全ですが、いくつかの注意があります。
POSIXの移植性を本当に主張している場合は、NULLバイトを処理するためにPOSIXテキストユーティリティが必要ないため、これは難しいでしょう。これは、awkがヌルバイトをレコード区切り文字としてサポートしていると仮定するソリューションです(nawkとgawkはサポートしていますが、BusyBox awkはサポートしていますがmawkはサポートしていません)。
eval $(</proc/$pid/environ awk -v RS='\0' '{gsub("\047", "\047\\\047\047"); print "export \047" $0 "\047"}')
BusyBox awk(組み込みLinuxシステムで一般的に使用されるバージョン)はnullバイトをサポートしますが、ブロック内の設定や上記RS
のコマンドライン構文はサポートしません。しかし、理由は調査されていません。私のバージョンのバグ(Debian wheezy)。"\0"
BEGIN
-v 'RS="\0"'
(値内で一重引用符をエスケープした後、nullで区切られたすべてのレコードを一重引用符で囲みます。)"\047"
ガイドライン
これらのいずれかが読み取り専用変数を設定しようとする可能性があることに注意してください(シェルに読み取り専用変数がある場合)。
答え4
使用source
とプロセスの交換:
source <(sed -r -e 's/([^\x00]*)\x00/export \1\n/g' /proc/1/environ)
まもなく:
. <(sed -r -e 's/([^\x00]*)\x00/export \1\n/g' /proc/1/environ)
使用eval
とコマンドの置き換え:
eval `sed -r -e 's/([^\x00]*)\x00/export \1\n/g' /proc/1/environ`
このsed
呼び出しは、次のawk
呼び出しに置き換えることができます。
awk -vRS='\x00' '{ print "export", $0 }' /proc/1/environ
しかし、pid 1以外の環境変数は消去されないことを忘れないでください。