Yeniden başlatmadan / etc / ortam nasıl yeniden yüklenir?


157

/etc/environmentolduğu resmen sistem çapında ortam değişkenleri için doğru bir yer. Ama nasıl olabilir yeniden başlatmadan veya relogging olmadan bu dosyada atamaları?

İlginçtir ki google burada bana yardımcı olmuyor.

source /etc/environment

Açıkçası asla işe yaramayacak, çünkü çalıştırılabilir bir komut dosyası değil (bu yüzden ... içindeki eksik komutlar /etc/environment) bir atamaların listesi (satır başına bir ).export/etc/environment


11
Sistem çapında, hiçbir fikrim yok. Geçerli kabuk oturumu için for line in $( cat /etc/environment ) ; do export $line ; done, eğer dosya formatı ise kullanabilirsiniz key=value.
Daniel Beck

2
Olmadan benim için çalışıyor export...
Izkata

2
@lzkata: Bir değişken zaten dışa aktarılmışsa, tekrar dışa aktarılması exportgerekmemelidir ... Zaten dışa aktarılmayan yeni bir değişken eklenirse, gerekli olacaktır ... (onsuz normal bir olmayan -çevrede kabuğundaki çevre değişkeni, alt süreçlerde mevcut değil)
Gert van den Berg

@DanielBeck teşekkür ederim .. bir cevap olarak yorumunuzu ekleyin!
Gadelkareem

debian ve centos da çalışıyor mu?
Massimo

Yanıtlar:


122

Yanıldığın bir şey, /etc/environmentyeniden yüklenmek için yeniden başlatma gerektirmesi. Bu yanlış. Dosyayı okuyan tek zaman oturum açma , PAM yığını etkinleştirildiğinde - özellikle pam_env.sodosyayı okur.

Oturumu kapatıp tekrar açmak değişiklikleri uygular; tüm işlemlerin yeni ortamı almasını istiyorsanız , bunu yapmanız gerekir . Diğer tüm "çözümler" 2 ortamı sadece tek bir kabuk işlemine uygulayacaktır, ancak yeni terminal pencereleri dahil olmak üzere GUI üzerinden başlattığınız hiçbir şeye uygulayamayacaktır. 1

Yanında sorun yoktur, olsa da - eksikliği exportkomutlarla telafi edilebilir set -ave set +a. Ancak, dosya da tırnak işareti kullanmadığından, hala kötü bir yöntem olarak kalır. Ancak bu iyi çalışması gerekir:

while read -r env; do export "$env"; done

1 GNOME Oturum Yöneticisi, kendi ortamını değiştirmenin bir yolunu sunar, ancak yalnızca Initializationaşamada:

$ gdbus call -e -d org.gnome.SessionManager \
                -o /org/gnome/SessionManager \
                -m org.gnome.SessionManager.Setenv \
                "FOO" "bar"
Error: GDBus.Error:org.gnome.SessionManager.NotInInitialization: Setenv
    interface is only available during the Initialization phase

2 gdb bir çözüm değildir, bazen de kullanılabilir. Bunu, oturum yöneticinizin (örn. gnome-session), Pencere yöneticinizin (örneğin gnome-shellveya openbox), varsa görev çubuğunuzun / panelinizin (örneğin xfce4-panel) ve genellikle işleri yürütebilecek başka herhangi bir şeyin (örneğin ) çalışan işlemlerine eklemeniz gerekir . Bu işlemlerin her biri gdbiçin, ona PID ile eklemeniz , putenv()işlevini çağırmanız p, sonra işlevini kullanmanız gerekir q:

$ sudo gdb -p $(pidof gnome-session)
GNU gdb (GDB) 7.7.1
[...]
Attaching to process 718
[...]
0x00007fc2cefed81d in poll () from /usr/lib/libc.so.6

(gdb) p putenv("FOO=bar")
$1 = 0

(gdb) p putenv("BAZ=qux")
$2 = 0

(gdb) q
A debugging session is active.
Quit anyway? (y or n) y
Detaching from program: /usr/bin/gnome-session, process 718

Hata ayıklayıcının işlemi duraklattığını unutmayın; bu nedenle, bileşik pencere yöneticilerine yalnızca başka bir tty'den (sanal konsol) veya SSH üzerinden eklemelisiniz, aksi takdirde ekran donar.

Buna ek olarak, dbus-daemon tarafından kullanılan ortamı da güncellemelisiniz:

$ dbus-update-activation-environment --systemd FOO=bar BAZ=qux

Daha eski sistemler için:

$ gdbus call -e -d org.freedesktop.DBus \
                -o /org/freedesktop/DBus \
                -m org.freedesktop.DBus.UpdateActivationEnvironment \
                "{'FOO': 'bar', 'BAZ': 'qux'}"
()

1
Ben sadece -r env; "$ env" ver; Ubuntu 16.04 üzerinde yapıldı ve hataları yapıldı. Daha fazla ayrıntı ister misiniz?
Frank,

while readYöntem okur stdin, bu yüzden muhtemelen borusuna kendisine (örneğin bir şey ister cat /etc/environment | while ...). Ama bu teklif biçimlendirilmiş ortam dosyaları ( key="value") ile işe yaramaz
villasv

6

Bu kabul edilen cevap kadar kapsamlı değildir, ancak /etc/environmentdosyalarınızdaki değişkenleri alıntıladıysanız, her iki önceki yöntem de (bir export $lineşekilde kullanılan) yanlış gider ve alıntılanan değerlerle sonuçlanırsınız.

  • Seçenek 1: geçici bir kaynak özellikli dosyayla

sed 's/^/export /' /etc/environment > /tmp/env.sh && source /tmp/env.sh

  • Seçenek 2: satır içi for(teşekkürler @ tim-jones):

for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done


4
Daha kısa: evalsed 's/^/export /' /etc/environment
Aaron McMillin

2
Yukarıdaki geçici olmayan dosya sürümü:for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done
Tim Jones

7
Hatta daha kısa: set -a; source /etc/environment; set +a;.
ulidtko
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.