如何在OS X上设置全局PATH环境变量?


101

我想在OS X上附加全局PATH环境变量,以便所有用户外壳程序和GUI应用程序都获得相同的PATH环境。

我知道我可以在Shell启动脚本中附加路径,但是GUI应用程序不会继承那些设置。

到目前为止,我发现的唯一方法是在/etc/launchd.conf中重新定义PATH环境变量:

setenv PATH /usr/bin:/bin:/usr/sbin:/sbin:/my/path

我想不出一种方法来实际附加到中的PATH launchd.conf

我对此方法有些担心,但是到目前为止,这是唯一可行的方法。有没有更好的办法?



2
对于优山美地,后来,看到stackoverflow.com/questions/25385934/...
thSoft

这里没有任何答案可以解决OP的问题。但是thSoft在这里的评论对金钱是正确的!:也许这应该被合并或链接到引用的问题stackoverflow.com/questions/25385934/...
凯文·布克斯

Answers:


71

palmer的GUI信息是正确的,但是有一种更易于维护的方法来修改外壳程序看到的路径。就像mediaslave所说的那样,您可以进行编辑/etc/paths,但更好的是,您可以将/etc/paths.d/其中包含路径的文本文件拖放到其中,并且所有shell都将正确构造该路径。

例如,在我的系统上:

$ cat /etc/paths
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin
$ ls /etc/paths.d
X11       git      postgres
$ cat /etc/paths.d/postgres
/Library/PostgreSQL/8.4/bin
$ echo $PATH
/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/Library/PostgreSQL/8.4/bin:/usr/X11/bin:/usr/local/mysql/bin

1
很好,谢谢!注意:这要求您先注销然后重新登录,然后再运行。
weronika

@weronika:我发现退出并重新启动就足够了X11(比完全注销要痛苦得多)。我没有尝试过Terminal
Peter Gluck

我指的是终端-您是对的,我忘记指定了。
weronika

8
很高兴知道这一点,但是它不能回答OP的问题,因为该机制不适用于GUI应用程序。OP正在寻找一个统一的解决方案,允许他附加到默认值$PATH
mklement

@cogg,这里的“我的系统”是什么意思?我们不是都在这里使用OS X吗?抱歉,我对OS X还是
陌生的

48

/etc/launchd.conf

launchd.conf文件是**唯一适用于OS X v10.8(Mountain Lion)和v10.9(Mavericks)上的命令行和GUI应用程序的完整解决方案,该解决方案适用于所有用户的GUI和控制台应用程序。

sudo touch /etc/launchd.conf
sudo nano /etc/launchd.conf

setenv PATH /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

在上面的示例中,我添加/usr/local/bin了PATH的默认环境值。

请记住,此文件不是脚本,并且您没有使用替代项的选项。另外,要应用这些功能,您需要重新启动。

请记住,所有其他仅是部分解决方案:

  • environment.plist 不适用于通过Spotlight启动的应用程序。
  • /etc/paths -仅用于控制台
  • /etc/csh.cshrc/etc/bashrc-仅适用于某些贝壳

此答案基于在Mac OS X上设置环境变量中的相同问题。


7
很好的发现,但是这个问题已经讨论了启动,并且正在询问如何附加到其中的路径。
cregox 2011年

21
您是否真的在原始问题上添加了注释,称自己为“真正的答案”?
TJ Luoma

7
您的-有用-答案暗示了这一点,但仅说明了这一点:不支持OP 附加到默认路径的愿望,因为您无法在中引用其他环境变量/etc/launchd.conf
mklement

它不是全局的-当/ etc / profile调用path_helper并从/ etc / paths和/etc/paths.d/重建PATH时,命令行环境将放弃此设置
Dave X

1
根据apple.stackexchange.com/questions/106355/…的说法,这不再适用于优胜美地或更高版本
ericn

7

您将必须逐个外壳地进行设置;Bash和类似csh的外壳程序不共享相同的配置文件和用于调整PATH的语法。

尝试执行此操作launchctl将不起作用,因为环境变量是在登录时设置的。在shell会话之外,它们在Unix中不存在于系统范围内。

所以你要添加

setenv PATH "$PATH:/add/my/extra/path"

/etc/csh.cshrc

export PATH="$PATH:/more/paths:/

/etc/bashrc

如果要在GUI应用程序中使用环境变量,那就更复杂了。您必须.MacOSX/environment.plist在每个用户的主目录中创建一个文件。该.MacOSX目录可能默认情况下不存在,因此您必须创建它。

文件格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>

    <key>PRINTER</key>
    <string>myprinter</string>

    <key>PATH</key>
    <string>/path/to/thing/I/need</string>

    <key>DISPLAY</key>
    <string>0:1</string>

</dict>
</plist>

有关更多信息,请environment.plist 访问Apple网站


但是,当在/etc/launchd.conf中设置时,这些设置才会生效。
Xerxes

真?您在那里设置了什么环境变量?
帕默

1
只是OS X 10.8的一个更新:该~/.MacOSX/environment.plist方法不再受支持,并且在用户级别没有替代品。您可以在系统范围内使用/etc/launchd.conf(并且有一个基于* .app的解决方案)。
mklement

不回答OP的问题。
Kevin Buchs

3

您可以通过在上添加行/etc/paths,每行一条路径来编辑全局路径。

sudo nano /etc/paths 应该带你到那里。


2
知道这很高兴,但是它不能回答OP的问题,因为该机制不适用于GUI应用程序。
mklement


1

我不确定是否有人涵盖了最简单,最优雅的方式。至少在Mac OS X v10.6(Snow Leopard)上。

与搞乱[/etc/|~/.][profile|bashrc]文件可以正常工作,但它是一个黑客颇有几分。该/etc/paths.d/目录是要走的路:

  • 将Sudo变成您最喜欢的编辑器。
  • *name*/etc/paths.d/每行路径中创建一个名为(只是不要给它命名的文件)的新文件:

    /usr/X11/bin
    /Developer/usr/bin
    
  • 然后加

    eval '/usr/libexec/path_helper -s`
    

    profilebashrc,您应该会很好。


1
知道这很高兴,但是它不能回答OP的问题,因为该机制不适用于GUI应用程序。
mklement

文件名是字面上的*name*吗?还是你的意思是name
彼得·莫滕森

0

我不确定launchd是否接受此方法,但是请尝试:

setenv PATH“ $ PATH:/ my / path”

1
不幸的是,这不起作用。看起来launchctl不能轻松访问环境变量。有一个获取环境变量的命令,但是绝对没有关于如何使用它的文档。
lajos

0

我不确定为什么要使用/etc/launchd.conf它而不是/etc/profile-但我不是Mac OS X的专家-我相信您可以肯定它可以工作,但是launchdMac OS X的实现/替换是init-Mac OS X使我感到困惑。

无论如何,它setenv PATH "$PATH:/more/paths:/and/more/paths"都可以工作(tcsh),而bourn shell等效项是export PATH="$PATH:/more/paths:/and/more/paths"-我也不知道如何launchd与特定的shell相关。

我想我问了更多问题,然后我回答了=)


4
/ etc / profile路径设置在任何OS X GUI应用程序中均看不到。这仅适用于bash。我希望所有应用程序都获得新的路径设置。
lajos

1
Unix?当然,这是unix。我的意思是 是的,我们破坏了已经使用了30年的东西,但它仍然是unix!/叹气
马特·西蒙斯
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.