在OS X中设置环境variables?

在OSX中修改环境variables(如PATH)的正确方法是什么? 我看了一下Google,find了3个不同的文件来编辑:

  • 的/ etc /path
  • 〜/ .profile文件
  • 〜/ .tcshrc文件

我甚至没有这些文件,我很确定.tcshrc是错误的,因为OSX现在使用bash。 任何人都知道这些variables,特别是PATH的定义?

编辑:我正在运行OS X 10.5

布鲁诺是正确的轨道上。 我做了大量的研究,如果你想设置所有GUI应用程序中可用的variables,唯一的select是/etc/launchd.conf

请注意, environment.plist不适用于通过Spotlight启动的应用程序。 这是由Steve Sexton在这里logging的 。

1)打开terminal提示符

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

4)保存你的更改到VI并重新启动你的Mac。 或者使用上面代码注释中显示的grep / xargs命令。

5)通过打开一个terminal窗口并inputexport ,certificate你的variables正在工作,你应该看到你的新variables。 这些也将在您通过Spotlight发布的IntelliJ和其他GUI应用程序中提供。

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

您可以使用launchctl setenv设置launchd(以及扩展名,从Spotlight开始的任何内容)使用的launchctl setenv 。 例如要设置path:

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

或者,如果您想要在.bashrc或类似文件中设置path,请将其镜像到launchd中:

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

没有必要重新启动,但是如果您想要启动应用程序,则需要重新启动应用程序。

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

重新启动后如何保持更改

在重新启动后保留更改,可以从/etc/launchd.conf设置环境variables,如下所示:

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

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

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

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

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

直到并包括狮子 (10.7),您都可以设置它们

〜/ .MacOSX / environment.plist

看到:

对于terminal中的PATH,你应该可以设置.bash_profile.profile (你可能需要创build它)

对于山狮和更远, 你需要使用launchdlaunchctl

从单一来源获得命令行和GUI应用程序的解决scheme(与Yosemite&El Capitan合作)

假设您在~/.bash_profile有环境variables定义,如下面的代码片段所示:

 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" 

我们需要一个启动代理 ,它将在每次login时随时按需运行,并将这些variables加载到用户会话中。 我们还需要一个shell脚本来parsing这些定义,并构build必须由代理执行的命令。

~/Library/LaunchAgents/目录下创build一个带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参数在这里很重要; 需要使用loginshell执行shell脚本,以便在脚本执行之前首先获取~/.bash_profile

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

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

确保shell脚本是可执行的:

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

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

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

(重新)启动一个GUI应用程序,并确认它可以读取环境variables。

该设置是持久的。 它将在重新启动和重新login后生存下来。

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

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

为了无需通过注销/login过程重新加载您的环境variables,请执行以下操作:

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

最后确保你重新启动已经运行的应用程序(包括Terminal.app),让他们知道这些变化。

我也将代码和解释推到了GitHub项目中: osx-env-sync 。

我希望这将是最终的解决scheme,至less对于最新版本的OS X(Yosemite&El Capitan)来说。

1。

 vim ~/.bash_profile 

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

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

 export PATH=$PATH:YOUR_PATH_HERE 

3.run

 source ~/.bash_profile 

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

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

从Spotlight调用程序时,请确保launchd已经设置了所有您需要的键/值设置。

为了同时解决这两个问题,我在我的用户帐户上使用login项目(通过系统首选项工具设置)。 login项目是一个bash脚本,调用Emacs的lisp函数,尽pipe当然可以使用他们最喜欢的脚本工具来完成同样的事情。 这种方法的好处是可以随时工作,不需要重新启动,也就是说,可以编辑~/.profile ,在某个shell中运行login项,并且对于新调用的程序,Dock或者聚光灯。

细节:

login项目: ~/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" 

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

注意:这个解决scheme是我join之前的一个混合,特别是Matt Curtis提供的,但是我特意试着保持我的~/.bash_profile内容平台独立,并且把launchd环境的设置(一个Mac only设备)成一个单独的脚本。

另一个免费的开源,Mac OSX Mountain Lion(10.8)首选窗格/ environment.plist解决scheme是EnvPane 。

