OSX Yosemite에서 GUI 앱에 대해 많은 환경 변수를 설정할 수 있지만 특정 변수 PATH를 설정할 수없는 이유


16

Mavericks 릴리스까지 OSX의 PATH 문제를 정리 한 후 문제가 Yosemite로 돌아 왔습니다 !!!

따라서 Carbon Emacs 또는 RStudiolaunch.conf 와 같은 GUI 응용 프로그램에서 PATH 환경 변수를 사용할 수 있도록 새로운 Mac OSX 10.10 Yosemite 릴리스 의 이전 기능 을 모방하고 싶습니다 . 나는 stackoverflow 사용자 ursa 의 훌륭한 아이디어를 사용하여 환경 변수를 구성하는 쉘 스크립트를 설정했습니다 . (스택 오버플로 답변은 여기를 참조 하십시오 .) 이것은 대부분의 환경 변수에서는 작동 하지만 PATH 변수 에서는 작동 하지 않습니다 .launchctl

1. 내가 무엇을 했습니까?

먼저 다음 /etc/environment.rc과 같이 스크립트를 작성했습니다 .

launchctl setenv PATH /Users/halloleo/bin:/usr/texbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
launchctl setenv JAVA_HOME /usr/local/jdk1.7
launchctl setenv ENVIRONMENT_RC "yes"

그런 다음에 대한 plist를 launchd작성 했습니다 (아래 부록에있는 이들 및 기타 언급 된 스크립트 목록). 그런 다음

$ sudo launchctrl load ...

그런 다음 path_helper쉘 초기화 파일 /etc/프로파일 에서 유틸리티를 비활성화 하여 environment.rc설정을 덮어 쓰지 않습니다 . 그리고 마지막으로 기계를 다시 시작했습니다.

2. 효과는 무엇입니까?

나는 새로운 환경 변수 터미널을 시작할 때 JAVA_HOMEENVIRONMENT_RC에 따라 설정되어 environment.rc있지만, PATH로 설정되어

/ usr / bin : / bin

확인하기 위해 bashinit 파일이 현재 환경의 변수를 표시하기 위해 대신 작은 파이썬 스크립트를 작성하는 방식을 얻지 못했고 Platypus 래퍼를 두 번 클릭하여 직접 실행했습니다 . 새로운 변수가 다시 설정되는 반면 PATH는 시스템 기본값을 갖습니다.

그렇다면 왜 PATH 변수가 아닌 다른 변수를 설정할 수 있습니까? 그리고 어떻게 이것을 통합 된 방식으로 해결할 수 있습니까?

최신 정보:

상황은 매우 수수께끼입니다. bash최소한 터미널 또는 Emacs 의 셸 은을 통해 설정 한 PATH를 선택 launchctl하지만 다른 GUI 응용 프로그램은 그렇지 않습니다. 예를 들어 Platypus를 통해 직접 언급 된 최소한의 Python 스크립트는 사용자 정의를 표시하지 않습니다 통로. 그리고 Emacs 자체조차도 올바른 경로를 알지 못합니다 M-x ispell-buffer. ispellemacs가 호출하려고 시도 하는 유닉스 도구 는 사용자 정의 경로에 있으면 찾을 수 없습니다.


부록

net.halloleo.environment.plist, 시작된 구성 파일 /Library/LaunchDaemons/:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>KeepAlive</key>
    <false/>
    <key>Label</key>
    <string>net.halloleo.environment</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/etc/environment.rc</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>WatchPaths</key>
    <array>
        <string>/etc/environment.rc</string>
    </array>
</dict>
</plist>

net.halloleo.environment-user.plist, 시작된 구성 파일 /Library/LaunchAgents/:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>KeepAlive</key>
    <false/>
    <key>Label</key>
    <string>net.halloleo.environment-user</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/etc/environment.rc</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>WatchPaths</key>
    <array>
        <string>/etc/environment.rc</string>
    </array>
</dict>
</plist>

/etc/profile수정 된 bash 시작 파일 :

# System-wide .profile for sh(1)

# if [ -x /usr/libexec/path_helper ]; then
#   eval `/usr/libexec/path_helper -s`
# fi

if [ "${BASH-no}" != "no" ]; then
    [ -r /etc/bashrc ] && . /etc/bashrc
fi

show_environ.py스크립트는 모든 환경 변수를 표시합니다.

import os
print (os.environ)

답변:


3

Yosemite의 PATH는 / etc / paths 파일에서 설정할 수 있으며 설정해야합니다. 이 파일 끝에 경로를 추가하십시오.

/usr/bin
/bin
/your/custom/path

원래 게시물의 / etc / environment 스크립트 는 GUI 응용 프로그램 (Emacs로 테스트)에서 PATH 변수를 지원합니다.


5
이것은 초기화 과정에서 호출 되는 쉘 에서만 작동 /usr/libexec/path_helper합니다. GUI 응용 프로그램은 에 따라 PATH를 얻지 못하며/etc/paths GUI 응용 프로그램에 대해 특별히 물었습니다.
halloleo

원래 게시물의 답변과 / etc / environment 스크립트를 업데이트했습니다.
ursa

이것은 하나의 당신이주는이 답이다 - 또한 영업 이익은 / 말합니다 등 / 환경이 작동하지 않음
user151019

이 질문이 제기 된 후 @mark (1) / etc / environment를 업데이트했으며 이제는 PATH를 지원합니다. (2) 여기서 대답은 / etc / paths를 사용하는 것입니다
ursa

2
@mark 예, 이것이 바로 제 요점, 문제 및 질문입니다. Finder를 통해 시작할 때 GUI 앱 자체의 환경 변수 PATH를 어떻게 설정할 수 있습니까? 하지만 실제 일반 보시기에 이것에 대한 해결책은 ...
halloleo하지

2

이것은 오랫동안 나를 어리둥절하게 만들었습니다 (지난 두 시간). 결국 나는이 문제에 대해 정확하게 설명하는 것처럼 보이는이 버그 보고서에 부딪쳤다. 파이썬으로 :

http://www.openradar.me/18945659

해결책은 쉘 스크립트를 시작한 다음 파이썬을 시작하는 것 같습니다. 실제로 내가 좋아하는 것은 아니지만 그것이 그 방식입니다 ....


버그 보고서에 대한 링크를 주셔서 감사합니다. 지금은 진짜 버그입니다. 나는 그 주위에 또 다른 클러치를 발견했다. 여기에 게시하겠습니다.
halloleo

1

문제는 launchd가 환경의 변수를 바꾸지 않고 다른 PATH 변수를 추가한다는 것입니다. 대부분의 프로그램은 getenv항상 변수의 첫 번째 발생을 반환하는 대신 쉘을 사용하여 모든 환경 변수를 반복하여 로컬 변수로 가져 와서 이전 인스턴스를 마지막 인스턴스로 덮어 씁니다.

이것은 분명히 시작된 버그이며 프로그램에 전달 된 환경 변수는 고유해야합니다.


1
멋진 배경 답변! 나는 껍질에서 그 주위에 실제 방법이 아니라고 생각합니까?
halloleo

@halloleo sh -c 'YOUR ORIGINAL COMMAND'셸을 통해 명령을 실행하여 실행 된 PATH세트를 선택하여 명령을 시작할 수 있습니다 .
StenSoft
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.