如何更改 bash shell 的 /proc/*/environ

如何更改 bash shell 的 /proc/*/environ

这是 shell 的 PID:

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

我导出一个环境变量:

nathan@guixlaptop ~ $ export TESTVAR=test

在 shell 环境中找不到该变量:

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

如何让变量出现在环境中?

答案1

/proc/.../environ包含进程的初始环境

该文件包含当前执行的程序启动时设置的初始环境execve(2)

...如果,经过execve(2),进程修改其环境(例如,通过调用诸如putenv(3)或修改environ(7)直接变量),该文件将不会反映这些更改。

要查看更改,您需要启动一个新的 shell:

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

您无法更改正在运行的 shell 中显示的内容environ,除非您采取侵入性操作;看进程启动后更改/proc/PID/environ了解详情。

答案2

我认为您需要处理 NUL 分隔的字符串,然后重新启动 shell 以查看您正在寻找的结果:

$ $$
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

另一个例子,您可以使用stringsshow 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

相关内容