我知道可以通过将条目添加到系统范围内的环境变量来设置环境变量。
/etc/environment
或者/etc/profile
但这需要系统重启或 X 重启。
在 Ubuntu / Linux 中是否可能设置环境变量,以便立即在整个系统范围内可用,而无需重新启动操作系统或注销用户?
顺便说一句:要快速查看进程环境,请查看/proc/<pid>/env
(或尝试/proc/self/env
查看当前正在运行的进程的环境,例如您的shell)。
fork(2)
),父进程的环境被复制以生成子进程的环境。此后这两个环境之间没有继承式的关联,它们是完全独立的。所以我们不能改变“全局”或“主”环境,来实现你想要的目标。最明显的是,如果你进行“大小中性”的更改,你可以修补所有进程的所有环境。例如,将每个存在的USER=foo
环境变量替换为USER=bar
。我担心这是一种非常特殊的情况。
如果你不需要更改所有进程的环境,而只需要更改某个已知类别的进程环境,那么可能可以采用更有创意的方法。Vorsprung的回答 是使用仅Bash进程做到这一点的一个令人印象深刻的演示。
可能还有许多其他特殊情况,存在可能的解决方案。但如上所述:对于一般情况没有解决方案。
这个 Perl 程序使用 gdb 来将所有当前正在运行的 bash shell 中的 USER 变量更改为给定的程序参数。要设置一个新变量,可以使用内部的 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权限运行。
ps -C bash -o pid=
来消除 PID
标题行。然后可以使用 @pid
代替 @pids[1..$#pids]
。 - TrueY=
就可以了。 - TrueY我担心这里的解决方案会让人感到沮丧:不要使用环境变量,而是使用文件。
因此,不要像设置/etc/environment一样:
SPECIAL_VAR='some/path/I/want/later/'
并且使用以下方式调用:
$SPECIAL_VAR
请在 ~/.yourvars 中创建一个文件,并将以下内容写入:
SPECIAL_VAR='some/path/I/want/later/'
cd `source ~/.yourvars; echo $SPECIAL_VAR`
gdb
连接到该进程。虽然它可以工作,但这种方法很不正规。 - SiegeX