EnvPane的源代码在Github上可用。 EnvPane看起来像它具有与RCEnvironment相媲美的function,但它似乎可以立即更新其存储的variables,即不需要重新启动或login,这是值得欢迎的。

正如开发者所说:

EnvPane是Mac OS X 10.8(Mountain Lion)的偏好窗格,可让您为graphics和terminal会话中的所有程序设置环境variables。 它不仅可以恢复对Mountain Lion中〜/ .MacOSX / environment.plist的支持,还可以立即发布对环境的更改,而无需注销并重新login。
<SNIP>
EnvPane包括(并自动安装)一个launchd代理,它在login后提前运行1)以及2)〜/ .MacOSX / environment.plist更改时。 代理程序读取〜/ .MacOSX / environment.plist,并通过与launchctl setenv和launchctl unsetenv使用的API相同的API将该文件中的环境variables导出到当前用户的启动实例。

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

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

在Mountain Lion上,所有/etc/paths/etc/launchd.conf编辑都不起任何作用!

苹果的开发者论坛说:

“更改.app本身的Info.plist以包含所需环境variables的”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的LaunchServicesKeys文档 )

在这里输入图像描述

现在的应用程序(在我的情况下SourceTree)使用给定的path,并与GIT 1.9.3 🙂

PS:当然,您必须调整path条目以满足您的特定path需求。

尽pipe这里的答案并不是“错误的”,但我还要补充一点:不要在OS X中影响“所有进程”的环境variables更改,或者甚至在shell之外,对于给定用户以交互方式运行的所有进程。

根据我的经验,对于所有进程的环境variables(如PATH)的全局更改更有可能在OS X上打破Windows上的操作。 原因在于,很多OS X应用程序和其他软件(尤其是OS本身的组件)依赖于UNIX命令行工具,并假定系统提供的这些工具版本的行为,以及这样做时不必使用绝对path(类似的注释适用于dynamic加载的库和DYLD_ *环境variables)。 例如,考虑一下,有关replaceOS X提供的解释器(比如Python和Ruby)版本的各种Stack Overflow问题的评分最高的答案通常会说“不要这样做”。

在这方面,OS X与其他类UNIX操作系统(如Linux,FreeBSD和Solaris)没有什么不同。 苹果不提供简单的方法来做到这一点的最可能的原因是因为它打破了一切 。 在Windows不太容易出现这些问题的情况下,这是由于两个原因:(1)Windows软件不倾向于依赖命令行工具来达到UNIX软件的程度;(2)微软已经如此广泛的“DLL地狱”历史和安全问题,这些问题会影响所有在较新的Windows版本中改变dynamic加载行为的进程,从而限制“全局”configuration选项(如PATH)的影响。

“跛脚”或不,如果你将这种改变限制在较小的范围内,你将会有一个更加稳定的系统。

有时候,以前的所有答案都不起作用。 如果你想在Eclipse或IntelliJ中访问系统variables(如M2_HOME),在这种情况下唯一适用于我的是:

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

简单修改.bash_profile将不起作用,因为在osx中​​,应用程序不像其他UNIX中那样启动,它们不会inheritance父项shellvariables。 所有其他修改将不会为我不知道的原因。 也许别人可以澄清这一点。

在追踪环境variables偏好面板并发现链接被破坏,并且在苹果网站上search似乎表明他们已经忘记了它之后,我开始回到难以捉摸的启动过程。

在我的系统(Mac OS X 10.6.8)上,似乎在environment.plist 定义的variables正在可靠地导出到从Spotlight启动的应用程序(通过launchd)。 我的麻烦是这些variables没有被输出到terminal中的新的bash会话。 即我在这里描述了相反的问题。

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

我可以通过编辑〜/ MacOSX / environment.plist来让Spotlight应用程序看到variables我可以通过将以下内容添加到我的.profile文件中,将相同的variables强制到新的terminal会话中:

 eval $(launchctl export) 

更新(2017-08-04)

