launchd.conf를 통한 환경 변수 설정이 OS X Yosemite / El Capitan / macOS Sierra / Mojave에서 더 이상 작동하지 않습니까?


190

launchd.conf더 이상 내 환경 변수를로드하지 않는 것 같습니다 . 다른 사람이 알아 차렸습니까?

환경 변수를 영구적으로 설정하는 또 다른 솔루션이 있습니까?


이 작업을 수행하고 터미널에서 응용 프로그램이 아닌 자체를 사용할 수 있도록
장 조

답변:


159

이 내용으로 environment.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>Label</key>
  <string>my.startup</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>
    launchctl setenv PRODUCTS_PATH /Users/mortimer/Projects/my_products
    launchctl setenv ANDROID_NDK_HOME /Applications/android-ndk
    launchctl setenv PATH $PATH:/Applications/gradle/bin
    </string>

  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

블록 launchctl안에 많은 명령을 추가 할 수 있습니다 <string></string>.

plist시스템 재부팅 후 활성화됩니다. launchctl load ~/Library/LaunchAgents/environment.plist즉시 시작할 수도 있습니다 .

[편집하다]

El Capitan에서도 동일한 솔루션이 작동합니다.

Xcode 7.0+는 기본적으로 환경 변수를 평가하지 않습니다. 이 명령으로 이전 동작을 활성화 할 수 있습니다.

defaults write com.apple.dt.Xcode UseSanitizedBuildSystemEnvironment -bool NO

[편집하다]

이것이 제대로 작동하지 않는 몇 가지 상황이 있습니다. 컴퓨터가 다시 시작되고 "다시 로그인 할 때 창 다시 열기"를 선택하면 다시 열린 창에 변수가 표시되지 않을 수 있습니다 (에이전트가 실행되기 전에 열려있을 수 있음). 또한 ssh를 통해 로그인하면 변수가 설정되지 않으므로 ~ / .bash_profile에서 변수를 설정해야합니다. 마지막으로 El Capitan 및 Sierra의 PATH에서는 작동하지 않는 것 같습니다. 'launchctl config user path ...'및 / etc / paths를 통해 설정해야합니다.


20
다시 부팅 할 필요가 없습니다! "launchctl start environment.plist"를 수행하고 새로운 env vars를 얻는 데 필요한 앱을 다시 시작할 수 있습니다;)
hasvn

1
이것은 나를 위해 PATH 변수와 함께 작동하지 않습니다. 따라서 다른 변수를 설정하기위한이 접근법 외에도 ~ / .bash_profile에서 PATH 변수를 설정했습니다. 이것은 모든 경우에 잘 작동하지는 않지만 지금까지는 문제가 없습니다.
djule5

6
그것을 알아 냈 : 재부팅없이하려면, 그것은 "launchctl을해야 부하 environment.plist"이 아닌 시작
데이브 Hartnoll에게

2
아 예. 전체 인터넷 (google UseSanitizedBuildSystemEnvironment) 에 정확히 9 번 나타나는 불분명 한 구성 설정과 같은 것은 없습니다 .
Ohad Schneider

2
뿐만 아니라 시에라에서 작동
Shwouchk

64

[ 원래 답변 ] : 모든 응용 프로그램 (터미널을 통해 시작된 것 외에 Dock 또는 Spotlight를 통해 시작된 그래픽 응용 프로그램 launchctl setenv variablename value)에서 선택되도록 변수를 설정하는 데 계속 사용할 수 있습니다 .

분명히 로그인 할 때마다이 작업을 수행하지 않을 것입니다.

[ 편집 ] :이를 피하려면을 실행 AppleScript Editor하고 다음과 같은 명령을 입력하십시오.

do shell script "launchctl setenv variablename value"

(여러 변수를 설정하려면 여러 줄을 사용하십시오)

이제 ( + s)를 파일 형식 : Application 으로 저장하십시오 . 마지막으로 System Settings사용자 및 그룹로그인 항목을 열고 새 응용 프로그램을 추가하십시오.

[ 원래 답변 ] :이 문제를 해결하려면 짧은 쉘 스크립트에서 정의하려는 모든 변수를 확인한 다음 MacOS 로그인에서 스크립트를 실행하는 방법에 대한 이전 답변을 살펴보십시오 . 그렇게하면 사용자가 로그인 할 때 스크립트가 호출됩니다.

[ 편집 ] : 변수가 특정 사용자 에게만 설정되므로 솔루션이 완벽 하지는 않지만 필요한 모든 것을 기대하고 추측합니다.

여러 사용자가있는 경우 각 사용자 에 대해 로그인 항목 을 수동으로 설정 하거나 동일한 쉘 스크립트를 가리키는 각 로컬 Library / LaunchAgents 디렉토리 에 com.user.loginscript.plist 사본을 배치 할 수 있습니다 .

