当前位置:  开发笔记 > 编程语言 > 正文

Mac OS X中的环境变量

如何解决《MacOSX中的环境变量》经验,为你挑选了5个好方法。

更新:以下链接没有完整的答案.必须在两个地方设置路径或变量(一个用于GUI,一个用于shell)是蹩脚的.

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


来自Windows背景,可以很容易地设置和修改环境变量(只需转到系统属性>高级>环境变量),在Mac OS 10.5上似乎没那么直接.大多数参考文献都说我应该更新/ etc/profile或〜/ .profile.那些是系统变量和用户变量的等价物吗?例如,我应该在哪里设置我的JAVA_HOME变量?


编辑:

我希望能够从终端以及像Eclipse这样的应用程序访问该变量.此外,我希望我不必重新启动/注销以使此生效.



1> LaC..:

您可以在几个地方设置环境变量.

~/.profile:将此用于要在终端启动的所有程序中设置的变量(请注意,与Linux不同,在Terminal.app中打开的所有shell都是登录shell).

~/.bashrc:对于非登录shell的shell调用此方法.将此用于需要在子shell中重新定义的别名和其他内容,而不是用于继承的环境变量.

/etc/profile:这是在〜/ .profile之前加载的,但在其他方面是等效的.当您希望变量应用于计算机上所有用户启动的终端程序时(假设它们使用bash),请使用它.

~/.MacOSX/environment.plist:这是登录时loginwindow读取的.它适用于所有应用程序,包括GUI应用程序,但Spotlight在10.5(而不是10.6)中发布的应用程序除外.它要求您注销并再次登录才能使更改生效.自OS X 10.8起不再支持此文件.

您的用户launchd实例:这适用于用户,GUI和CLI启动的所有程序.您可以随时使用setenv命令应用更改launchctl.从理论上讲,您应该能够输入setenv命令~/.launchd.conf,并launchd在用户登录时自动读取命令,但实际上从未实现过对此文件的支持.相反,您可以使用其他机制在登录时执行脚本,并通过该脚本调用launchctl来设置launchd环境.

/etc/launchd.conf:当系统启动时和用户登录时,它由launchd读取.它们影响系统上的每个进程,因为launchd是根进程.要将更改应用于正在运行的运行根,您可以将命令通过管道传输sudo launchctl.

要理解的基本要素是:

环境变量在进程分叉时由进程的子进程继承.

根进程是一个launchd实例,每个用户会话还有一个单独的launchd实例.

launchd允许您使用launchctl; 更改其当前环境变量; 然后,更新的变量将从之后分叉的所有新进程继承.

使用launchd设置环境变量的示例:

echo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE | launchctl

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

要解决不起作用的事实,~/.launchd.conf可以将以下脚本放入~/Library/LaunchAgents/local.launchd.conf.plist:





  Label
  local.launchd.conf
  ProgramArguments
  
    sh
    -c
    launchctl < ~/.launchd.conf    
  
  RunAtLoad
  


然后你可以放入setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE内部~/.launchd.conf,它将在每次登录时执行.

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

另请注意,在登录时运行的其他程序可能会在启动之前执行,因此可能无法看到它设置的环境变量.


不能让`〜/ .launchd.conf`在10.6.8上工作 - 它似乎没有任何效果.另外,man页面说该文件目前不受支持.
〜/ .launchd.conf似乎也不适用于10.7.3,当我查看手册页时它说$ HOME/.launchd.conf你的launchd配置文件**(目前不支持)**
在10.8(Mountain Lion)中,不再支持〜/ .MacOSX/environment.plist.根据Apple Dev的说法,必须"改变.app本身的Info.plist以包含一个带有你想要的环境变量的"LSEnvironment"字典." 有关详细信息,请参阅http://apple.stackexchange.com/questions/57385/where-are-system-environment-variables-set-in-mountain-lion
实际上,对于`〜/ .MacOSX/environment.plist`,在我的Lion上**被*读取并使用.刚试过它.我实际上更喜欢它.launchd.conf因为我使用[RCenvironment](http://www.rubicode.com/Software/RCEnvironment/)首选项窗格来维护它.
@LaC伟大,全面的帖子; 请你更新它注意到`〜/ .launchd.conf`仍然不受支持,从OS X 10.8.3开始不起作用?参见`man launchd.conf`

2> Matt Curtis..:

没有必要重复.您可以使用launchd(和子进程,即从Spotlight开始的任何内容)设置环境变量launchctl setenv.

例如,如果要在启动后在.bashrc或在以下任何位置设置镜像当前路径:

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

在运行的应用程序中不会自动更新环境变量.您需要重新启动应用程序以获取更新的环境变量(尽管您可以在shell中设置变量,例如PATH=whatever:you:want;不需要重新启动终端).


这似乎不是全局的:以这种方式设置的环境变量对于用户来说是本地的.我们仍然没有用于设置环境变量的_global_机制.
@Andrew OK,root有自己的launchd - "ps aux | grep launchd`将显示此信息.还要检查`man sudo`,哪个文件'sudo`(默认情况下)故意重置环境 - 如果你'sudo -E`它将保留环境(包括你用`launchctl setenv`设置的变量).顺便问一下,你有这个实际应用吗?如果是这样,这种方法对你有用吗?

3> Tom Teman..:

我认为OP正在寻找的是一个简单的,类似Windows的解决方案.

你走了:

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


顺便说一下,自从我发布以来,原来的链接似乎已经破裂了(Apple的问题是什么?301是昂贵的?).您可以使用此链接:http://www.macupdate.com/app/mac/14617/rcenvironment

4> S.Lott..:

你可以在linux上阅读,这与Mac OS X非常接近.或者你可以阅读更接近的BSD Unix.在大多数情况下,Linux和BSD之间的差异并不大.

/etc/profile 是系统环境变量.

~/.profile 是特定于用户的环境变量.

"我应该在哪里设置我的JAVA_HOME变量?"

你有多个用户吗?他们在乎吗?你会改变一个其他用户/etc/profile吗?

一般来说,即使我是唯一的用户,我也不想搞乱系统范围的设置.我更喜欢编辑我的本地设置.



5> JW...:

对于GUI应用程序,您必须创建和编辑~/.MacOSX/environment.plist.更多细节在这里.您需要注销才能使这些生效.我不确定它们是否也影响从终端发起的应用程序,但我认为它们会.

对于从终端启动的应用程序,您还可以编辑〜/ .profile文件.


是的,终端将继承变量,从终端启动的任何东西也是如此.您可以使用[RCenvironment](http://www.rubicode.com/Software/RCEnvironment/)首选项窗格来维护变量.
推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有