他のプロセスの環境変数を取得するには?

他のプロセスの環境変数を取得するには?

確認すると、/proc/1/environプロセス環境変数のヌルバイトで区切られた文字列が表示されます。1これらの変数を現在の環境にインポートしたいと思います。見つけることができるショートカットがありますか?

マニュアルprocページでは、各環境変数を1行ずつ印刷するのに役立つフラグメントを提供しました(cat /proc/1/environ; echo) | tr '\000' '\n'。これは内容が正しいことを確認するのに役立ちますが、実際にやるべきことは、これらの変数を現在のbashセッションにソースとして追加することです。

どうすればいいですか?

答え1

次のコードは、各環境変数をステートメントに変換し、exportそれを正しく引用してシェルに読み込み(LS_COLORSたとえば、セミコロンを含めることができる)インポートします。

[残念ながら、printfinは/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が言ったように、とても簡単です。コマンドなしの入力リダイレクト <FILEcat FILEパラメータ拡張後の.command代替出力と同じバナー ps:\000:「ヌルバイトに分割」を意味します。@これは、「内容全体が二重引用符で囲まれている場合、各配列要素を別々のフィールドとして扱う」ことを意味します(一般化"$@")。 )

バッシュ、mksh

while IFS= read -r -d "" PWD; do export "$PWD"; done </proc/$pid/environ
PWD=$(pwd)

(このシェルでnull区切り文字を渡すと、readnullバイトが区切り文字になります。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以外の環境変数は消去されないことを忘れないでください。

関連情報