물론 이러한 해결 방법 중 어느 것도 /etc/launchd.conf 만큼 편리하지 않습니다 .

[ 추가 편집 ] : 아래 사용자는 이것이 효과가 없다고 언급합니다. 그러나 여러 요세미티 머신에서 테스트했으며 나에게 효과적입니다. 문제가있는 경우 적용하려면 응용 프로그램을 다시 시작해야합니다. 또한 ~ / .profile 또는 ~ / .bash_profile을 통해 터미널에 변수를 설정 하면 쉘에서 시작된 응용 프로그램에 대해 launchctl setenv 를 통해 설정 한 변수 가 재정의됩니다 .


5
내가 알 수있는 한,이 기술의 한 가지 단점은 로그인 할 때 시작된 다른 응용 프로그램에 대해 변수가 설정되지 않는다는 것입니다. 예를 들어 터미널을 열면 변수가 설정되지만 터미널을 자동으로 다시 시작한 후 로그 오프했다가 다시 로그온하면 변수가 설정되지 않습니다.
JasonD

나는이 솔루션을 시도했지만 나에게도 효과가 없었다. 그러나 특히 Java IDE (IntelliJ)가 경로 수정을 가져올 것으로 예상하지만 그렇지 않습니다. 터미널에서 모든 것이 잘 작동합니다. IntelliJ의 버그 일 수 있습니다. 여전히 애플이이 기능을 제거했다는 것에 실망했다. 저는 Apple에 전화를했는데 별 도움이되지 않았습니다.
Jason

이것은 나를 위해 일하고 있지만 sudo에 환경 변수를 추가하기 위해 무엇을 해야하는지 알고 있습니까?
etiennenoel

2
이것은 일반적으로 작동하지만 $ PATH 설정이 이런 방식으로 작동하지 않는 Yosemite (최소 10.10.0 및 10.10.1)에 버그가 있습니다. 애플은 버그를 알고있다. 현재 (10.10.1 현재) GUI 응용 프로그램에 대해 시스템 전체 $ PATH를 설정하는 알려진 방법은 없습니다.
TJ Luoma

3
위에서 언급 한 방법 중 하나를 사용하고 랩톱을 재부팅 한 후 응용 프로그램 (iTerm, 터미널, Eclipse, IDEA 또는 사용중인 항목)을 명시 적으로 다시 열어야합니다. 명시 적으로 다시 시작하지 않으면 OSx를 다시 부팅하는 동안 "다시 로그인 할 때 창 다시 시작"확인란이 선택되어 있습니다 (기본값). 해당 프로그램은 새로운 환경 변수를 읽지 못합니다.
Ran

21

Mac OS X 10.10 Yosemite에서 3 개의 파일 + 2 개의 명령으로 환경 변수를 설정할 수 있습니다.

환경 변수 정의가있는 기본 파일 :

$ ls -la /etc/environment 
-r-xr-xr-x  1 root  wheel  369 Oct 21 04:42 /etc/environment
$ cat /etc/environment
#!/bin/sh

set -e

syslog -s -l warn "Set environment variables with /etc/environment $(whoami) - start"

launchctl setenv JAVA_HOME      /usr/local/jdk1.7
launchctl setenv MAVEN_HOME     /opt/local/share/java/maven3

if [ -x /usr/libexec/path_helper ]; then
    export PATH=""
    eval `/usr/libexec/path_helper -s`
    launchctl setenv PATH $PATH
fi

osascript -e 'tell app "Dock" to quit'

syslog -s -l warn "Set environment variables with /etc/environment $(whoami) - complete"

사용자 애플리케이션 (터미널, IDE 등)의 환경 변수를로드하기위한 서비스 정의 :

$ ls -la /Library/LaunchAgents/environment.user.plist
-rw-------  1 root  wheel  504 Oct 21 04:37 /Library/LaunchAgents/environment.user.plist
$ sudo cat /Library/LaunchAgents/environment.user.plist
<?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>Label</key>
    <string>environment.user</string>
    <key>ProgramArguments</key>
    <array>
            <string>/etc/environment</string>
    </array>
    <key>KeepAlive</key>
    <false/>
    <key>RunAtLoad</key>
    <true/>
    <key>WatchPaths</key>
    <array>
        <string>/etc/environment</string>
    </array>
</dict>
</plist>

루트 사용자 애플리케이션에 대한 동일한 서비스 정의 :

$ ls -la /Library/LaunchDaemons/environment.plist
-rw-------  1 root  wheel  499 Oct 21 04:38 /Library/LaunchDaemons/environment.plist
$ sudo cat /Library/LaunchDaemons/environment.plist
<?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>Label</key>
    <string>environment</string>
    <key>ProgramArguments</key>
    <array>
            <string>/etc/environment</string>
    </array>
    <key>KeepAlive</key>
    <false/>
    <key>RunAtLoad</key>
    <true/>
    <key>WatchPaths</key>
    <array>
        <string>/etc/environment</string>
    </array>
