Mac OS X中的环境variables
更新:下面的链接没有完整的答案 。 不得不在两个地方设置path或variables(一个用于GUI,一个用于shell)是跛脚的。
不重复 : 在OS X中设置环境variables?
来自Windows背景,很容易设置和修改环境variables(只要进入系统属性>高级>环境variables),在Mac OS 10.5上似乎并不那么简单。 大多数参考文献说我应该更新/ etc / profile或〜/ .profile。 这些相当于系统variables和用户variables吗? 例如,我应该在哪里设置我的JAVA_HOME
variables?
编辑:
我希望能够从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调用。 使用这个别名和其他东西,需要重新定义在subshell,而不是为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启动的所有程序。 您可以随时使用launchctl
的setenv
命令来应用更改。 从理论上说 ,你应该能够把setenv
命令放在~/.launchd.conf
,而launchd
会在用户login时自动读取它们,但实际上对这个文件的支持从来没有实现过。 相反,您可以使用其他机制在login时执行脚本,并让该脚本调用launchctl
来设置launchd
环境。 -
/etc/launchd.conf
:在系统启动时以及用户login时,由launchd读取。它们影响系统上的每个进程,因为launchd是根进程。 要将更改应用到正在运行的root启动程序,您可以将命令sudo launchctl
到sudo 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 < ~/.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。
你可以在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写权限。