재부팅하지 않고 / etc / environment를 다시로드하는 방법은 무엇입니까? 어떻게 해야합니까? 흥미롭게도 Google은 수십 개의 블로그 게시물을

/etc/environment이다 공식적으로 시스템 전체 환경 변수에 대한 올바른 위치. 그러나 재부팅하거나 다시 로그하지 않고이 파일에서 할당을 다시로드 하려면 어떻게 해야합니까?

흥미롭게도 Google은 수십 개의 블로그 게시물을 제외하고는 여기에서 도움이되지 않습니다.

source /etc/environment

실행 가능한 스크립트가 아닌 어설 션 목록 (한 줄에 하나씩) 이기 때문에 분명히 작동 하지 않습니다 (따라서 명령 이 누락 됨 )./etc/environmentexport/etc/environment



답변

당신이 잘못 알고있는 것은 /etc/environment다시로드하기 위해 재부팅해야 한다는 것 입니다. 이것은 올바르지 않습니다. 파일을 읽을 수있는 유일한 시간은 로그인에 특별히 – PAM 스택이 활성화되고, pam_env.so파일을 읽는.

로그 아웃했다가 다시 로그인하면 변경 사항이 적용됩니다. 실제로 모든 프로세스가 새 환경을 받도록하려면이 작업을 수행 해야 합니다 . 다른 모든 “솔루션” 2 는 단일 쉘 프로세스에만 환경을 적용하지만 새 터미널 창을 포함하여 GUI를 통해 실행하는 항목에는 적용되지 않습니다. 1

당신이 그와 함께 잘 경우, 그러나 -의 부족 export명령으로 보상 될 수 set -aset +a. 그러나 파일에서 인용 부호를 사용하지 않기 때문에 여전히 나쁜 방법입니다. 그러나 이것은 잘 작동합니다.

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

1 그놈 세션 관리자는 자체 환경을 변경할 수있는 방법을 제공합니다 Initialization.

$ 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 는 해결책이 아니지만 때때로 사용할 수 있습니다. 세션 관리자 (예 🙂 gnome-session, 창 관리자 (예 : gnome-shell또는 openbox), 작업 표시 줄 / 패널 (있는 경우 xfce4-panel) (예 🙂 및 일반적으로 실행 가능한 다른 항목 의 실행중인 프로세스에이를 첨부해야합니다 . 이러한 각 프로세스에 대해 gdbPID 로 첨부 하고을 사용하여 putenv()함수를 호출 p한 후 다음을 사용하여 분리해야합니다 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

디버거는 프로세스를 일시 중지하므로 다른 tty (가상 콘솔) 또는 SSH를 통해서만 합성 창 관리자에 연결해야합니다. 그렇지 않으면 화면이 정지됩니다.

또한 dbus-daemon에서 사용하는 환경도 업데이트해야합니다.

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

구형 시스템의 경우 :

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


답변

이것은 허용되는 답변만큼 포괄적이지 않지만 /etc/environment파일에 변수를 인용 하면 이전 방법 ( export $line어쨌든 사용 )이 잘못되어 인용 값으로 끝납니다.

  • 옵션 1 : 임시 소스 가능 파일

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

  • 옵션 2 : 인라인 사용 for(@ tim-jones 덕분에) :

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


답변