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


18

如何在Mac OS X中设置环境变量,以使它们可用于GUI应用程序而不使用〜/ .MacOSX / environment.plistLogin Hooks(因为已弃用)?


@ ersin-er StackOverflow的答案“来自单一来源的命令行和GUI应用程序的解决方案(与Yosemite&El Capitan一起使用)”可能会引起人们对这个问题的兴趣。
l --marc l

Answers:


16

在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条目以适合您的特定路径需求。


1
谢谢!这对我来说是完美的。在10.11(El Capitan)上,我确实还必须运行Matthew提供的命令才能看到我的更改Info.plist生效。
dsedivec

8

该解决方案使用的功能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应用程序(例如texstudioTeXShop)可以看到我自己的tex树。有待改进的地方:

  1. shell脚本中有一个#filename="$1"。这不是偶然的,因为文件名应该由启动代理作为参数提供给脚本,但这是行不通的。

  2. 如前所述这里(德国和付费墙!),就可以把脚本中展开剂itsself。

  3. 我不确定此解决方案的安全性,因为它eval与用户提供的字符串一起使用。

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

应该提到的是,Apple打算通过在〜/ launchd.conf中放入内容来实现某种类似的方法,但是该日期和OS目前不受支持(请参阅参考资料launchd.conf)。我猜像globbing之类的东西无法像该提案中那样起作用。当然,除了启动代理必须位于/ Library / LaunchAgents /〜/ Library / LaunchAgents /中之外,当然也可以将这些文件放在其他位置。

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

更新:当前在版本10.8中不起作用。在此处此处介绍针对每个应用程序的解决方法。


顺便说一句,如果要在终端环境中定义PATH-Variable并使用此启动代理,我建议export PATH=.:"$(launchctl getenv PATH)"在〜/ .bash_profile中写(对于其他shell也是一样)。这是可能的,因为path_helper在shell脚本中被调用了。有关OS X中PATH变量的更多详细信息,请查看此答案
Percival Ulysses 2012年

3

@flori提供的答案适用于我在Maverick上的情况,前提是我在更改plist文件后在终端中运行以下命令

/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user 

killall Finder

我和El Capitan的行为相同,并且已经在@flori的答案中添加了您的观点
Seki

2

@ 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 。


0

另一个选择是使用/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适用于根启动过程和按用户启动的过程。用和表示用setenvin 设置的环境变量。/etc/launchd.confsudo launchctl exportlaunchctl export

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.