Bashシェルの/proc/*/environを変更する方法

Bashシェルの/proc/*/environを変更する方法

これはシェルのPIDです。

nathan@guixlaptop ~ $ $$
bash: 10984: command not found

環境変数をエクスポートします。

nathan@guixlaptop ~ $ export TESTVAR=test

シェル環境で変数が見つかりません。

nathan@guixlaptop ~ $ cat /proc/10984/environ | grep TESTVAR || echo "fail"
fail

環境に変数を表示するには?

答え1

/proc/.../environプロセスの初期環境を含みます。:

このファイルには、現在実行中のプログラムの起動時に設定された初期環境が含まれています。execve(2)

...もし、execve(2)、プロセスは環境を変更します(たとえば、次の呼び出しを介して)。putenv(3)または修正environ(7)直接変数)ファイルにはこれらの変更は反映されません。

変更を表示するには、新しいシェルを起動する必要があります。

$ TESTVAR=test bash
$ grep TESTVAR /proc/$$/environ
grep: /proc/1825425/environ: binary file matches

environ侵入的なアクションを行わないと、実行中のシェルに表示される内容を変更できません。プロセス開始後の/proc/PID/environの変更もっと学ぶ。

答え2

NULで区切られた文字列を処理し、シェルを再起動して目的の結果を確認する必要があると思います。

$ $$
bash: 9166: command not found 
$ export TESTVAR=test_question 

# at this point, you can check `/proc/9166/environ`, but `TESTVAR` won't show up until the shell is re-started 

$ tr '\0' '\n' < /proc/9166/environ
SHELL=/bin/bash
NO_AT_BRIDGE=1
PWD=/home/pi
LOGNAME=pi
# ... etc, etc - the env var TESTVAR is not there... 

$ tr '\0' '\n' < /proc/9166/environ | grep TESTVAR
$

# re-start bash & try again:

$ exec bash 

$ tr '\0' '\n' < /proc/9166/environ | grep TESTVAR
TESTVAR=test_question
$

@aviroと@stephenkittによる単純化(コメントを参照)

答え3

strings別の例として、show proc/$$/environ ファイルを使用できます。

strings /proc/$$/environ  # $$ mean current process PID,
                            # strings process newline characters in file.
strings /proc/$$/environ | grep USER
export TESTVAR=123
env |grep TSETVAR  # found
strings /proc/$$/environ | grep TESTVAR # not found

# new session
bash
strings /proc/$$/environ | grep TESTVAR # found

関連情報