在OS X上设置环境变量

Pau*_*cks 837 macos bash path environment-variables

在OS X中修改PATH等环境变量的正确方法是什么?

我在Google上看了一下,发现要编辑的三个不同文件:

  • 的/ etc /路径
  • 〜/ .profile文件
  • 〜/ .tcshrc文件

我甚至没有这些文件,我很确定.tcshrc是错误的,因为OS X现在使用bash.这些变量,尤其是PATH,在哪里定义?

我正在运行OS X v10.5(Leopard).

Mat*_*ugh 648

布鲁诺正好走上正轨.我做了大量的研究,如果你想设置所有GUI应用程序中可用的变量,你唯一的选择就是/etc/launchd.conf.

请注意,environment.plist不适用于通过Spotlight启动的应用程序.Steve Sexton在此记录了这一点.

  1. 打开终端提示

  2. 输入sudo vi /etc/launchd.conf(注意:此文件可能尚不存在)

  3. 将以下内容放入文件中

    # Set environment variables here so they are available globally to all apps
    # (and Terminal), including those launched via Spotlight.
    #
    # After editing this file run the following command from the terminal to update
    # environment variables globally without needing to reboot.
    # NOTE: You will still need to restart the relevant application (including
    # Terminal) to pick up the changes!
    # grep -E "^setenv" /etc/launchd.conf | xargs -t -L 1 launchctl
    #
    # See http://www.digitaledgesw.com/node/31
    # and http://stackoverflow.com/questions/135688/setting-environment-variables-in-os-x/
    #
    # Note that you must hardcode the paths below, don't use environment variables.
    # You also need to surround multiple values in quotes, see MAVEN_OPTS example below.
    #
    setenv JAVA_VERSION 1.6
    setenv JAVA_HOME /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
    setenv GROOVY_HOME /Applications/Dev/groovy
    setenv GRAILS_HOME /Applications/Dev/grails
    setenv NEXUS_HOME /Applications/Dev/nexus/nexus-webapp
    setenv JRUBY_HOME /Applications/Dev/jruby
    
    setenv ANT_HOME /Applications/Dev/apache-ant
    setenv ANT_OPTS -Xmx512M
    
    setenv MAVEN_OPTS "-Xmx1024M -XX:MaxPermSize=512m"
    setenv M2_HOME /Applications/Dev/apache-maven
    
    setenv JMETER_HOME /Applications/Dev/jakarta-jmeter
    
    Run Code Online (Sandbox Code Playgroud)
  4. 将更改保存在vi中并重新启动Mac.或者使用上面代码注释中显示的grep/ xargscommand.

  5. 通过打开终端窗口并键入来证明您的变量正常工作export,您应该看到新的变量.这些也可以在您通过Spotlight启动的IntelliJ IDEA和其他GUI应用程序中使用.

  • 这在约塞米蒂不再适用:( (79认同)
  • 有没有办法这样做****没有**做**系统重启**? (53认同)
  • 上述限制适用于MacOS X 10.5.但是,MacOS X 10.6不再具有此限制,并且在environment.plist中设置值即使对于通过聚光灯启动的应用程序也能正常工作.因此雪豹的选择答案是正确的;-) (40认同)
  • 提出的启动方法存在一些问题.大多数特定于PATH环境变量,但提问者确实提到了PATH.1)launchd.conf中的项目不会在ssh等交互式shell中应用到系统中.2)将行"setenv PATH/testdir"附加到Terminal.app中的PATH,但是会破坏OS X应用程序环境中的所有其他PATH项.3)在/etc/launchd.conf中执行"setenv PATH $ {PATH}:/ testdir"无法正确扩展现有的$ PATH 4)launchd.conf适用于所有用户,而不仅仅是一个用户.不是说我有更好的解决方案. (23认同)
  • 设置`launchd.conf`是一种方法,但需要重启(重启launchd).如果您想避免重启,请参阅我的答案http://stackoverflow.com/questions/135688/setting-environment-variables-in-os-x/3756686#3756686 (5认同)
  • 我说接受的答案(environment.plist)对我来说并不成功.我在四台机器上成功使用了10.5和10.6的launchd.conf方法. (3认同)
  • 顺便说一句,如果你的'value'包含空格(setenv MY_VAR带有空格的东西*或*setenv MY_VAR'带有空格仍然不能用的东西'),launchd.conf/setenv的方法将不起作用. (3认同)
  • @NoahR - 从终端启动时,以下链接中描述的方法适用于我的PATH环境变量(没有尝试任何其他方式 - OSX版本10.7):http://serverfault.com/questions/16355/如何到组全局路径上-OS-X (3认同)
  • 哦......好吧......来自MacOSX 10.6.6手册页:$ HOME/.launchd.conf你的launchd配置文件(目前不支持). (2认同)
  • 为了使这个应用程序从Dock启动应用程序,我不得不使用**sudo killall Dock**重新启动它,然后重新启动我的应用程序. (2认同)
  • “setenv PATH x”在 Mavericks 中不起作用。请参阅http://apple.stackexchange.com/questions/106355/setting-the-system-wide-path-environment-variable-in-mavericks (2认同)
  • 这不再有效(至少对于 11.6 Big Sur)。`man launchctl`:“_在早期启动期间不再参考 /etc/launchd.conf 文件来运行子命令;出于安全考虑,删除了此功能。_” (2认同)

