如何在Mac OS X中设置环境变量,以使它们可用于GUI应用程序而不使用〜/ .MacOSX / environment.plist或Login Hooks(因为已弃用)?
如何在Mac OS X中设置环境变量,以使它们可用于GUI应用程序而不使用〜/ .MacOSX / environment.plist或Login Hooks(因为已弃用)?
Answers:
在Mountain Lion上,所有/etc/paths
和/etc/launchd.conf
编辑都不会生效!
苹果的开发者论坛说:
“更改.app本身的Info.plist,使其包含具有所需环境变量的“ LSEnvironment”字典。
〜/ .MacOSX / environment.plist不再受支持。”
因此,我直接编辑了该应用程序Info.plist
(右键单击“ AppName.app”(在本例中为SourceTree),然后单击“ Show package contents
”)
并添加了一个新的键/字典对:
<key>LSEnvironment</key>
<dict>
<key>PATH</key>
<string>/Users/flori/.rvm/gems/ruby-1.9.3-p362/bin:/Users/flori/.rvm/gems/ruby-1.9.3-p362@global/bin:/Users/flori/.rvm/rubies/ruby-1.9.3-p326/bin:/Users/flori/.rvm/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:</string>
</dict>
(请参阅:Apple的LaunchServicesKeys文档)
现在,应用程序(在我的情况下为SourceTree)使用给定的路径并与git 1.9.3一起使用:-)
PS:当然,您必须调整Path条目以适合您的特定路径需求。
Info.plist
生效。
该解决方案使用的功能launchctl
与启动代理相结合,以模仿旧的登录钩。有关使用存储的其他解决方案launchd
,请参见此比较。此处使用的启动代理位于/ 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>user.conf.launchd</string>
<key>Program</key>
<string>/Users/Shared/conflaunchd.sh</string>
<key>ProgramArguments</key>
<array>
<string>~/.conf.launchd</string>
</array>
<key>EnableGlobbing</key>
<true/>
<key>RunAtLoad</key>
<true/>
<key>LimitLoadToSessionType</key>
<array>
<string>Aqua</string>
<string>StandardIO</string>
</array>
</dict>
</plist>
重要的一件事是RunAtLoad键,以便启动代理尽可能早地执行。真正的工作在外壳程序脚本/Users/Shared/conflaunchd.sh中完成,该脚本读取〜/ .conf.launchd并将其提供给launchctl
:
#! /bin/bash
#filename="$1"
filename="$HOME/.conf.launchd"
if [ ! -r "$filename" ]; then
exit
fi
eval $(/usr/libexec/path_helper -s)
while read line; do
# skip lines that only contain whitespace or a comment
if [ ! -n "$line" -o `expr "$line" : '#'` -gt 0 ]; then continue; fi
eval launchctl $line
done <"$filename"
exit 0
请注意调用,path_helper
以正确设置PATH。最后,〜/ .conf.launchd看起来像这样
setenv PATH ~/Applications:"${PATH}"
setenv TEXINPUTS .:~/Documents/texmf//:
setenv BIBINPUTS .:~/Documents/texmf/bibtex//:
setenv BSTINPUTS .:~/Documents/texmf/bibtex//:
# Locale
setenv LANG en_US.UTF-8
这些是launchctl
命令,有关更多信息,请参见其手册。对我来说很好(我应该还是个雪豹人),GUI应用程序(例如texstudio和TeXShop)可以看到我自己的tex树。有待改进的地方:
shell脚本中有一个#filename="$1"
。这不是偶然的,因为文件名应该由启动代理作为参数提供给脚本,但这是行不通的。
如前所述这里(德国和付费墙!),就可以把脚本中展开剂itsself。
我不确定此解决方案的安全性,因为它eval
与用户提供的字符串一起使用。
我想记得使用此方法定义MANPATH的效果不好,但是我不确定。
应该提到的是,Apple打算通过在〜/ launchd.conf中放入内容来实现某种类似的方法,但是该日期和OS目前不受支持(请参阅参考资料launchd.conf
)。我猜像globbing之类的东西无法像该提案中那样起作用。当然,除了启动代理必须位于/ Library / LaunchAgents /或〜/ Library / LaunchAgents /中之外,当然也可以将这些文件放在其他位置。
export PATH=.:"$(launchctl getenv PATH)"
在〜/ .bash_profile中写(对于其他shell也是一样)。这是可能的,因为path_helper
在shell脚本中被调用了。有关OS X中PATH变量的更多详细信息,请查看此答案。
@ percival-ulysses提供的答案对我来说适用于10.9 Mavericks,但有以下小的更改:在之前编辑/Users/Shared/conflaunchd.sh脚本exit 0
并添加以下行
killall Dock
killall SystemUIServer
重新启动Dock和菜单栏。此后,从Dock或Spotlight启动的应用程序将继承正确的PATH。如果使用Finder启动对PATH至关重要的应用程序,则killall Finder
可能还会添加。
在.bash_profile
我用线
export PATH=`launchctl getenv PATH`
设置终端的PATH,这样可以从同一位置〜/ .conf.launchd文件控制PATH 。
另一个选择是使用/etc/launchd.conf
。例如,我PATH
通过将以下行添加到来更改了默认设置/etc/launchd.conf
:
setenv PATH ~/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/libexec:/usr/texbin
您可以/etc/launchd.conf
通过重新启动或运行launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.conf
并终止和重新启动进程来应用更改。
中的设置/etc/launchd.conf
适用于根启动过程和按用户启动的过程。用和表示用setenv
in 设置的环境变量。/etc/launchd.conf
sudo launchctl export
launchctl export