Mac OS X中的环境variables

更新:下面的链接没有完整的答案 。 不得不在两个地方设置path或variables(一个用于GUI,一个用于shell)是跛脚的。

不重复 : 在OS X中设置环境variables?


来自Windows背景,很容易设置和修改环境variables(只要进入系统属性>高级>环境variables),在Mac OS 10.5上似乎并不那么简单。 大多数参考文献说我应该更新/ etc / profile或〜/ .profile。 这些相当于系统variables和用户variables吗? 例如,我应该在哪里设置我的JAVA_HOMEvariables?


编辑:

我希望能够从terminal访问variables以及Eclipse等应用程序。 另外,我希望我不必重新启动/注销以使其生效。

没有必要重复。 您可以使用launchctl setenv设置launchd(以及subprocess,即从Spotlight启动的任何内容)使用的环境variables。

例如,如果您想在.bashrc或其他任何地方设置它,在launchd中镜像当前path:

 PATH=whatever:you:want launchctl setenv PATH $PATH 

有几个地方可以设置环境variables。

  • ~/.profile :在terminal启动的所有程序中使用此variables(注意,与Linux不同,在Terminal.app中打开的所有shell都是loginshell)。
  • ~/.bashrc :对于不是loginshell的shell调用。 使用这个别名和其他东西,需要重新定义在subshel​​l,而不是为inheritance的环境variables。
  • /etc/profile :在〜/ .profile之前加载,但在其他方面是等效的。 当你希望variables应用到机器上所有用户启动的terminal程序(假设他们使用bash)时使用它。
  • ~/.MacOSX/environment.plist :这是loginwindow在login时读取的。 它适用于包括GUI在内的所有应用程序,但Spotlight在10.5(不是10.6)中启动的应用程序除外。 它要求您注销并重新login才能使更改生效。 从OS X 10.8开始不再支持该文件。
  • 您的用户launchd实例:这适用于由用户,GUI和CLI启动的所有程序。 您可以随时使用launchctlsetenv命令来应用更改。 从理论上说 ,你应该能够把setenv命令放在~/.launchd.conf ,而launchd会在用户login时自动读取它们,但实际上对这个文件的支持从来没有实现过。 相反,您可以使用其他机制在login时执行脚本,并让该脚本调用launchctl来设置launchd环境。
  • /etc/launchd.conf :在系统启动时以及用户login时,由launchd读取。它们影响系统上的每个进程,因为launchd是根进程。 要将更改应用到正在运行的root启动程序,您可以将命令sudo launchctlsudo launchctl

要理解的基本知识是:

  • 环境variables在分叉时由进程的subprocessinheritance。
  • 根进程是启动的实例,每个用户会话还有一个单独的启动实例。
  • launchd允许您使用launchctl更改当前的环境variables; 那么更新的variables会被它所分叉的所有新进程所inheritance。

使用launchd设置环境variables的示例:

 echo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE | launchctl 

现在,启动使用variables的GUI应用程序,瞧!

要解决~/.launchd.conf不起作用的事实,你可以把下面的脚本放在~/Library/LaunchAgents/local.launchd.conf.plist

 <?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>local.launchd.conf</string> <key>ProgramArguments</key> <array> <string>sh</string> <string>-c</string> <string>launchctl &lt; ~/.launchd.conf</string> </array> <key>RunAtLoad</key> <true/> </dict> </plist> 

然后你可以把setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE放在~/.launchd.conf ,每次login都会执行。

请注意,以这种方式将命令列表传送到launchctl时,将无法使用包含空格的值设置环境variables。 如果您需要这样做,则可以按照以下方式调用launchctl: launchctl setenv MYVARIABLE "QUOTE THE STRING"

另外请注意,在login时运行的其他程序可能在启动之前执行,因此可能看不到它设置的环境variables。

我认为OP正在寻找的是一个简单的,类似于Windows的解决scheme。

这里你去:

https://www.macupdate.com/app/mac/14617/rcenvironment

你可以在Linux上阅读,这与Mac OS X非常接近。 或者你可以阅读一下BSD Unix,这个更接近一点。 大多数情况下,Linux和BSD之间的差别不大。

/etc/profile是系统环境variables。

~/.profile是用户特定的环境variables。

“我应该在哪里设置我的JAVA_HOMEvariables?”

  • 你有多个用户? 他们在乎吗? 你会通过更改/etc/profile混淆其他用户吗?

一般来说,即使我是唯一的用户,我也不希望混淆系统范围的设置。 我更喜欢编辑我的本地设置。

对于GUI应用程序,您必须创build并编辑~/.MacOSX/environment.plist 。 更多细节在这里 。 您将需要注销这些才能生效。 我不确定他们是否也影响从terminal启动的应用程序,但我认为他们会。

对于从terminal启动的应用程序,您也可以编辑〜/ .profile文件。

使用osx-env-sync同步来自单个源的命令行和GUI应用程序的OS X环境variables。

我也在这里发布了一个相关问题的答案。

只需打开~/.profile文件,通过terminal中的nano ,然后键入:

 export PATH=whatever/you/want:$PATH 

保存这个文件(cmd + X和Y)。 之后,请注销/再次login或只是在terminal中打开一个新的标签,并尝试使用您的新variables。

请不要忘记在任何/你想要的地方添加“:$ PATH”,否则你会在PATHvariables中删除所有的path。

如果您想要在El Capitan上永久性地更改环境variables,请将它们设置在/etc/paths注意 ,这个文件是默认只读的,所以你必须chmod写权限。