在OS X上设置环境变量

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

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

  • /etc/paths
  • 个人主页
  • ~/. tcscr

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

我正在运行osxv10.5(豹)。

829562 次浏览

直到并包括OS X v10.7(Lion)您可以设置它们:

~/.MacOSX/environment.plist

见:

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

对于OS X v10.8(Mountain Lion)及更高版本你需要使用#0和#1

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

对于单个用户修改,请使用您列出的~/.profile。以下链接说明了Bash何时读取不同的文件。

http://telin.ugent.be/~slippens/drupal/bashrc_and_others

如果要为gui应用程序设置环境变量,则需要~/. MacOSX/environment.plist文件

嗯,我不确定/etc/paths~/.MacOSX/environment.plist文件。那些是新的。

但是使用Bash,你应该知道.bashrc会在每次新的shell调用时执行.bash_profile在启动时只执行一次。

我不知道这种情况在Mac OS X上有多常见,我认为这种区别已经随着窗口系统启动所有内容而被打破。

就个人而言,我通过创建一个包含我需要的一切的.bashrc文件来消除混乱,然后执行以下操作:

ln -s .bashrc .bash_profile

有时前面的所有答案都不起作用。如果您想在Eclipse或IntelliJ IDEA中访问系统变量(如M2_HOME),在这种情况下唯一适合我的方法是:

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

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

Bruno是正确的。我做了广泛的研究,如果你想设置所有GUI应用程序中可用的变量,你唯一的选择是/etc/launchd.conf

请注意environment.plist不适用于通过Spot light启动的应用程序。这是史蒂夫·塞克斯顿在这里记录的

  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.6setenv JAVA_HOME /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Homesetenv GROOVY_HOME /Applications/Dev/groovysetenv GRAILS_HOME /Applications/Dev/grailssetenv NEXUS_HOME /Applications/Dev/nexus/nexus-webappsetenv JRUBY_HOME /Applications/Dev/jruby
    setenv ANT_HOME /Applications/Dev/apache-antsetenv ANT_OPTS -Xmx512M
    setenv MAVEN_OPTS "-Xmx1024M -XX:MaxPermSize=512m"setenv M2_HOME /Applications/Dev/apache-maven
    setenv JMETER_HOME /Applications/Dev/jakarta-jmeter
  4. Save your changes in vi and reboot your Mac. Or use the grep/xargs command which is shown in the code comment above.

  5. Prove that your variables are working by opening a Terminal window and typing export and you should see your new variables. These will also be available in IntelliJ IDEA and other GUI applications you launch via Spotlight.

不要期望~/.launchd.conf工作

Launchctl的手册页说它从来没有工作过:

丧失和丧失的功能

Launchctl不再具有交互模式,也不接受来自stdin的命令。 /etc/launchd.conf文件不再用于在早期启动时运行的子命令;出于安全考虑,此功能已被删除。虽然有记录表明在设置用户会话之前会咨询$HOME/.launchd.conf,但此功能从未实现。

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

您可以使用launchctl setenv设置Launchd(以及从Spotlight开始的任何内容)使用的环境。例如设置路径:

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

或者,如果您想在.bashrc或类似的目录中设置路径,请将其镜像到Launchd中:

PATH=/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbinlaunchctl setenv PATH $PATH

没必要重启了,但如果您希望应用程序获取更改的环境,则需要重新启动应用程序。

这包括任何已经在Terminal.app下运行的shell,尽管如果你在那里,你可以更直接地设置环境,例如export PATH=/opt/local/bin:/opt/local/sbin:$PATH用于bash或zsh。

如何在重新启动后保持更改

新方法(自10.10 Yosemite以来)

使用launchctl config user path /bin:/usr/bin:/mystuff。有关更多信息,请参阅man launchctl

以前的方法

在这个答案的顶部引用的Launchctl手册页说,这里描述的功能(在引导时读取/etc/launchd.conf)是出于安全原因被删除的,所以ymmv。

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

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

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

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

egrep -v '^\s*#' /etc/launchd.conf | launchctl

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

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

在这里你去:

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

除了建议的方法之外,还有一点需要注意的是,至少在osx10.5(Leopard)中,launchd.conf中设置的变量将与.profile中的设置合并。我想这也可能对~/.MacOSX/environment.plist中的设置有效,但我还没有验证。

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

从Dock调用程序时,使用~/.MacOSX/environment.plist其中<dict>元素包含一个序列<key>KEY</key><string>theValue</string>个元素。