Mat*_*tis 257

如何为Spotlight启动的新进程设置环境(无需重启)

您可以设置launchd(以及扩展名,从Spotlight开始的任何内容)使用的环境launchctl setenv.例如,设置路径:

launchctl setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin
Run Code Online (Sandbox Code Playgroud)

或者,如果要设置路径.bashrc或类似路径,请将其镜像到launchd中:

PATH=/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin
launchctl setenv PATH $PATH
Run Code Online (Sandbox Code Playgroud)

如果您希望它能够获取更改的环境,则无需重新启动,但您需要重新启动应用程序.

这包括已在Terminal.app下运行的所有shell,但如果你在那里,你可以更直接地设置环境,例如使用export PATH=/opt/local/bin:/opt/local/sbin:$PATHfor bash或zsh.

重启后如何保持更改

在重新启动后保持更改,您可以设置环境变量/etc/launchd.conf,如下所示:

setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin
Run Code Online (Sandbox Code Playgroud)

launchd.conf 重新启动时自动执行.

如果您希望这些更改现在生效,您应该使用此命令重新处理launchctl.conf(感谢@mklement提示!)

egrep -v '^\s*#' /etc/launchd.conf | launchctl
Run Code Online (Sandbox Code Playgroud)

您可以通过命令了解有关launchctl它以及如何加载的更多信息.launchd.confman launchctl

  • @Shamal:我给你的评论+1了,但请记住Matthew的答案*需要*重启,而我指出了正确的方法来更改它而不重启.如果你想要两者,我建议你把你的路径设置放在launchd.conf中(这样它们会在重新启动时保持不变),然后使用类似这样的脚本"source /etc/launchctl.conf; launchctl setenv PATH $ PATH",这样您也可以在不想重新启动时"刷新". (8认同)
  • @MattCurtis你可以直接编辑你的答案**,以明确说明虽然不需要重新启动,但重启后实际上**会丢失**吗?另外,在重新启动之前在`etc/launchd.conf`中应用更改的正确方法是使用@ MatthewMcCullough的答案中的方法:`egrep"^ setenv \"/ etc/launchd.conf | xargs -t -L 1 launchctl`. (5认同)
  • 非常好一个!使用environment.plist的好处似乎是OS X尊重该文件的内容,而不必首先启动终端。无论如何,我认为您的答案主要集中在避免重新启动的必要性上,因此。 (2认同)
  • @kapuzineralex是的,它避免了重新启动,也改变了从Spotlight启动的程序的环境,而environment.plist则不这样做。 (2认同)
  • 以这种方式设置环境只对我有用,直到我重新启动.重新启动mac后环境变量没有持续.马修的回答对我来说非常有用. (2认同)
  • 效果很好,甚至不需要重启 (2认同)
  • 这样可以正常工作,但必须在每次启动机器后执行.如果一个设置'PATH'这不会采取这似乎是一个特例. - 有没有办法让每个用户**自动**?有没有办法用**PATH**这样做,以便它将由XCode继承,并调用它调用的makefile和脚本? (2认同)
  • @MattCurtis谢谢,我感谢更新 - 感谢阅读手册:)我通过`〜/ .launchd.conf`对*user*-level选项感到兴奋,但事实证明它**不起作用OS X 10.8.3**(我尝试了几种变体) - 文件被忽略; 我向Apple提交了一个错误.而且,事实证明`launchctl`(至少OS X 10.8.3)可以从`stdin`读取命令 - 除了它不能处理注释行!因此,加载挂起更改的(相对)最佳方法如下:`egrep -v'^\s*#'"/ etc/launchd.conf"| launchctl`. (2认同)

