Answers:
创建具有以下内容的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用户路径...”和/ etc / paths进行设置。
UseSanitizedBuildSystemEnvironment
)中仅显示9次。
[ 原始答案 ]:您仍然可以使用launchctl setenv variablename value
设置一个变量,以便所有应用程序(通过终端或通过Dock或Spotlight启动的图形应用程序)都可以使用该变量。
显然,您每次登录都不希望这样做。
[ 编辑 ]:为避免这种情况,请启动AppleScript Editor
,输入如下命令:
do shell script "launchctl setenv variablename value"
(如果要设置多个变量,请使用多行)
现在将(⌘
+ s
)另存为文件格式:Application。最后打开System Settings
→ 用户和组 → 登录项,然后添加新的应用程序。
[ 原始答案 ]:要变通解决此问题,请将所有希望定义的变量放在一个简短的Shell脚本中,然后查看有关如何在MacOS登录上运行脚本的先前答案。这样,当用户登录时将调用脚本。
[ 编辑 ]:两种解决方案都不完美,因为只能为该特定用户设置变量,但我希望/猜测这可能是您所需要的。
如果确实有多个用户,则可以为每个用户手动设置一个登录项,或者将com.user.loginscript.plist的副本放置在其每个本地Library / LaunchAgents目录中,指向同一外壳脚本。
当然,这些解决方法都不如/etc/launchd.conf方便。
[ 进一步编辑 ]:下面的用户提到这对他不起作用。但是,我已经在多台Yosemite机器上进行了测试,它确实对我有用。如果遇到问题,请记住,您需要重新启动应用程序才能使此操作生效。另外,如果您通过〜/ .profile或〜/ .bash_profile在终端中设置变量,则它们将覆盖通过launchctl setenv为从Shell启动的应用程序设置的内容。
可以使用3个文件+ 2个命令在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拒绝加载服务的显式排序而导致的,因此env变量与“重新打开队列”的处理并行注册。
但是实际上,我每年仅重新启动系统几次(进行重大更新),所以这没什么大不了的。
launchd
,但是在启动时(即登录之前)无法加载这些守护进程吗?那应该避开您提到的所有问题。
引自
Apple Developer Relations
10-Oct-2014 09:12 PM
经过深思熟虑,工程技术已删除此功能。
/etc/launchd.conf
出于安全原因有意删除了该文件。解决方法是,您可以launchctl limit
在引导过程中尽早以root身份运行,也许可以从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上检查。
对我有用的是什么(受到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
希望对您有所帮助。
您可以尝试https://github.com/ersiner/osx-env-sync。它可以从单一来源处理命令行和GUI应用程序,并且可以与最新版本的OS X(Yosemite)一起使用。
您可以使用路径替换和其他Shell技巧,因为您编写的是常规的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