从Spotlight调用程序时,请确保启动使用您需要的所有键/值设置进行设置。

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

详情:

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

#!/bin/bashbash -l -c "/Applications/Emacs.app/Contents/MacOS/Emacs --batch -l ~/lib/emacs/elisp/macosx/environment-support.el -f generate-environment"

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)))

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

在追逐环境变量首选项窗格并发现链接已损坏并且在Apple网站上的搜索似乎表明他们已经忘记了它之后……我开始回到难以捉摸的启动过程的踪迹。

在我的系统(Mac OS X 10.6.8)上,似乎environment.plist中定义的变量被可靠地导出到从Spotlight启动的应用程序(通过Launchd)。我的问题是这些变量没有被导出到终端中的新bash会话。也就是说,我有这里描述的相反的问题。

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

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

eval $(launchctl export)

对于Bash,尝试将您的环境变量添加到文件/etc/profile以使它们可供所有用户使用。无需重新启动,只需启动一个新的终端会话。

  1. 执行:

    vim ~/.bash_profile

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

  2. 输入并保存文件:

    export PATH=$PATH:YOUR_PATH_HERE
  3. Run

    source ~/.bash_profile

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

更详细的描述可以在Leopard中的PATH和其他环境问题(2008-11)中找到

虽然这里的答案没有“错误”,但我将添加另一个:永远不要在OS X中进行影响“所有进程”的环境变量更改,甚至在shell之外,对于给定用户交互运行的所有进程。

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

在这方面,OS X与其他类UNIX操作系统(例如,Linux,FreeBSD和Solaris)没有什么不同;Apple没有提供简单方法来做到这一点的最可能原因是它破坏东西。在Windows不容易出现这些问题的程度上,这是由于两件事:(1)Windows软件不像UNIX软件那样依赖命令行工具,(2)Microsoft在“DLL地狱”和由影响所有进程的更改引起的安全问题方面有着如此广泛的历史,以至于他们改变了较新Windows版本中动态加载的行为,以限制PATH等“全局”配置选项的影响。

无论是否“蹩脚”,如果您将此类更改限制在较小的范围内,您都将拥有更稳定的系统。

另一个免费的开源Mac OS X v10.8(Mountain Lion)首选项窗格/environment.plist解决方案是EnvPane

EnvPane的源代码github上可用。EnvPane看起来具有与RC环境相当的功能,但是,它似乎可以立即更新其存储的变量,即没有需要重新启动或登录,这是受欢迎的。

正如开发人员所说:

EnvPane是Mac OS X 10.8(Mountain Lion)的首选项窗格允许您在两个图形中为所有程序设置环境变量和终端会话。它不仅恢复了对~/。MacOSX/environment.plistMountain Lion中,它还发布您的立即更改环境,无需注销然后回来。EnvPane包括(并自动安装)一个启动代理1)登录后早期运行,2)每当~/。MacOSX/environment.plist更改。代理读取~/. MacOSX/environment.plist并导出环境变量通过相同的API将该文件传输到当前用户的启动实例使用的是Launchctl setenv和Launchctl unsetenv。

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

我喜欢这个名字(听起来像“结束痛苦”)。

在Mountain Lion上,所有/etc/paths/etc/launchd.conf编辑都没有任何效果!

苹果的开发者论坛说:

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

~/。不再支持MacOSX/environment.plist。”

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

显示包内容

我添加了一个新的键/字典对,称为:

<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>

(见:在Apple启动ServicesKeys文档

在此处输入图像描述

现在应用程序(在我的例子中是Sourcetree)使用给定的路径并使用Git 1.9.3:-)

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

这是一个非常简单的方法来做你想做的事情。在我的例子中,它是让Gradle工作(适用于Android Studio)。

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

    sudo nano /etc/pathssudo vim /etc/paths

  • 出现提示时,输入密码。

  • 转到文件的底部,然后输入要添加的路径。
  • 点击控制+X退出。
  • 输入“Y”保存修改后的缓冲区。
  • 打开一个新的终端窗口,然后键入:

    echo $PATH

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

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

添加到PATH在Mac OS X 10.8山狮和以上

在Mac OS上设置PATH环境变量

打开终端程序(默认情况下在您的应用程序/实用程序文件夹中)。运行以下命令

touch ~/.bash_profile; open ~/.bash_profile