</dict>
</plist>

마지막으로 다음 서비스를 등록해야합니다.

$ launchctl load -w /Library/LaunchAgents/environment.user.plist
$ sudo launchctl load -w /Library/LaunchDaemons/environment.plist

우리가 얻는 것 :

  1. 시스템 환경 변수를 선언 할 수있는 유일한 곳 : / etc / environment
  2. / etc / environment 파일 수정 후 환경 변수의 자동 자동 업데이트-응용 프로그램을 다시 시작

문제 / 문제 :

시스템 재부팅 후 응용 프로그램에서 env 변수를 올바르게 가져 오려면 다음이 필요합니다.

  • 두 번의 로그인 : login => logout => login
  • 또는 env 변수를 가져와야하는 응용 프로그램을 수동으로 닫았다가 다시 엽니 다
  • 또는 "다시 로그인 할 때 창 다시 열기"기능을 사용하지 마십시오.

Apple은로드 된 서비스의 명시 적 순서를 거부하기 때문에 env 변수가 "다시 열기 큐"처리와 동시에 등록됩니다.

그러나 실제로 시스템을 1 년에 몇 번만 (다시 업데이트 할 때) 재부팅하므로 큰 문제가되지 않습니다.


좋은 생각이야 나는 그것을 시도했고 그것은 대부분의 환경 변수 (와 같은 JAVA_HOME)에서는 작동하지만 변수에서는 작동 하지 않습니다 PATH( ask ask에 대한 내 질문 참조 ).
halloleo

4
PATH는 / etc / paths 파일로 설정해야합니다. 이 파일의 끝에 사용자 정의 경로를 추가하십시오.
ursa

나는에 익숙하지 launchd않지만 부팅 할 때 (즉, 로그인 전에) 데몬을로드 할 수 없습니까? 그것은 당신이 언급 한 모든 문제를 우회해야합니다.
Egon

위의 방법을 좋아하지만 관리해야 할 이상한 문제가 있습니다. 재부팅 후 VARNAME은 올바른 값을 반환하지만 echo $ VARNAME은 아무것도 반환하지 않습니다. 그 이유는 무엇입니까? 나는이에 게시 stackoverflow.com/questions/27045137/... 뿐만 아니라 희망 여기에 누군가가 생각이 있는지
CTP

/ etc / environment의 파일 권한이 위에서 설명한 것과 같은지 확인하십시오.
imanuelcostigan

6

인용

Apple Developer Relations 10-Oct-2014 09:12 PM

많은 심의 후에 엔지니어링은이 기능을 제거했습니다. /etc/launchd.conf보안상의 이유로 파일 이 의도적으로 제거되었습니다. 이 문제를 해결하기 위해 launchctl limit부팅하는 동안 루트에서 루트로 실행할 수 있습니다 LaunchDaemon. (...)

해결책:

/Library/LaunchDaemons/com.apple.launchd.limit.plistbash-script로 코드를 입력하십시오 .

#!/bin/bash

echo '<?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>Label</key>
        <string>eicar</string>
        <key>ProgramArguments</key>
        <array>
                <string>/bin/launchctl</string>
                <string>limit</string>
                <string>core</string>
                <string>unlimited</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>ServiceIPC</key>
        <false/>
</dict>
</plist>' | sudo tee /Library/LaunchDaemons/com.apple.launchd.limit.plist

1
좀 더 설명해 주시겠습니까? 'Solve Issue'가 초기 문제와 어떤 관련이 있는지 알 수 없습니다!
Nick H247

OP는 아니지만 여기에 요점은 다음과 같습니다.이 plist를에 넣고 명령 을 실행 /Library/LaunchDaemons하라는 명령 대신 명령으로 경로 문자열을 인수 로 실행하도록 지시하십시오 . 시작할 때 자동으로 선택하고 거의 즉시 자체 수정됩니다. launchctllimitsetenvPATHlaunchd
Laird Nelson

5
xml이 불완전하게 복사되었습니다. doctype 줄은 다음과 같아야합니다<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
UloPe

6
@aax 그 plist의 어떤 부분이 실제로 환경 변수를 설정합니까?
HairOfTheDog 1

3

이전 동작을 복원하는 명령은 다음과 같습니다.

# create a script that calls launchctl iterating through /etc/launchd.conf
echo '#!/bin/sh

while read line || [[ -n $line ]] ; do launchctl $line ; done < /etc/launchd.conf;
' > /usr/local/bin/launchd.conf.sh

# make it executable
chmod +x /usr/local/bin/launchd.conf.sh

