通过launchd.conf设置环境variables不再适用于OS X Yosemite / El Capitan / macOS Sierra?
它看起来像launchd.conf
不会加载我的环境variables了。 有其他人注意到了吗?
是否有另一个永久设置环境variables的解决scheme?
在~/Library/LaunchAgents/
创build一个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>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>
您可以在<string></string>
块中添加许多launchctl
命令。
系统重新启动后, plist
将会激活。 您也可以使用launchctl load ~/Library/LaunchAgents/environment.plist
立即启动它。
[编辑]
El Capitan也有同样的解决scheme。
Xcode 7.0+不默认评估环境variables。 旧的行为可以使用这个命令启用:
defaults write com.apple.dt.Xcode UseSanitizedBuildSystemEnvironment -bool NO
[编辑]
有几种情况下这不起作用。 如果重新启动计算机并select“重新打开Windows时重新login”重新打开的窗口可能看不到variables(也许它们在代理运行之前打开)。 另外,如果你通过sshlogin,variables将不会被设置(所以你需要在〜/ .bash_profile中设置它们)。 最后,这似乎不适用于El Capitan和Sierra的PATH。 这需要通过“launchctl config user path …”和/ etc /path来设置。
[ 原始答案 ]:您仍然可以使用launchctl setenv variablename value
设置一个variables,以便所有应用程序(通过Dock或Spotlight启动的graphics应用程序,以及通过terminal启动的应用程序) 都可以获取该variables。
显然你不想每次login时都这样做。
[ 编辑 ]:为了避免这种情况,启动AppleScript Editor
,input如下命令:
do shell script "launchctl setenv variablename value"
(如果要设置多个variables,请使用多行)
现在将( ⌘
+ s
)保存为文件格式:Application 。 最后打开System Settings
→ 用户和组 → login项目并添加新的应用程序。
[ 原始回答 ]:为了解决这个问题,你需要在一个简短的shell脚本中定义所有的variables,然后查看一下这个关于如何在MacOSlogin中运行脚本的答案 。 这样脚本将在用户login时被调用。
[ 编辑 ]:这两个解决scheme都不是完美的,因为只能为特定的用户设置variables,但我希望/猜测可能是你所需要的。
如果您拥有多个用户,则可以手动为每个用户设置一个login项目 ,或者将com.user.loginscript.plist的副本放在每个本地Library / LaunchAgents目录中,指向同一个shell脚本。
当然,这些解决方法都不如/etc/launchd.conf 。
[ 进一步编辑 ]:下面的用户提到这不适合他。 不过,我已经在多个优胜美地机器上进行了testing,它确实为我工作。 如果您遇到问题,请记住,您需要重新启动应用程序才能使其生效。 此外,如果通过〜/ .profile或〜/ .bash_profile在terminal中设置variables,它们将覆盖从shell启动的应用程序通过launchctl setenv设置的内容 。
可以使用3个文件+2个命令在Mac OS X 10.10 Yosemite上设置环境variables。
带有环境variables定义的主文件:
$ 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"
为用户应用程序(terminal,IDE,…)加载环境variables的服务定义:
$ 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
我们得到:
- / etc / environment中唯一声明系统环境variables的地方
- 修改/ etc / environment文件后立即自动更新环境variables – 只需重新启动应用程序即可
问题/问题:
为了让你的envvariables在系统重启后被应用程序正确的使用,你需要:
- 要么login两次:login=>注销=>login
- 或手动closures和重新打开应用程序,其中应该采取envvariables
- 或者不要使用“重新打开窗口时重新打开”function。
发生这种情况是由于Apple拒绝加载服务的明确sorting,所以envvariables与“重新打开队列”的处理并行注册。
但实际上,我每年只重启我的系统几次(大更新),所以这不是什么大问题。
引自
Apple Developer Relations 10-Oct-2014 09:12 PM
经过深思熟虑后,工程部门已经取消了这个function。 出于安全原因,文件
/etc/launchd.conf
被故意删除。 作为一种解决方法,您可以在启动过程中尽早以root身份运行launchctl limit
,也许可以从LaunchDaemon
启动。 (……)
解:
通过bash脚本将代码放入
/Library/LaunchDaemons/com.apple.launchd.limit.plist
:
#!/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
以下是恢复旧行为的命令:
# 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
现在你可以在/etc/launchd.conf
指定像setenv JAVA_HOME /Library/Java/Home
的/etc/launchd.conf
。
检查了El Capitan。
什么为我工作(从aax的启发谢谢):
粘贴到/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>
如果你需要它一步一步:
- 启动terminal
- 键入sudo su,然后input密码以root身份login
- 键入vi /Library/LaunchDaemons/com.apple.launchd.limit.plist
- 进入vi编辑器时,按键i进入插入模式,然后粘贴上面的确切代码内容(
⌘+v
)。 这将强制限制每个进程16384个文件和16384个文件总数 - 保存你的文件然后用
esc
退出:wq
- 重新启动系统,并使用命令launchctl限制检查它是否正在工作
我希望这对你有帮助。
您可以尝试https://github.com/ersiner/osx-env-sync 。 它可以从单一来源处理命令行和GUI应用程序 ,并与最新版本的OS X (Yosemite)一起工作。
你可以使用pathreplace和其他shell技巧,因为你写的东西是常规的bash脚本,首先是由bash提供的。 没有限制..(检查osx-env-sync文档,你会明白它是如何实现这一点的。)
我在这里回答了一个类似的问题,你会发现更多。
解决的办法是把你的variables添加到/etc/profile
。 然后一切按预期工作! 当然,你必须以sudo nano / etc / profile的身份作为root用户。 如果使用其他方式进行编辑,即使将权限更改为root,系统也会使用损坏的/ etc / profile进行投诉。
我以下面的方式在〜/ .bash_profile中添加了variables。 完成重启/注销并login后
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
注意:如果不重新启动/注销并login,您可以使用这些更改;
source ~/.bash_profile