这将在默认文本编辑器中打开该文件。

以Android SDK为例:

您需要将路径添加到您的Android SDK平台工具和工具目录。在我的示例中,我将使用“/Development/android-sdk-macosx”作为SDK安装的目录。添加以下行:

export PATH=${PATH}:/Development/android-sdk-macosx/platform-tools:/Development/android-sdk-macosx/tools

保存文件并退出文本编辑器。执行.bash_profile更新PATH:

source ~/.bash_profile

现在,每次打开终端程序时,您的PATH都会包含Android SDK。

很简单:

编辑~/.配置文件并将您的变量如下所示

$vim~/. vim创建人

在文件中:

MY_ENV_VAR=值

  1. 保存(: wq)

  2. 重新启动终端(退出并再次打开)

  3. 确保一切都好:

$Echo$MY_ENV_VAR

$值


这很简单。编辑文件.profile(vi、纳米崇高文本或其他文本编辑器)文件。您可以在~/目录(用户目录)中找到它,并像这样设置:

export MY_VAR=[your value here]

以Java家为例:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/current

保存并返回终端。

你可以重新加载它:

source .profile

或者关闭并打开您的终端窗口。

就像Matt Curtis给出的答案一样,我通过Launchctl设置环境变量,但我将其包装在一个名为port的函数中,因此每当我在.bash_profile中像普通一样导出变量时,它也会由Launchctl设置。这是我所做的:

  1. 我的.bash_profile仅由一行组成,(这只是个人偏好。)

    source .bashrc
  2. My .bashrc has this:

    function export(){builtin export "$@"if [[ ${#@} -eq 1 && "${@//[^=]/}" ]]thenlaunchctl setenv "${@%%=*}" "${@#*=}"elif [[ ! "${@//[^ ]/}" ]]thenlaunchctl setenv "${@}" "${!@}"fi}
    export -f export
  3. The above will overload the Bash builtin "export" and will export everything normally (you'll notice I export "export" with it!), then properly set them for OS X app environments via launchctl, whether you use any of the following:

    export LC_CTYPE=en_US.UTF-8# ~$ launchctl getenv LC_CTYPE# en_US.UTF-8PATH="/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/binexport CXX_FLAGS="-mmacosx-version-min=10.9"# ~$ launchctl getenv CXX_FLAGS# -mmacosx-version-min=10.9
  4. This way I don't have to send every variable to launchctl every time, and I can just have my .bash_profile / .bashrc set up the way I want. Open a terminal window, check out your environment variables you're interested in with launchctl getenv myVar, change something in your .bash_profile/.bashrc, close the terminal window and re-open it, check the variable again with launchctl, and voilá, it's changed.

  5. Again, like the other solutions for the post-Mountain Lion world, for any new environment variables to be available for apps, you need to launch or re-launch them after the change.

只需简单快速地完成此操作。首先从终端创建一个~/.bash_profile

touch .bash_profile

然后

open -a TextEdit.app .bash_profile

添加

export TOMCAT_HOME=/Library/Tomcat/Home

保存文档,你就完成了。

简洁明了地说明每个文件的用途

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

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

使用以下命令行将environment.plist/etc/paths同步:

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

这里有两种类型的贝壳。

  • 非登录:每次启动一个新的Bash副本时. bashrc都会重新加载
  • 登录:仅当您登录或明确告诉Bash加载它并将其用作登录shell时,才会加载.配置文件。

重要的是要了解,使用Bash,文件.bashrc只能由交互式和非登录的shell读取,您会发现人们经常在.bash_profile中加载.bashrc来克服这个限制。

现在您已经有了基本的了解,让我们继续讨论我建议您如何设置它。

  • .配置文件:创建它不存在。把你的PATH设置放在那里。
  • . bashrc:如果不存在则创建。将您所有的别名和自定义方法放在那里。
  • .bash_profile:如果不存在,则创建。将以下内容放在那里。

.bash_file:

#!/bin/bashsource ~/.profile # Get the PATH settingssource ~/.bashrc  # Get Aliases and Functions#

登录外壳

/etc/profile

shell首先执行文件/etc/profile中的命令。使用root权限的用户可以设置此文件以为运行Bash的用户建立系统范围的默认特征。

.bash_profile.bash_login.profile

接下来,shell按顺序查找~/.bash_profile~/.bash_login~/.profile(~/是您的主目录的简写),执行它找到的第一个文件中的命令。您可以将命令放入其中一个文件中以覆盖/etc/profile中设置的默认值。在虚拟终端上运行的shell不会执行这些文件中的命令。

.bash_logout

当您注销时,bash会执行~/.bash_logout文件中的命令。此文件通常包含会话后清理的命令,例如删除临时文件的命令。

交互式非登录外壳

/etc/bashrc

尽管bash不直接调用,但许多~/.bashrc文件调用/etc/bashrc。此设置允许使用root权限的用户为非登录bash shell建立系统范围的默认特征。

.bashrc

交互式非登录shell执行~/.bashrc文件中的命令。通常,登录shell的启动文件(例如.bash_profile)运行此文件,因此登录shell和非登录shell都运行.bashrc中的命令。

因为.bashrc中的命令可能会执行多次,并且因为子shell继承了导出的变量,所以将添加到.bash_profile文件中现有变量的命令放在.bash_profile文件中是一个好主意。

来自单一来源的命令行和GUI应用程序的解决方案(适用于Mac OS X v10.10(Yosemite)和Mac OS X v10.11(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"

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

~/Library/LaunchAgents/目录中创建一个后缀为plist的文件(例如命名为osx-env-sync.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>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>

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

现在,外壳脚本。在~/.osx-env-sync.sh处创建它,内容如下:

grep export $HOME/.bash_profile | while IFS=' =' read ignoreexport envvar ignorevalue; dolaunchctl setenv "${envvar}" "${!envvar}"done

确保外壳脚本是可执行的:

chmod +x ~/.osx-env-sync.sh

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

launchctl load ~/Library/LaunchAgents/osx-env-sync.plist

(Re)启动GUI应用程序并验证它可以读取环境变量。

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

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

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

为了重新加载环境变量,而不必通过注销/登录过程,请执行以下操作:

launchctl unload ~/Library/LaunchAgents/osx-env-sync.plistlaunchctl load ~/Library/LaunchAgents/osx-env-sync.plist

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

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

我希望这将是最终的解决方案,至少对于最新版本的OS X(优胜美地和埃尔卡皮坦)。

更新(2017-08-04)

从(至少)macOS 10.12.6(Sierra)开始,这种方法似乎已经停止在Apache htpd上工作(对于systemlaunchctl configuser选项)。其他程序似乎没有受到影响。可以想象,这是http pd中的bug。

原答复

这与OS X 10.10+有关(10.11+特别是由于无根模式,其中/usr/bin不再可写)。

我在很多地方读到,由于OS X中的bug,使用launchctl setenv PATH <new path>设置PATH变量不起作用(从个人经验来看似乎是真的)。我发现还有另一种方法可以为未从shell启动的应用程序设置PATH

sudo launchctl config user path <new path>

此选项记录在Launchctl手册页中:

配置系统|用户参数值

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

[…]

路径

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

注意:此功能不能用于为域内的所有服务设置通用环境变量。它被故意限定为PATH环境变量-#36825;安全的原因,没有别的办法

我已经确认这适用于从Finder启动的GUI应用程序(使用getenv获取PATH)。请注意,您只需执行一次,并且更改将在重新启动时持久化。

/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.

这个问不同的答案中描述的方法适合我(重新启动后):从Dock或Spotlight启动的应用程序继承我在~/Library/LaunchAgents/my.startup.plist中设置的环境变量。(在我的例子中,我需要为Sublime Text插件设置LANGen_US.UTF-8。)

iOS所有的魔力只适用于在文件中使用source,您可以在其中导出环境变量。

例如:

您可以像这样创建一个文件:

export bim=foooexport bom=bar

将此文件另存为bimbom.env,然后执行source ./bimbom.ev。好了,你得到了你的环境变量。

检查他们与:

echo $bim

我的个人实践是.bash_profile。我在那里添加路径并附加到路径变量,

GOPATH=/usr/local/go/bin/MYSQLPATH=/usr/local/opt/mysql@5.6/bin
PATH=$PATH:$GOPATH:$MYSQLPATH

之后,我可以通过echo $GOPATHecho$MYSQLPATHecho $PATH获得单个路径。

2022年2月(MacOS 12+)

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

CLI

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

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

添加(或替换)

export varName=varValue

(如果varValue中有空格-将其包装在"中)

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

GUI

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

open /Applications/Sourcetree.app

(您也可以在.zshrc中为此命令别名)

原则

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

已经不管用了

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