exec-path와 $ PATH


28

사람들이 Emacs에서 기본 경로에 경로를 추가하는 예제를 온라인으로 보았습니다.

(add-to-list 'exec-path "/usr/local/bin/")

나는 Elisp를 처음 접했고 위의 내용이 무엇인지 이해한다고 생각하지만 몇 가지 질문이 있습니다.

  • 에서 어떤 순서로 이맥스는 실행 경로를 검색합니까? 예를 들어, $PATH(env. variable) 의 값을 고려 exec-path합니까 ( 그렇다면 전 또는 후에) ?

  • 여러 경로를 앞에 추가 하려면 어떻게 해야합니까? 계속 연결할 수 있습니까? 예 :

    (add-to-list 'exec-path "PATH1", "PATH2")
    

    아니면 내가해야합니까 :

    (add-to-list 'exec-path "PATH1:PATH2:PATH3") 
    

또한 GitHub에서이 흥미로운 패키지를 찾았습니다 : exec-path-from-shell . 이를 위해 패키지가 필요한 이유는 무엇입니까?

자극

쉘에서 명령이 작동하지만 Emacs에서는 작동하지 않는다는 것을 발견 한 적이 있습니까?

이것은 GUI에서 시작된 Emacs 인스턴스가 기본 환경 변수 세트를 상속하는 OS X에서 많이 발생합니다.

이 라이브러리는 사용자의 쉘에서 중요한 환경 변수를 복사하여이 문제를 해결합니다. 쉘에서 원하는 변수를 인쇄하도록 요청한 다음 Emacs 환경에 복사하여 작동합니다.


3
Emacs와 Elisp에 오신 것을 환영합니다! 나는 아직도 주제에 대해 꽤 신선하고 귀하의 질문에 대한 답변을 모르지만, 삶을 훨씬 쉽게 만드는 무언가를 언급 할 것이라고 생각했습니다. 설명 함수. 예를 들어 (describe-function 'add-to-list)( C-h f)는 add-to-list함수에 대한 문서 와 소스 링크를 제공합니다. 도있다 (describe-variable 'exec-path)( C-h v). 이 문서는 RTFM 의견이 아닙니다.이 문서는 나열된 모든 질문에 답변하는 것이 아니라 유용한 것입니다.
jtmoulia

감사합니다 @jtmoulia! 앞으로의 질문에 대해서는 반드시 명심하십시오.
Amelio Vazquez-Reina

이외에도 C-h v exec-path설명서 (Emacs 및 Elisp)를 사용하십시오. 설명서에서 i exec-path유용한 설명을 제공합니다. 먼저 Emacs에 문의하십시오 . 죄송합니다.
Drew

답변:


23

1) PATHexec-path

Emacs는 시작할 exec-path때의 값을 설정 PATH하지만 나중에 다시 보지 않습니다. 그러나 명령을 실행하면이 PATH아닌 상속됩니다 exec-path. 따라서 하위 프로세스는 Emacs와 다른 명령을 찾을 수 있습니다.

프란체스코는 말한다,이 특히에 대한 혼란을 할 수있다 shell-command즉 직접 프로세스를 실행하지 않는 한,하지만 사용하는, 그것을 실행하는 쉘을 호출 PATH하지 exec-path.

2) 여러 경로 추가 exec-path

add-to-list반복해서 전화하십시오 .

(add-to-list 'exec-path "PATH1")
(add-to-list 'exec-path "PATH2")

참고 수행 add-to-list목록의 시작 부분에 추가를, 그래서 이것은으로 끝날 것 "PATH2"에있는 exec-path"PATH1".

목록에 더 "낮은 수준의"액세스를 사용할 수도 있습니다.

(setq exec-path (append '("PATH1" "PATH2")
                        exec-path))

이 순서대로 "PATH1""PATH2"에 추가됩니다 exec-path.

3) 맥 OS의 경로

Mac OS X의 문제는 글로벌 UI에서 프로그램을 호출하거나 쉘에서 호출 할 때 Mac OS가 환경을 동일하게 설정하지 않는다는 것입니다. 즉, 쉘에서 Emacs를 실행하면 파인더에서 Emacs를 실행할 때와 다른 환경 변수가 설정됩니다. .bashrc"글로벌"Emacs에 영향을 미치지 않기 때문에 환경 변수를 설정 하거나 이와 유사한 경우 특히 성가신 일 입니다.

패키지는 분명히 쉘을 시작하고 거기에서 환경 변수를 가져 와서 전 세계적으로 시작된 Emacs의 쉘에서 얻은 환경을 모방합니다.


고마워요 Q3 관련 : PATH전역 UI (데스크톱 환경)에서 시작된 프로그램에 대한 기본값 이 정의 된 위치를 알고 있습니까? : PYTHONPATH에서 와 같은 문제가 elpy있습니다. 데스크탑에서 Emacs를 시작할 때, Emacs는 PYTHONPATH.zshenv파일 (init 파일 zsh)의 정의를 인식 elpy하지 못합니다. 파이썬 패키지를 찾을 위치를 모르기 때문에 매우 실망 스럽습니다 . 나는이 PYTHONPATH정의를 다른 쉘 init파일 로 옮기게되어 기쁘다 (이상적으로는 Emacs가 내 정의를 사용하기를 원하지만 .zshenv)
Amelio Vazquez-Reina

Mac OS X에 대해 전혀 알지 못하는 것이 두렵습니다. 빠른 Google은 stackoverflow.com/questions/135688/에 도달했습니다.… launchd.conf가 올바른 위치임을 나타냅니다. 당신은, 당신은 물론 단지 모두를 설정할 수 있습니다 이맥스되어이 필요한 모든 경우 exec-pathPATH당신을에 .emacs. 을 PATH사용하여 설정할 수 있습니다 (setenv "PATH" (format "%s:%s" "/new/path/element" (getenv "PATH"))).
Jorgen Schäfer

감사. 다음 Q가 OP와 약간 다르다는 것을 알고 있지만 Emacs에서 사용해야 하는 PYTHONPATH것을 지정하는 방법이 elpy있습니까?
Amelio Vazquez-Reina

process-environment예를 들어을 사용하여 수정할 수 있습니다 setenv. 에서 할 수 elpy-mode-hook있지만 globsl 변수이며 buffer-local로 만들면 쉽게 혼란스러운 동작을 일으킬 수 있습니다.
Jorgen Schäfer

9

막스 등의 기본 기능을 이용하여 새로운 외부 프로세스를 시작할 때 call-process또는 start-process, 실행된다에서 검색 exec-path(하지 $PATH)

그러나 shell-command셸 과 같은 함수 는 하위 프로세스로 셸 을 시작하고 실행할 명령을 전달합니다. 이 명령을 실행하기 위해, 쉘은 $PATH(에서가 아닌)에서 실행 파일을 찾으려고 시도합니다 exec-path.

따라서 exec-pathemacs 자체에 의해 시작되는 외부 프로세스에 가장 중요한 요소는 아니지만 $PATH상위 수준의 기능으로 실행하는 명령 ( M-!예 : 사용 )


에 여러 디렉토리를 추가 exec-path하려면 add-to-list여러 번 사용해야합니다 .

수동으로 할 수 있습니다

(add-to-list 'exec-path "dir1")
(add-to-list 'exec-path "dir2")

또는 루프를 사용하여

(dolist (dir '("dir1" "dir2"))
  (add-to-list 'exec-path dir))

세 번째 질문과 관련하여 emacs가 데스크탑 환경에서 시작된 경우 emacs는 환경을 상속하므로 전체 쉘보다 덜 완벽 할 수 있습니다.

이것은 때때로 $PATH일반 쉘이 보는 것을 사용 하기 위해 Emacs의 가치를 완성해야 할 수도 있음을 의미합니다 . 이것이 exec-path-from-shell당신이 언급 한 도서관 의 목적입니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.