tim*_*tes 106

OS X v10.7(Lion)中,您可以将它们设置为:

~/.MacOSX/environment.plist
Run Code Online (Sandbox Code Playgroud)

看到:

对于终端中的PATH,您应该能够设置.bash_profile.profile(您可能必须创建它)

对于OS X v10.8(Mountain Lion)及以上, 您需要使用launchdlaunchctl.

  • 有一些非常好的使用环境变量的图形应用程序示例.例如,IntelliJ希望能够看到M2_HOME知道Maven所在的位置.要让它看到变量,您需要在/etc/launchd.conf而不是environment.plist中设置它. (18认同)
  • 这不再适用于OSX 10.8 http://apple.stackexchange.com/questions/57385/where-are-system-environment-variables-set-in-mountain-lion (16认同)
  • 仅当您实际期望图形应用程序使用它们时才会这样.由于这些通常不使用环境变量,因此它不是设置它们的好地方. (4认同)
  • 供参考:使用`preferences.plist`对于OS X 10.5来说不太理想,因为当时`preferences.plist`没有被通过聚光灯启动的应用程序读取,请参阅Louis对Matthew的回答和http://email.esm的评论.psu.edu/pipermail/macosx-emacs/2010-May/002113.html.对于OS X 10.6`environment.plist`就像它应该的那样工作. (3认同)
  • @tim_yates 您能否将答案的第一行编辑为“最多*并包括* **狮子**(10.*7*)”,因为这是正确的?我试图对原始的、模棱两可的“Up to Mountain Lion”进行编辑,但审稿人把它搞砸了。 (2认同)

Ers*_* Er 66

来自单一来源的命令行和GUI应用程序解决方案(适用于Yosemite和El Capitan)

我们假设您~/.bash_profile在以下代码段中有类似的环境变量定义:

export JAVA_HOME="$(/usr/libexec/java_home -v 1.8)"
export GOPATH="$HOME/go"
export PATH="$PATH:/usr/local/opt/go/libexec/bin:$GOPATH/bin"
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
Run Code Online (Sandbox Code Playgroud)

我们需要一个启动代理,它将在每次登录时随时随地运行,并将这些变量加载到用户会话.我们还需要一个shell脚本来解析这些定义并构建由代理执行的必要命令.

在目录中创建带有plist后缀(例如,named osx-env-sync.plist)的~/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>osx-env-sync</string>
  <key>ProgramArguments</key>
  <array>
    <string>bash</string>
    <string>-l</string>
    <string>-c</string>
    <string>
      $HOME/.osx-env-sync.sh
    </string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)

-l参数在这里至关重要; 使用登录shell执行shell脚本是必要的,以便~/.bash_profile在执行此脚本之前首先获取源脚本.

现在,shell脚本.~/.osx-env-sync.sh使用以下内容创建它:

grep export $HOME/.bash_profile | while IFS=' =' read ignoreexport envvar ignorevalue; do
  launchctl setenv ${envvar} ${!envvar}
done
Run Code Online (Sandbox Code Playgroud)

确保shell脚本是可执行的:

chmod +x ~/.osx-env-sync.sh
Run Code Online (Sandbox Code Playgroud)

现在,加载当前会话的启动代理:

launchctl load ~/Library/LaunchAgents/osx-env-sync.plist
Run Code Online (Sandbox Code Playgroud)

(重新)启动GUI应用程序并验证它是否可以读取环境变量.

设置是持久的.它将在重启和重新登录后继续存在.

在初始设置之后(您刚刚进行了设置),如果您希望再次反映您~/.bash_profile对整个环境的任何更改,重新运行launchctl load ...命令将无法执行您想要的操作; 相反,你会收到如下警告:

<$HOME>/Library/LaunchAgents/osx-env-sync.plist: Operation already in progress

要在不经过注销/登录过程的情况下重新加载环境变量,请执行以下操作:

launchctl unload ~/Library/LaunchAgents/osx-env-sync.plist
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist
Run Code Online (Sandbox Code Playgroud)

最后确保重新启动已经运行的应用程序(包括Terminal.app),以使他们了解更改.

我还将代码和解释推送到GitHub项目:osx-env-sync.

我希望这将是最终解决方案,至少对于最新版本的OS X(Yosemite和El Capitan)而言.

  • 此解决方案是我可以正常使用的唯一解决方案。很好的解决方案。我不明白为什么在Mac上这么难... (2认同)
  • 不幸的是,这对El Capitan无效.您对https://github.com/ersiner/osx-env-sync/issues/1#issuecomment-169803508的评论很好地解释了这个问题. (2认同)
  • 因此,此解决方案不起作用,/etc/launchd.conf 无效,Node.js 将其二进制文件安装到 /usr/local/bin 并且此路径不在 GUI 应用程序的 PATH 中。因此,使用 Node 的 Git 挂钩在 El Capitan 中的 SourceTree 等 GUI Git 应用程序中根本不起作用。这很糟糕。 (2认同)

MrR*_*ROY 51

1.

vim ~/.bash_profile
Run Code Online (Sandbox Code Playgroud)

该文件可能不存在(如果没有,您可以创建它).

2.在此输入并保存文件:

export PATH=$PATH:YOUR_PATH_HERE
Run Code Online (Sandbox Code Playgroud)

3.run

source ~/.bash_profile
Run Code Online (Sandbox Code Playgroud)

  • 这仅适用于Terminal.app. (27认同)

paj*_*to0 34

在OS X中处理环境变量时,基本上有两个问题需要解决.第一个是从Spotlight调用程序(Mac菜单/状态栏右侧的放大镜图标),第二个是从Dock调用程序时调用程序.从一个终端应用程序/实用程序调用程序是微不足道的,因为它从读出的标准外壳的位置的环境(~/.profile,~/.bash_profile,~/.bashrc等)

当调用从Dock程序,使用~/.MacOSX/environment.plist 其中所述<dict>元素包含的序列 <key>KEY</key><string>theValue</string>的元素.

从Spotlight调用程序时,请确保已使用所需的所有键/值设置设置launchd.

要同时解决这两个问题,我在用户帐户上使用登录项(通过"系统首选项"工具设置).登录项是一个调用Emacs lisp函数的bash脚本,尽管当然可以使用他们喜欢的脚本工具来完成同样的事情.这种方法具有额外的好处,它可以随时工作,不需要重新启动,即可以编辑~/.profile,在某些shell中运行登录项,并从Dock或Spotlight中对新调用的程序显示更改.

细节:

登录项目: ~/bin/macosx-startup

#!/bin/bash
bash -l -c "/Applications/Emacs.app/Contents/MacOS/Emacs --batch -l ~/lib/emacs/elisp/macosx/environment-support.el -f generate-environment"
Run Code Online (Sandbox Code Playgroud)

Emacs lisp功能: ~/lib/emacs/elisp/macosx/envionment-support.el

;;; Provide support for the environment on Mac OS X