至less(至less)macOS 10.12.6(塞拉利昂)这个方法似乎已经停止Apache的httpd(为systemlaunchctl configuser选项)的工作。 其他程序似乎不受影响。 可以想象,这是httpd中的一个bug。

原始答案

这涉及到OS X 10.10+(特别是由于rootless模式,其中/usr/bin不再可写)。

我读过多个地方,使用launchctl setenv PATH <new path>来设置PATHvariables不起作用,因为OS X中的错误(这似乎从个人的经验)。 我发现还有另一种方法可以为不从shell启动的应用程序设置PATH

 sudo launchctl config user path <new path> 

该选项在launchctl手册页中有logging:

configuration系统| 用户参数值

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

[…]

path

将目标域中所有服务的PATH环境variables设置为string值。 string值应符合environ(7)中PATH环境variables的概述格式。 请注意,如果某个服务指定了自己的PATH,则特定于服务的环境variables将优先。

注意:此设施不能用于设置域内所有服务的常规环境variables。 由于安全原因,故意将其范围限定在PATH环境variables中。

我已经确认这与从Finder启动的GUI应用程序(使用getenv获取PATH)一起工作。 请注意,您只需执行一次该操作,并且通过重新启动,更改将保持不变。

就像Matt Curtis给出的答案一样,我通过launchctl设置了环境variables,但是我把它封装在一个名为export的函数中,这样每当我在.bash_profile中导出一个像普通的variables时,它也由launchctl设置。 这是我做的:

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

     source .bashrc 
  2. 我的.bashrc有这个:

     function export() { builtin export "$@" if [[ ${#@} -eq 1 && "${@//[^=]/}" ]] then launchctl setenv "${@%%=*}" "${@#*=}" elif [[ ! "${@//[^ ]/}" ]] then launchctl setenv "${@}" "${!@}" fi } export -f export 
  3. 上面的内容会使Bash内build的“导出”超载,并且会正常导出所有东西(您会注意到我会导出“导出”!),然后通过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 
  4. 这样我就不必每次都发送每个variables来启动launchctl,而且我可以按照自己想要的方式设置我的.bash_profile / .bashrc。 打开一个terminal窗口,使用launchctl getenv myVar检查你感兴趣的环境variables,在你的.bash_profile / .bashrc中改变一些东西,closuresterminal窗口并重新打开它,再次用launchctl和voilá检查这个variables,它改变了。

  5. 再次,像山后狮子世界的其他解决scheme一样,对于应用程序可用的任何新的环境variables,您需要在更改后启动或重新启动它们。

这是一个非常简单的方法来做你想做的事情。 在我的情况下,这是得到gradle工作(对于Android Studio

  • 打开terminal。
  • 运行以下命令:

    sudo nano /etc/paths或者sudo vim /etc/paths

  • 提示时input您的密码。

  • 转到文件底部,然后input您想要添加的path。
  • 打控制-x退出。
  • input“Y”保存修改的缓冲区。
  • 打开一个新的terminal窗口,然后键入:

    echo $PATH

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

我从这个post得到了这些细节:

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

我希望可以帮助别人

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

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

这里你去:

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

To be concise and clear about what each file is intended for

  • ~/.profile is sourced every time Terminal.app is launched
  • ~/.bashrc is where "traditionally" all the export statements for Bash environment are set
  • /etc/paths is the main file in Mac OS that contains the list of default paths for building the PATH environment variable for all users
  • /etc/paths.d/ contains files that hold additional search paths

Non-terminal programs don't inherit the system wide PATH and MANPATH variables that your terminal does! To set environment for all processes launched by a specific user, thus making environment variables available to Mac OS X GUI applications, those variables must be defined in your ~/.MacOSX/environment.plist (Apple Technical Q&A QA1067)

Use the following command line to synchronize your environment.plist with /etc/paths :

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

the $PATH variable is also subject to path_helper , which in turn makes use of the /etc/paths file and files in /etc/paths.d .

A more thorough description can be found here: http://hea-www.harvard.edu/~fine/OSX/path_helper.html

for a single user modification, use ~/.profile of the ones you listed, the following link explains when the different files are read by bash

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

if you want to set the environment variable for gui applications you need the ~/.MacOSX/environment.plist file

在Mac OS上设置PATH环境variables

打开terminal程序(默认情况下在你的Applications / Utilites文件夹中)。 Run the following command touch ~/.bash_profile; open ~/.bash_profile This will open the file in the your default text editor.

以ANDROID SDK为例:

您需要将path添加到您的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 

现在每次打开terminal程序,PATH都会包含Android SDK。

这很简单:

Edit ~/.profile and put your variables as follow

$ vim ~/.profile

In file put:

MY_ENV_VAR=value

  1. Save ( :wq )

  2. Restart the terminal (Quit and open it again)

  3. Make sure that`s all be fine:

$ echo $MY_ENV_VAR

$ value


well, I'm unsure about /etc/paths and ~/.MacOSX/environment.plist those are new.

But with bash, you should know that .bashrc is executed with every new shell invocation and .bash_profile is only executed once at startup. Don't know how often this is with macos, I think the distinction has broken down with the window system launching everything.

Personally, I eliminate the confusion by creating a .bashrc with everything I need and then do:

 ln -s .bashrc .bash_profile 

One thing to note in addition to the approaches suggested is that, in OS X 10.5 at least, the variables set in launchd.conf will be merged with the settings made in .profile. I suppose this is likely to be valid for the settings in ~/.MacOSX/environment.plist too, but I haven't verified.

There are two type of shells at play here.

  • Non-Login: .bashrc is reloaded every time you start a new copy of bash
  • Login: The .profile is loaded only when you either login, or explicitly tell bash to load it and use it as a login shell.

Its important to understand here that with bash .bashrc is only read by a shell that's both interactive and non-login, and you will find that people often load .bashrc in .bash_profile to overcome this limitation.

Now that you have the basic understanding, lets move on to how i would advice you to set it up.

  • .profile: create it non-existing. Put your PATH setup in there.
  • .bashrc: create if non-existing. Put all your Aliases and Custom method in there.
  • .bash_profile: create if non-existing. Put the following in there.

.bash_file:

 #!/bin/bash source ~/.profile # Get the PATH settings source ~/.bashrc # Get Aliases and Functions # 

Login Shells

 /etc/profile 

The shell first executes the commands in /etc/profile. A user working with root privileges can set up this file to establish systemwide default characteristics for users running bash.

 .bash_profile .bash_login .profile 

Next the shell looks for ~/.bash_profile, ~/.bash_login, and ~/.profile (~/ is short- hand for your home directory), in that order, executing the commands in the first of these files it finds. You can put commands in one of these files to override the defaults set in /etc/profile. A shell running on a virtual terminal does not execute commands in these files.

 .bash_logout 

When you log out, bash executes commands in the ~/.bash_logout file. This file often holds commands that clean up after a session, such as those that remove temporary files.

Interactive Nonlogin Shells

 /etc/bashrc 

Although not called by bash directly, many ~/.bashrc files call /etc/bashrc. This setup allows a user working with root privileges to establish systemwide default characteristics for nonlogin bash shells.

 .bashrc 

An interactive nonlogin shell executes commands in the ~/.bashrc file. Typically a startup file for a login shell, such as .bash_profile, runs this file, so both login and nonlogin shells run the commands in .bashrc.

Because commands in .bashrc may be executed many times, and because subshells inherit exported variables, it is a good idea to put commands that add to existing variables in the .bash_profile file.

For Bash, try adding your environment variables to the file /etc/profile to make them available for all users. No need to reboot, just start a new Terminal session.

It's quite simple, edit .profile (vi, nano, sublimeText or other text editor) file, you can found it at ~/ directory (user directory) and set like this :

export MY_VAR=[your value here]

exemple with java home :

export JAVA_HOME=/Library/Java/JavaVirtualMachines/current

save it and return to the terminal.

You can reload it with :

source .profile or close / open your terminal window.

Just did this really easy and quick. First create a ~/.bash_profile from terminal:

 touch .bash_profile 

然后

 open -a TextEdit.app .bash_profile 

 export TOMCAT_HOME=/Library/Tomcat/Home 

save documement and you are done.