launchd.conf
不再加载我的环境变量。还有其他人注意到这个问题吗?是否有另一种解决方案可以永久设置环境变量?
launchd.conf
不再加载我的环境变量。还有其他人注意到这个问题吗?~/Library/LaunchAgents/
中创建一个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上也适用。
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来设置它。
sudo launchctl config user path $PATH
可用于 Mojave。 - Ivan Romanovlaunchctl setenv variablename value
设置变量,以便所有应用程序都可以使用(通过Dock或Spotlight启动的图形应用程序,以及通过终端启动的应用程序)。
显然,您不希望每次登录时都这样做。
[编辑]: 为了避免这种情况,请启动AppleScript Editor
,输入以下命令:
do shell script "launchctl setenv variablename value"
(如果您想设置多个变量,请使用多行)
现在保存 (⌘
+s
) 为 文件格式:应用程序。最后打开 系统偏好设置
→ 用户与群组 → 登录项 并添加你的新应用程序。
[原始回答]: 为解决这个问题,将您希望定义的所有变量放入一个短shell脚本中,然后查看此有关如何在MacOS登录时运行脚本的先前回答。这样,当用户登录时,脚本将被调用。
[编辑]: 两种解决方案都不完美,因为变量只会针对该特定用户进行设置,但我希望/猜测这可能是您需要的全部。
如果您有多个用户,您可以手动为每个用户设置一个登录项,或者将com.user.loginscript.plist的副本放置在他们各自的本地Library/LaunchAgents目录中,指向同一个shell脚本。
无可否认,这些解决方法都不像/etc/launchd.conf那样方便。
[进一步编辑]: 下面的用户提到这对他没有起作用。然而,我已经在多台Yosemite机器上进行了测试,并且它对我有用。如果您遇到问题,请记住您需要重新启动应用程序才能使其生效。此外,如果您通过~/.profile或~/.bash_profile在终端中设置变量,则它们将覆盖通过launchctl setenv为从shell启动的应用程序设置的内容。
使用三个文件和两个命令可以在 Mac OS X 10.10 Yosemite 上设置环境变量。
包含环境变量定义的主文件:
$ 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
我们获得了什么:
问题 / 问题:
为了让您的环境变量在系统重启后被应用程序正确获取,您需要:
这是因为Apple拒绝明确加载服务的顺序,因此环境变量与“重新打开队列”的处理同时注册。
但实际上,我每年只重启几次系统(对于大型更新),所以这不是什么大问题。
引用自
Apple开发者关系
2014年10月10日 下午9:12
经过深思熟虑,工程师已删除此功能。 文件
/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
/Library/LaunchDaemons
中,而不是告诉 launchctl
运行 limit
命令,告诉它运行带有 PATH
和路径字符串作为参数的 setenv
命令。launchd
应该会在启动时自动捕获它,并几乎立即进行自我修改。 - Laird Nelson<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
。 - UloPe# 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
。
已在El Capitan上检查过。
setenv
命令只适用于调用者的上下文,所以这对于 LaunchAgents 可以起作用,而对于 LaunchDaemons 需要一个单独的文件。 - SpinUp __ A Davis以下是对我有效的方法(受 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>
⌘+v
)。这将强制限制每个进程的文件数为16384个,总文件数为16384个esc
和:wq
退出希望这对您有所帮助。
/etc/profile
中。然后一切都会按预期工作!当然,您必须以root用户身份使用sudo nano /etc/profile进行操作。如果您以其他方式编辑它,则系统会抱怨/etc/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