在Unix上,有没有办法让一个进程可以改变另一个进程的环境变量(假设它们都是由同一个用户运行)?一般的解决方案是最好的,但如果没有,那么一个人是另一个人的孩子的具体情况怎么样?
编辑:通过gdb怎么样?
在Linux中当我从shell调用python时,它复制了它的环境,并启动了python进程.因此,如果我执行以下操作:
import os
os.environ["FOO"] = "A_Value"
Run Code Online (Sandbox Code Playgroud)
当python进程返回时,FOO(假设它原来是未定义的)仍将是未定义的.有没有办法让python进程(或任何子进程)修改其父进程的环境?
我知道你通常用类似的东西来解决这个问题
source script_name.sh
Run Code Online (Sandbox Code Playgroud)
但这与我的其他要求相冲突.
我有一个shell脚本,带有一个shell变量列表,在进入编程环境之前执行.
我想使用Perl脚本进入编程环境:
system("environment_defaults.sh");
system("obe");
Run Code Online (Sandbox Code Playgroud)
但是当我进入环境时,变量没有设置.
这个似乎微不足道,但现在几天我的答案已经躲过了.
我有一个Windows批处理文件,它调用C#程序进行额外的验证,这是在批处理文件中无法完成的.验证完成后,我需要将状态和字符串返回给调用shell.
现在返回值很简单,我的C#控制台应用程序只是设置一个返回值(如果你愿意,退出代码).我认为这根绳子也是小菜一碟.我尝试使用以下命令定义一个新的shell变量:
Environment.SetEnvironmentVariable("ERR", "Some text");
Run Code Online (Sandbox Code Playgroud)
这个调用应该(并且确实)在当前进程中定义一个shell变量- 这是创建变量的C#进程.一旦C#应用程序终止并且创建C#应用程序的shell对变量一无所知,该值就会丢失.所以...一个没有特别用途的电话......完全......除非我从C3应用程序创建了一个子进程,否则它可能会继承我的变量.
SetEnvironmentVariable调用的EnvironmentVariableTarget.Machine和EnvironmentVariableTarget.User目标也不能解决问题,因为只有新创建的进程才能从注册表中获取这些新值.
所以我能想到的唯一可行解决方案是:
前两个有点难看,最后一个有其局限性和问题.
任何其他想法(如何在父进程中设置shell变量)?也许这样的shell变量修改是一个安全问题(想想PATH)......
感谢您的时间.
“孩子继承父母的环境”是什么意思?通过复制整个环境来继承,还是通过接收指向同一环境的指针来继承(以某种方式)?
这是我的场景:
P,有自己的环境(变量)P执行fork0的克隆中,执行if-statementCexecv因此,在某个时刻,应用程序会停止正常工作。原因就是——“破碎”的环境。
有趣的是,两个环境都改变了。当我启动父进程并执行时
$ cat /proc/PID/environ
Run Code Online (Sandbox Code Playgroud)
对于父母和进程来说,一切都很好。几个小时后,应用程序停止工作,当我再次执行上面的行(以检查环境)时,两者都发生了更改,并且丢失了很多环境变量 - 只有标准变量存在(如 、PWD、HOME等USER)。
这怎么可能?问题出在哪里——孩子还是父母?
编辑:感谢大家的回答,我+1,因为它们都是正确的(@caf、@Saphrosit 和@R..)。这个问题的原因实在是太蠢了。。
所有环境变量都放置在/etc/profile登录后执行的位置(那..我不知道)。
嗯,看来问题是在重新启动机器时发生的。因此,在启动时,应用程序会再次启动,但/etc/profile/不会执行/读取。这会导致不良行为。这就是为什么手动重新启动时问题消失的原因 - 一旦 aroot登录(通过ssh),环境变量就会/etc/profiles被读取,并且当父进程重新启动(通过root)时,一切都很好 - 环境变量被继承。
愚蠢的错误。