답변:
이 내용으로 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를 통해 설정해야합니다.
UseSanitizedBuildSystemEnvironment
) 에 정확히 9 번 나타나는 불분명 한 구성 설정과 같은 것은 없습니다 .
[ 원래 답변 ] : 모든 응용 프로그램 (터미널을 통해 시작된 것 외에 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 를 통해 설정 한 변수 가 재정의됩니다 .
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
우리가 얻는 것 :
문제 / 문제 :
시스템 재부팅 후 응용 프로그램에서 env 변수를 올바르게 가져 오려면 다음이 필요합니다.
Apple은로드 된 서비스의 명시 적 순서를 거부하기 때문에 env 변수가 "다시 열기 큐"처리와 동시에 등록됩니다.
그러나 실제로 시스템을 1 년에 몇 번만 (다시 업데이트 할 때) 재부팅하므로 큰 문제가되지 않습니다.
launchd
않지만 부팅 할 때 (즉, 로그인 전에) 데몬을로드 할 수 없습니까? 그것은 당신이 언급 한 모든 문제를 우회해야합니다.
인용
Apple Developer Relations
10-Oct-2014 09:12 PM
많은 심의 후에 엔지니어링은이 기능을 제거했습니다.
/etc/launchd.conf
보안상의 이유로 파일 이 의도적으로 제거되었습니다. 이 문제를 해결하기 위해launchctl limit
부팅하는 동안 루트에서 루트로 실행할 수 있습니다LaunchDaemon
. (...)
해결책:
/Library/LaunchDaemons/com.apple.launchd.limit.plist
bash-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
/Library/LaunchDaemons
하라는 명령 대신 명령으로 경로 문자열을 인수 로 실행하도록 지시하십시오 . 시작할 때 자동으로 선택하고 거의 즉시 자체 수정됩니다. launchctl
limit
setenv
PATH
launchd
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
이전 동작을 복원하는 명령은 다음과 같습니다.
# 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에서 확인했습니다.
나를 위해 일한 것은 무엇입니까 (도끼 덕분에 영감을 얻음) :
이것을 /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>
단계별로 필요한 경우 :
⌘+v
). 이렇게하면 프로세스 당 16384 개의 파일과 총 16384 개의 파일로 제한이 적용됩니다.esc
다음을 사용하여 종료하십시오.:wq
이것이 도움이 되었기를 바랍니다.
https://github.com/ersiner/osx-env-sync 시도해 볼 수 있습니다 . 단일 소스 에서 명령 행 및 GUI 앱 을 모두 처리 하고 최신 버전의 OS X에서 작동합니다. (Yosemite) .
당신이 쓰는 것은 처음에는 bash에 의해 소스되는 정규 bash 스크립트이기 때문에 경로 대체와 다른 쉘 트릭을 사용할 수 있습니다. 제한이 없습니다. ( osx-env-sync 문서를 확인하면 어떻게 달성되는지 이해할 수 있습니다.)
나는 비슷한 질문에 대답 여기에 좀 더 찾아 볼 수있는 곳.
~ / .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