(defun generate-environment ()
  "Dump the current environment into the ~/.MacOSX/environment.plist file."
  ;; The system environment is found in the global variable:
  ;; 'initial-environment' as a list of "KEY=VALUE" pairs.
  (let ((list initial-environment)
        pair start command key value)
    ;; clear out the current environment settings
    (find-file "~/.MacOSX/environment.plist")
    (goto-char (point-min))
    (setq start (search-forward "<dict>\n"))
    (search-forward "</dict>")
    (beginning-of-line)
    (delete-region start (point))
    (while list
      (setq pair (split-string (car list) "=")
            list (cdr list))
      (setq key (nth 0 pair)
            value (nth 1 pair))
      (insert "  <key>" key "</key>\n")
      (insert "  <string>" value "</string>\n")

      ;; Enable this variable in launchd
      (setq command (format "launchctl setenv %s \"%s\"" key value))
      (shell-command command))
    ;; Save the buffer.
    (save-buffer)))
Run Code Online (Sandbox Code Playgroud)

注意:这个解决方案是我加入我之前的那些解决方案的混合,特别是Matt Curtis提供的解决方案,但我故意试图保持我的~/.bash_profile内容平台独立并将launchd环境设置(仅限Mac设施)放入单独的脚本中.

  • 哇.我并不是说这不起作用,但是......我对在OS X上获得一致环境所需的复杂性感到震惊. (19认同)
  • 在我看到的所有10.9解决方案中,这是最好的.唯一的缺陷是,由于登录项以不确定的顺序运行,如果Emacs(例如)在登录时启动(例如,因为它在注销时打开),除非重新启动它,否则它不一定具有环境变量,因为它是在你的脚本之前启动的. (2认同)

Big*_*ich 22

另一个免费的开源Mac OSX Mountain Lion(10.8)Preference pane/environment.plist解决方案是EnvPane.

EnvPane的源代码可在Github上获得.EnvPane看起来具有与RCEnvironment类似的功能,但是,它似乎可以立即更新其存储的变量,即无需重启或登录,这是受欢迎的.

正如开发人员所说:

EnvPane是Mac OS X 10.8(Mountain Lion)的首选项窗格,可让您为图形和终端会话中的所有程序设置环境变量.它不仅可以恢复对Mountain Lion中〜/ .MacOSX/environment.plist的支持,还可以立即发布您对环境的更改,而无需注销并重新登录.
<SNIP>
EnvPane包括(并自动安装)在登录后早期运行1)的launchd代理和2)每当〜/ .MacOSX/environment.plist发生更改时.代理读取〜/ .MacOSX/environment.plist,并通过launchctl setenv和launchctl unsetenv使用的相同API将该文件中的环境变量导出到当前用户的launchd实例.

免责声明:我与开发人员或他/她的项目没有任何关系.

PS我喜欢这个名字(听起来像'Ends Pain').

  • EnvPane目前无法设置PATH.有关更多详细信息,请参阅我的错误报告:github.com/hschmidt/EnvPane/issues/5 (2认同)
  • @sorin:您可以在GitHub网站上打开一个问题,其中包含您遇到的问题的描述吗?EnvPane在10.10为我工作.免责声明:我是EnvPane的作者. (2认同)

Flo*_*ori 17

在山狮所有/etc/paths/etc/launchd.conf编辑不采取任何影响!

Apple的开发者论坛说:

"更改.app本身的Info.plist以包含带有所需环境变量的"LSEnvironment"字典.

不再支持〜/ .MacOSX/environment.plist."

所以我直接编辑了应用程序Info.plist(右键单击"AppName.app"(在本例中为SourceTree),然后" Show package contents")

显示包装内容

并添加了一个名为的新键/ dict对:

<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>
Run Code Online (Sandbox Code Playgroud)

(请参阅:Apple的LaunchServicesKeys文档)

在此输入图像描述

现在App(在我的案例中是SourceTree)使用给定的路径并使用git 1.9.3 :-)

