在 OS X 中为 GUI 应用程序设置环境变量

在 OS X 中为 GUI 应用程序设置环境变量

如何在 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 树。可以改进的地方:

  1. shell 脚本#filename="$1"中有一个。这并非偶然,因为文件名应该由启动代理作为参数提供给脚本,但这样做不起作用。

  2. 如上所述这里(德语,需要付费!),​​可以将脚本放入启动代理本身。

  3. 我不确定这个解决方案有多安全,因为它使用eval用户提供的字符串。

  4. 我记得使用此方法的 MANPATH 定义效果不佳,但我不确定。

值得一提的是,苹果也打算采取类似的方法,将一些东西放入∼/launchd.conf,但目前不支持此日期和操作系统(请参阅 的手册页launchd.conf)。我猜像通配符这样的功能不会像本提案中那样工作。当然,你可以将这些文件放在其他任何地方,除了必须位于的启动代理之外/图书馆/ LaunchAgents /或者〜/图书馆/ LaunchAgents /

最后,我应该提到我使用的有关启动代理的信息来源: 1234

更新:目前此功能在 10.8 版本中不起作用。每个应用程序的解决方法如下所述这里这里

答案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 exportlaunchctl export

相关内容