이 질문은 수퍼 유저 is-re-way-to-reload-environment-variables-in-emacs 에서 요청되었지만 좋은 해결책은 없습니다.
쉘에서 환경 변수를 변경하면 EmacsClient를 종료하고 (모든 버퍼를 다시 열어야 함) Emacs에서도 환경 변수를 수동으로 설정해야합니다. Emacs에서 환경 변수를 쉽게 업데이트 할 수 없다는 것이 짜증납니다. 어떤 제안?
이 질문은 수퍼 유저 is-re-way-to-reload-environment-variables-in-emacs 에서 요청되었지만 좋은 해결책은 없습니다.
쉘에서 환경 변수를 변경하면 EmacsClient를 종료하고 (모든 버퍼를 다시 열어야 함) Emacs에서도 환경 변수를 수동으로 설정해야합니다. Emacs에서 환경 변수를 쉽게 업데이트 할 수 없다는 것이 짜증납니다. 어떤 제안?
답변:
exec-path-from-shell 은 exec-path-from-shell-copy-env
환경 변수 값을 Emacs 세션으로 복사 할 수 있는 명령을 제공 합니다. 예를 들어, Emacs M-x exec-path-from-shell-copy-env RET FOO
의 값도 설정합니다 $FOO
.
참고 exec-path-from-shell-copy-env
로 급부상에게 새로운 환경 변수의 값을 추출하는 쉘. 따라서 셸 구성 파일 (예 :)에서 설정 한 변수에만 작동 .bashrc
하지만으로 실행중인 셸 세션에서만 설정 한 변수에는 작동하지 않습니다 export
. /proc/
프로세스 실행을 위해 유사한 API를 검사 하거나 유사한 API를 사용 하지 않으면 이러한 변수를 추출 할 수 없습니다 .
해결 방법으로 다음을 사용할 수 있습니다 (Linux, Bash).
printenv -0 > env.txt
Bash 터미널 창에서 실행 하십시오.(defun my-update-env ()
(interactive)
(let ((str
(with-temp-buffer
(insert-file-contents "env.txt")
(buffer-string))) lst)
(setq lst (split-string str "\000"))
(while lst
(setq cur (car lst))
(when (string-match "^\\(.*?\\)=\\(.*\\)" cur)
(setq var (match-string 1 cur))
(setq value (match-string 2 cur))
(setenv var value))
(setq lst (cdr lst)))))
최신 정보
나는 명령 --eval
옵션을 사용하여보다 우아하게 수행 할 수 있음을 알았습니다 emacsclient
: Bash 스크립트 정의 update_emacs_env
:
#! /bin/bash
fn=tempfile
printenv -0 > "$fn"
emacsclient -s server_name -e '(my-update-env "'"$fn"'")' >/dev/null
여기서 server_name
Emacs 서버 이름 my-update-env
은 ~/.emacs
파일에 의해 정의 된 함수입니다 .
(defun my-update-env (fn)
(let ((str
(with-temp-buffer
(insert-file-contents fn)
(buffer-string))) lst)
(setq lst (split-string str "\000"))
(while lst
(setq cur (car lst))
(when (string-match "^\\(.*?\\)=\\(.*\\)" cur)
(setq var (match-string 1 cur))
(setq value (match-string 2 cur))
(setenv var value))
(setq lst (cdr lst)))))
이제 update_emacs_env
쉘 명령 행에서 간단히 입력 하여 Emacs 환경 변수를 업데이트 할 수 있습니다 .
source
.bashrc, .bash_profile 등?
export VAR=value