PS:当然,您必须根据特定路径需求调整Path条目.

  • 这对El Capitan没有任何影响.:( (4认同)
  • 该解决方案符合系统中侵入性最小的标准.谢谢. (3认同)

Max*_*ske 17

更新(2017-08-04)

截至(至少)macOS 10.12.6(Sierra),这种方法似乎已停止为Apache httpd工作(对于它systemuser选项launchctl config).其他程序似乎没有受到影响.可以想象这是httpd中的一个错误.

原始答案

这涉及OS X 10.10+(10.11+,特别是由于无根模式,/usr/bin不再可写).

我已经在多个地方读过,由于OS X中的错误,使用launchctl setenv PATH <new path>设置PATH变量不起作用(从个人经验看似乎是这样).我发现PATH可以为未从shell启动的应用程序设置另一种方法:

sudo launchctl config user path <new path>
Run Code Online (Sandbox Code Playgroud)

launchctl手册页中记录了此选项:

配置系统| 用户参数值

设置launchd(8)域的持久配置信息.只能配置系统域和用户域.持久存储的位置是实现细节,只应通过此子命令对该存储进行更改.通过此子命令进行的更改需要重新启动才能生效.

[...]

路径

将目标域中所有服务的PATH环境变量设置为字符串值.字符串值应符合environ(7)中PATH环境变量的轮廓格式.请注意,如果服务指定自己的PATH,则特定于服务的环境变量将优先.

注意:此工具不能用于为域中的所有服务设置常规环境变量.出于安全原因,故意将其范围限定为PATH环境变量而不是其他任何内容.

我已经确认这可以使用从Finder启动的GUI应用程序(getenv用于获取PATH).请注意,您只需执行一次此操作,并且通过重新启动将保持更改.


Bru*_*ert 15

有时,以前的所有答案都不起作用.如果你想M2_HOME在Eclipse或IntelliJ IDEA中访问系统变量(例如),在这种情况下,对我来说唯一有用的是:

首先(步骤1)编辑/etc/launchd.conf以包含这样的行:"setenv VAR value"然后(步骤2)重新启动.

简单地修改.bash_profile是行不通的,因为在OS X中应用程序不像其他Unix那样启动; 它们不会继承父级的shell变量.所有其他修改都不适用于我不知道的原因.也许其他人可以澄清这一点.

  • 从Spotlight或任何其他方式启动的应用程序都会通过其父进程读取/etc/launchd.conf,从而使其成为在所有应用程序和shell中设置环境变量的位置的吸引人的选择. (5认同)

Jas*_*ler 15

虽然这里的答案并非"错误",但我还要添加另一个:永远不要在OS X中对环境变量进行更改,这些更改会影响"所有进程",甚至在shell外部,对于给定用户以交互方式运行的所有进程.

根据我的经验,对于所有进程的环境变量(如PATH)的全局更改甚至更可能破坏OS X而不是Windows.原因是,许多OS X应用程序和其他软件(包括可能特别是OS本身的组件)依赖于UNIX下的UNIX命令行工具,并假设系统提供的这些工具的版本行为,以及这样做时不一定使用绝对路径(类似的注释适用于动态加载的库和DYLD_*环境变量).例如,考虑一下有关替换OS X提供的解释器版本(如Python和Ruby)的各种Stack Overflow问题的最高评级答案通常会说"不要这样做".

在这方面,OS X与其他类UNIX操作系统(例如,Linux,FreeBSD和Solaris)没有什么不同; 苹果公司没有提供简单方法的最可能原因是因为它打破了局面.在某种程度上,Windows并不容易出现这些问题,这主要归功于两件事:(1)Windows软件不像UNIX软件那样依赖命令行工具,(2)微软已经拥有"DLL地狱"这样一个广泛的历史和由影响所有进程的更改引起的安全问题,他们改变了新版Windows动态加载的行为,以限制"全局"配置选项(如PATH)的影响.

"Lame"与否,如果将这些更改限制在较小的范围内,您将拥有一个更加稳定的系统.


Rus*_*l B 13

在追逐环境变量偏好窗格并发现链接断开并且在Apple网站上搜索似乎表明他们已经忘记了它之后......我开始回到难以捉摸的启动过程的轨迹上.

在我的系统(Mac OS X的10.6.8),它出现在environment.plist定义的变量被可靠地出口到(通过的launchd)从聚光灯推出的应用程序.我的麻烦是这些变量没有被导出到终端中的新bash会话.即我有与此处描述的相反的问题.

注意:environment.plist看起来像JSON,而不是XML,如前所述

通过编辑〜/ MacOSX/environment.plist , 我可以通过编辑〜/ MacOSX/environment.plist让Spotlight应用程序看到vars,并且通过将以下内容添加到我的.profile文件中,我能够将相同的vars强制进入新的终端会话:

eval $(launchctl export)
Run Code Online (Sandbox Code Playgroud)

  • 在我的新Mountain Lion机器(10.8.2)上,environment.plist完全没用.请参阅马修的正确答案的答案.这是关于启动和launchctl命令行应用程序以及/etc/launchd.conf.您可以在终端窗口中使用`man launchd`,`man launchctl`和`man launchd.conf`读取自己.高兴的苹果公司让这些手册页保持最新状态,即使Mac开发者库有点滞后. (3认同)
  • 不难以捉摸:[RCenvironment](http://www.rubicode.com/Software/RCEnvironment/) (2认同)

Ben*_*arp 11

2022 年 2 月(MacO 12+)

这里的解决方案应该在重新启动或应用程序重新启动后起作用。

命令行界面

打开您选择的 CLI 配置文件。

  • 对于 bash 打开~/.bash_profile
  • 对于 zsh 打开~/.zshrc

添加(或替换)

export varName=varValue 
Run Code Online (Sandbox Code Playgroud)

(如果varValue其中有空格 - 将其包裹起来"

确保重新启动命令行应用程序。

图形用户界面

完成 CLI 步骤。确保 GUI 应用程序已关闭。从命令行打开 GUI 应用程序。例如:

open /Applications/Sourcetree.app
Run Code Online (Sandbox Code Playgroud)

(您也可以在 中为该命令设置别名.zshrc

原则

  • Mac 没有为所有上下文设置环境变量的配置选项。
  • 避免更改用户配置文件之外的任何内容。

不再起作用了

  • launchctl config user varName varVal(MacOS 12.1+)
  • 编辑/etc/launchd.conf
  • plist带有后缀的xml文件


Joh*_*kin 10

任何Bash的启动文件- ,~/.bashrc,.~/.bash_profile 在GUI应用程序中~/.profile还有一些以~/.MacOSX/environment.plist环境变量命名的奇怪文件.


wir*_*d00 10

这是一个非常简单的方法来做你想要的.在我的情况下,它开始sudo nano /etc/paths工作(for sudo vim /etc/paths)

  • 打开终端.
  • 运行以下命令:

    echo $PATH 要么 sudo nano /etc/paths

  • 出现提示时输入您的密码.

  • 转到文件底部,然后输入要添加的路径.
  • 点击control-x退出.
  • 输入"Y"以保存修改后的缓冲区.
  • 打开一个新的终端窗口然后键入:

    sudo vim /etc/paths

您应该看到新路径附加到PATH的末尾

我从这篇文章中得到了这些细节:

http://architectryan.com/2012/10/02/add-to-the-path-on-mac-os-x-mountain-lion/#.UkED3rxPp3Q

我希望能帮助别人


cou*_*ndj 10

就像Matt Curtis给出的答案一样,我通过launchctl设置环境变量,但是我将它包装在一个名为export的函数中,这样每当我在.bash_profile中导出一个像normal一样的变量时,它也会被launchctl设置.这是我做的:

  1. 我的.bash_profile只包含一行,(这只是个人偏好.)

    source .bashrc
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我的.bashrc有这个:

    function export()
    {
        builtin export "$@"
        if [[ ${#@} -eq 1 && "${@//[^=]/}" ]]
        then
            launchctl setenv "${@%%=*}" "${@#*=}"
        elif [[ ! "${@//[^ ]/}" ]]
        then
            launchctl setenv "${@}" "${!@}"
        fi
    }
    
    export -f export
    
    Run Code Online (Sandbox Code Playgroud)
  3. 以上将超载Bash内置"导出"并将正常导出所有内容(您会注意到我用它导出"导出"!),然后通过launchctl为OS X应用程序环境正确设置它们,无论您是否使用以下任何一项:

    export LC_CTYPE=en_US.UTF-8
    # ~$ launchctl getenv LC_CTYPE
    # en_US.UTF-8
    PATH="/usr/local/bin:${PATH}"
    PATH="/usr/local/opt/coreutils/libexec/gnubin:${PATH}"
    export PATH
    # ~$ launchctl getenv PATH
    # /usr/local/opt/coreutils/libexec/gnubin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
    export CXX_FLAGS="-mmacosx-version-min=10.9"
    # ~$ launchctl getenv CXX_FLAGS
    # -mmacosx-version-min=10.9
    
    Run Code Online (Sandbox Code Playgroud)
  4. 这样我每次都不必将每个变量发送到launchctl,我可以按照我想要的方式设置我的.bash_profile/.bashrc.打开一个终端窗口,查看你感兴趣的环境变量launchctl getenv myVar,更改.bash_profile/.bashrc中的内容,关闭终端窗口并重新打开它,再次使用launchctl检查变量,然后改变它.

  5. 同样,与后山狮世界的其他解决方案一样,对于可用于应用的任何新环境变量,您需要在更改后启动或重新启动它们.


Tom*_*man 8

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

干得好:

http://www.apple.com/downloads/macosx/system_disk_utilities/environmentvariablepreferencepane.html

  • 仍然可以在[RCenvironment](http://www.rubicode.com/Software/RCEnvironment/)上找到 (2认同)

Cla*_*ani 7

简明扼要地说明每个文件的用途

  • ~/.profile 每次启动Terminal.app时都会获取
  • ~/.bashrc 是"传统上"设置Bash环境的所有导出语句的地方
  • /etc/paths 是Mac OS中的主文件,其中包含用于为所有用户构建PATH环境变量的默认路径列表
  • /etc/paths.d/ 包含保存其他搜索路径的文件

非终端程序不会继承终端所执行的系统范围的PATH和MANPATH变量!要为特定用户启动的所有进程设置环境,从而使环境变量可用于Mac OS X GUI应用程序,必须在您的~/.MacOSX/environment.plist(Apple Technical Q&A QA1067)中定义这些变量

使用下面的命令行到您的同步environment.plist/etc/paths:

defaults write $HOME/.MacOSX/environment PATH "$(tr '\n' ':' </etc/paths)"
Run Code Online (Sandbox Code Playgroud)


Dav*_*vid 6

/etc/launchd.conf 未在 OS X v10.10 (Yosemite)、OS X v10.11 (El Capitan)、macOS v10.12 (Sierra) 或 macOS v10.13 (High Sierra) 中使用。


launchctl手册页:

/etc/launchd.conf file is no longer consulted for subcommands to run during early boot time;
this functionality was removed for security considerations.
Run Code Online (Sandbox Code Playgroud)

这个Ask Different答案中描述的方法对我有用(重新启动后):从 Dock 或 Spotlight 启动的应用程序继承我在~/Library/LaunchAgents/my.startup.plist. (就我而言,我需要为 Sublime Text 插件设置LANG, 到en_US.UTF-8。)


Nic*_* Wu 5

$PATH变量也是受path_helper,这反过来又使使用的/etc/paths文件和文件/etc/paths.d.

可以在此处找到更全面的描述:http://hea-www.harvard.edu/~fine/OSX/path_helper.html


Cod*_*ide 5

刚刚做的这件事非常简单快捷。首先从终端创建~/.bash_profile

touch .bash_profile
Run Code Online (Sandbox Code Playgroud)

然后

open -a TextEdit.app .bash_profile
Run Code Online (Sandbox Code Playgroud)

添加

export TOMCAT_HOME=/Library/Tomcat/Home
Run Code Online (Sandbox Code Playgroud)

保存文档就完成了。