问题描述
我知道可以通过将条目添加到
/etc/environment
要么
/etc/profile
但这需要系统重新启动或X重新启动。
是否可以在Ubuntu /Linux中设置环境变量,以便在不重新启动操作系统或注销用户的情况下立即在整个系统范围内可用?
最佳方法
这个perl程序使用gdb将当前正在运行的所有bash shell中的USER变量更改为程序arg给出的值。要设置新变量,可以使用内部bash调用”set_if_not”
#!/usr/bin/perl
use strict;
use warnings;
my @pids = qx(ps -C bash -o pid=);
my $foo = $ARGV[0];
print "changing user to $foo";
print @pids;
open( my $gdb, "|gdb" ) || die "$! gdb";
select($gdb);
$|++;
for my $pid ( @pids ) {
print "attach $pid\n";
sleep 1;
print 'call bind_variable("USER","' . $foo . '",0)' . "\n";
sleep 1;
print "detach\n";
}
这仅适用于bash(我仅在Ubuntu 10.04 LTS上使用4.1版进行了测试),并且不会更改任意已运行程序的环境。显然,它必须以root身份运行。
次佳方法
简单的答案是:您通常不能这样做。
为什么没有通用的解决方案?
“why?”需要更详细的说明。在Linux中,环境为process-specific。每个过程环境都存储在专门为此过程分配的特殊存储区中。
As an aside: To quickly inspect the environment of a process, have a look at
/proc/<pid>/env
(or try/proc/self/env
for the environment of the currently running process, such as your shell).
当(“parent”)进程启动另一个(“child”)进程(通过fork(2)
)时,将复制父级环境的环境以产生子级环境。此后这两个环境之间没有inheritance-style关联,它们是完全分开的。因此,没有”global”或”master”环境可以更改以实现您想要的。
为什么不简单地更改所有正在运行的进程的per-process环境?该环境的内存区域位于well-defined位置(基本上就在分配给堆栈的内存之前),因此您无法轻松扩展它,而不会破坏该进程的其他关键内存区域。
特殊情况下可能为half-solutions
就是说,您可以想象几种特殊的情况,在这些情况下您确实可以实现所需的功能。
-
最明显的是,如果您进行”size-neutral”更改,则可以想象修补所有进程的所有环境。例如,将每个
USER=foo
环境变量(如果存在)替换为USER=bar
。我担心这是一个非常特殊的情况。 -
如果您真的不需要更改所有进程的环境,而只需要更改well-known类的环境,则可以使用更具创造性的方法。 Vorsprung’s answer是仅使用Bash进程即可完成此操作的令人印象深刻的演示。
可能还有许多其他特殊情况,其中有可能的解决方案。但是如上所述:对于一般情况,没有解决方案。
第三种方法
当然export VAR=value
您也可以再次source /etc/profile