當前位置: 首頁>>技術教程>>正文


linux – 在不重啟Ubuntu的情況下全局設置環境變量

, , ,

問題描述

我知道可以通過將條目添加到

/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

參考資料

本文由Ubuntu問答整理, 博文地址: https://ubuntuqa.com/zh-tw/article/10040.html,未經允許,請勿轉載。