# launch the script at startup
echo '<?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>Label</key>
  <string>launchd.conf</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>/usr/local/bin/launchd.conf.sh</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>
' > /Library/LaunchAgents/launchd.conf.plist

지금 당신은 같은 명령을 지정할 수 있습니다 setenv JAVA_HOME /Library/Java/Home에서 /etc/launchd.conf.

El Capitan에서 확인했습니다.


2

나를 위해 일한 것은 무엇입니까 (도끼 덕분에 영감을 얻음) :

이것을 /Library/LaunchDaemons/com.apple.launchd.limit.plist에 붙여 넣은 다음 재부팅하십시오.

<?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>Label</key>
  <string>eicar</string>
  <key>ProgramArguments</key>
  <array>
    <string>/bin/launchctl</string>
    <string>limit</string>
    <string>maxfiles</string>
    <string>16384</string>
    <string>16384</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>ServiceIPC</key>
  <false/>
</dict>
</plist>

단계별로 필요한 경우 :

  • 터미널 시작
  • 유형 sudo는 스와 다음 루트로 로그인 암호를 입력
  • vi /Library/LaunchDaemons/com.apple.launchd.limit.plist를 입력하십시오.
  • vi 편집기에있을 때 키 i 를 눌러 삽입 모드로 들어간 다음 위에 정확한 코드 내용을 붙여 넣습니다 (⌘+v ). 이렇게하면 프로세스 당 16384 개의 파일과 총 16384 개의 파일로 제한이 적용됩니다.
  • 파일을 저장하고 esc다음을 사용하여 종료하십시오.:wq
  • 시스템을 재부팅하고 launchctl limit 명령을 사용하여 작동하는지 확인하십시오.

이것이 도움이 되었기를 바랍니다.


10
이 솔루션은 환경 변수 설정과 어떤 관련이 있습니까?
HairOfTheDog 1

2

https://github.com/ersiner/osx-env-sync 시도해 볼 수 있습니다 . 단일 소스 에서 명령 행 및 GUI 앱모두 처리 하고 최신 버전의 OS X에서 작동합니다. (Yosemite) .

당신이 쓰는 것은 처음에는 bash에 의해 소스되는 정규 bash 스크립트이기 때문에 경로 대체와 다른 쉘 트릭을 사용할 수 있습니다. 제한이 없습니다. ( osx-env-sync 문서를 확인하면 어떻게 달성되는지 이해할 수 있습니다.)

나는 비슷한 질문에 대답 여기에 좀 더 찾아 볼 수있는 곳.


-3

해결책은에 변수를 추가하는 것 /etc/profile입니다. 그런 다음 모든 것이 예상대로 작동합니다! 물론 sudo nano / etc / profile을 사용하여 루트 사용자로해야합니다. 다른 방법으로 편집하면 권한을 root로 변경하더라도 시스템에 손상된 / etc / profile이 표시됩니다.


7
프로파일에 환경 변수를 추가하는 것은 쉘 프로세스에만 영향을 미치기 때문에 훨씬 열등합니다.
UloPe

-5

~ / .bash_profile에 다음과 같은 방법으로 변수를 추가했습니다. 완료 후 다시 시작 / 로그 아웃 및 로그인

export M2_HOME=/Users/robin/softwares/apache-maven-3.2.3
export ANT_HOME=/Users/robin/softwares/apache-ant-1.9.4
launchctl setenv M2_HOME $M2_HOME
launchctl setenv ANT_HOME $ANT_HOME
export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/robin/softwares/apache-maven-3.2.3/bin:/Users/robin/softwares/apache-ant-1.9.4/bin
launchctl setenv PATH $PATH

참고 : 재시작 / 로그 아웃 및 로그인없이 다음을 사용하여 이러한 변경 사항을 적용 할 수 있습니다.

source ~/.bash_profile

로그 아웃했다가 다시 로그인 할 필요는 없습니다. source 명령 (예 : source .bash_profile) 만 사용하십시오.
Michael

2
또한이 방법의 문제점은 환경 변수를 사용하기 전에 터미널을 열어야한다는 것입니다. 첫 번째 답변의 내용을 수행하는 것이 더 좋으므로 터미널을 열지 않고도 사용할 수 있습니다.
Michael

1
SpotLight를 통해로드 된 앱에서는 작동하지 않습니다. stackoverflow.com/questions/135688/…
Rasika Perera

1
bash 설정 파일을 사용하는 것은 도움이되는 환경의 프로세스의 조상으로 항상 bash를 가지고 있다고 가정하기 때문에 도움이되지 않습니다. Spotlight, 파인더, emacs, xcode, cronjobs, 시작된 에이전트, IDE, 소스 제어 브라우저 등은 모두 조상으로 bash를 갖지 않습니다. 이를 일관되게 확장 할 수있는 유일한 프로세스가 시작됩니다.
Ben Hyde
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.