![在 OS X 中为 GUI 应用程序设置环境变量](https://linux22.com/image/1330068/%E5%9C%A8%20OS%20X%20%E4%B8%AD%E4%B8%BA%20GUI%20%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E8%AE%BE%E7%BD%AE%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F.png)
如何在 Mac OS X 中设置环境变量,以便它们可用于 GUI 应用程序,而无需使用~/.MacOSX/环境.plist或者登录钩子(因为这些是已弃用)?
答案1
在 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:当然您必须根据您的具体路径需求调整路径条目。
答案2
该解决方案利用了 的功能launchctl
,并结合了启动代理模仿旧的登录钩子。有关使用 存储的其他解决方案launchd
,请参阅这个比较。此处使用的启动代理位于/图书馆/ 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>
一件重要的事情是负载运行键,以便尽快执行启动代理。真正的工作是在 shell 脚本中完成的/用户/共享/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
注意获取的调用小路设置正确。最后,〜/.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
命令,请参阅其手册页以获取更多信息。对我来说很好用(我应该提到我仍然是 Snow Leopard 的粉丝),GUI 应用程序如泰克工作室和TeXShop可以看到我自己的 tex 树。可以改进的地方:
shell 脚本
#filename="$1"
中有一个。这并非偶然,因为文件名应该由启动代理作为参数提供给脚本,但这样做不起作用。如上所述这里(德语,需要付费!),可以将脚本放入启动代理本身。
我不确定这个解决方案有多安全,因为它使用
eval
用户提供的字符串。我记得使用此方法的 MANPATH 定义效果不佳,但我不确定。
值得一提的是,苹果也打算采取类似的方法,将一些东西放入∼/launchd.conf,但目前不支持此日期和操作系统(请参阅 的手册页launchd.conf
)。我猜像通配符这样的功能不会像本提案中那样工作。当然,你可以将这些文件放在其他任何地方,除了必须位于的启动代理之外/图书馆/ LaunchAgents /或者〜/图书馆/ LaunchAgents /。
答案3
@flori 提供的答案对我在 Maverick 上有用,前提是我在更改 plist 文件后在终端中运行以下命令
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user
killall Finder
答案4
另一个选项是使用/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
中设置的环境变量由和/etc/launchd.conf
共同显示。sudo launchctl export
launchctl export