재부팅하지 않고 / etc / environment를 다시로드하는 방법은 무엇입니까?


157

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

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

source /etc/environment

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


11
시스템 전체에서, 나는 모른다. 현재 셸 세션의 for line in $( cat /etc/environment ) ; do export $line ; done경우 파일 형식이 인 경우을 사용할 수 있습니다 key=value.
다니엘 벡

2
없이 작동 나를 위해 export...
Izkata

2
@lzkata : 변수를 이미 내 보내면 다시 내보낼 필요가 없습니다 ... 아직 내 보내지 않은 새 변수를 추가하면 export필요합니다 ... ) 자식 프로세스에서 사용할 수없는 현재의 쉘 - 환경 변수
게르트 반 덴 베르그

@DanielBeck thank you..plz 답변으로 댓글을 추가하십시오!
Gadelkareem

데비안과 센토에서도 작동합니까?
Massimo

답변:


122

당신이 잘못 알고있는 것은 /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'}"
()

1
방금 -r env를 읽는 동안 테스트했습니다. "$ env"내보내기; 우분투 16.04에서 수행되었으며 오류가 발생했습니다. 자세한 내용을 원하십니까?
Frank

while read메소드는에서 읽으 stdin므로 무언가를 파이프하고 싶을 것입니다 (예 :) cat /etc/environment | while .... 그러나 이것은 (인용 형식의 환경 파일이 작동하지 않습니다 key="value")
villasv

6

이것은 허용되는 답변만큼 포괄적이지 않지만 /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


4
짧게 : 평가sed 's/^/export /' /etc/environment
아론 맥 밀린

2
위의 임시 파일이 아닌 버전 :for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done
Tim Jones

7
더 짧은 : set -a; source /etc/environment; set +a;.
ulidtko
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.