Setting environment variables on OS X
在OS X中修改环境变量(如path)的正确方法是什么?
我看了一下谷歌,发现有三个不同的文件需要编辑:
- /ETC/PATH
- ~/轮廓
- ~/.TCHSCRC
我甚至没有这些文件中的一些,而且我很确定.tcshrc是错误的,因为OS ;X现在使用bash。这些变量,特别是路径,是在哪里定义的?
我正在运行OS X V10.5(Leopard)。
布鲁诺是一个正确的轨道。我已经做了广泛的研究,如果你想设置的变量是可用在所有的GUI应用程序,你是一只
请注意,如果应用程序不工作environment.plist聚光灯发射的轨道。这是Steve Sexton)在诊断。
提示开放式终端
(请注意:本文件
把以下内容的文件的类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | # 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 |
保存你的VI和重新启动你的Mac的时空动态变化进行了研究。或使用,这是一
你正在证明一个变量终端通过开窗口和分型,你应该看到你的新
如何为Spotlight启动的新进程设置环境(无需重新启动)
您可以使用
1 | launchctl setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin |
或者,如果要在
1 2 | PATH=/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin launchctl setenv PATH $PATH |
不需要重新启动,但如果您希望应用程序恢复已更改的环境,则需要重新启动应用程序。
这包括已经在terminal.app下运行的任何shell,但是如果您在那里,您可以更直接地设置环境,例如使用
要在重新启动后保留更改,可以从
1 | setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin |
当您重新启动时,将自动执行
如果希望这些更改现在生效,则应使用此命令重新处理
1 | egrep -v '^\s*#' /etc/launchd.conf | launchctl |
您可以了解更多关于
到X和包括 ; ;Lion(狮子):你可以设置他们在
1 | ~/.MacOSX/environment.plist |
国有企业:
- https://"/图书馆/免费/ / / _ index.html qa1067 QA
- http://免费/图书馆/内容/文件下载/ / / / / environmentvars.html bpruntimeconfig用品概念
如果在终端的路径,你应该能够设置在
X的 ; ;Mountain Lion(狮子山)和超越,你需要使用
单一来源的命令行和GUI应用程序解决方案(与Yosemite&el Capitan合作)
假设您的
1 2 3 4 5 | 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" |
我们需要一个启动代理,它将在每次登录时运行,并随时根据需要将这些变量加载到用户会话中。我们还需要一个shell脚本来解析这些定义,并构建代理要执行的必要命令。
在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?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> <string>bash</string> <string>-l</string> <string>-c</string> <string> $HOME/.osx-env-sync.sh </string> </array> <key>RunAtLoad</key> <true/> </dict> </plist> |
现在是shell脚本。在
1 2 3 | grep export $HOME/.bash_profile | while IFS=' =' read ignoreexport envvar ignorevalue; do launchctl setenv ${envvar} ${!envvar} done |
确保shell脚本是可执行的:
1 | chmod +x ~/.osx-env-sync.sh |
现在,为当前会话加载启动代理:
1 | launchctl load ~/Library/LaunchAgents/osx-env-sync.plist |
(re)启动一个GUI应用程序并验证它是否可以读取环境变量。
设置是持久的。它将在重启和重新启动后继续存在。
在初始设置之后(您刚才做的),如果您想再次反映您的
为了在不经过注销/登录过程的情况下重新加载环境变量,请执行以下操作:
1 2 | launchctl unload ~/Library/LaunchAgents/osx-env-sync.plist launchctl load ~/Library/LaunchAgents/osx-env-sync.plist |
最后,确保重新启动已经运行的应用程序(包括terminal.app),让它们知道这些更改。
我还将代码和解释推送到了一个github项目:osx env sync。
我希望这将是最终的解决方案,至少对于最新版本的OSX(Yosemite&el Capitan)。
1。
1 | vim ~/.bash_profile |
文件可能不存在(如果不存在,您可以创建它)。
2.输入并保存文件:
1 | export PATH=$PATH:YOUR_PATH_HERE |
3.运行
1 | source ~/.bash_profile |
在处理时,基本上有两个问题需要解决OS X中的环境变量。第一个是在调用程序时从聚光灯(Mac右侧的放大镜图标菜单/状态栏)以及从Dock调用程序时的第二个。从终端应用程序/实用程序调用程序很简单因为它从标准shell位置读取环境(
从Dock调用程序时,使用
从Spotlight调用程序时,请确保已启动使用所需的所有键/值设置进行设置。
为了同时解决这两个问题,我使用一个登录项(通过系统首选项工具)。登录项是一个bash脚本,调用EmacsLisp函数,尽管当然可以使用它们最喜欢的脚本工具来完成同样的事情。这种方法它在任何时候都可以工作并且不需要重新启动,即可以编辑
细节:
登录项目:
1 2 | #!/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函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | ;;; 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> ")) (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> ") (insert" <string>" value"</string> ") ;; Enable this variable in launchd (setq command (format"launchctl setenv %s "%s"" key value)) (shell-command command)) ;; Save the buffer. (save-buffer))) |
注意:这个解决方案是在我添加我的解决方案之前,特别是Matt Curtis提供的解决方案的集合,但是我故意尝试保持我的
另一个免费的开源Mac OSX Mountain Lion(10.8)首选项窗格/environment.plist解决方案是envpane。
在GitHub上提供envPane的源代码。envpane看起来像具有与rcenvironment类似的功能,但是,它似乎可以立即更新其存储变量,也就是说,不需要重新启动或登录,这是受欢迎的。
如开发商所述:
EnvPane is a preference pane for Mac OS X 10.8 (Mountain Lion) that
lets you set environment variables for all programs in both graphical
and terminal sessions. Not only does it restore support for
~/.MacOSX/environment.plist in Mountain Lion, it also publishes your
changes to the environment immediately, without the need to log out
and back in.
EnvPane includes (and automatically installs) a
launchd agent that runs 1) early after login and 2) whenever the
~/.MacOSX/environment.plist changes. The agent reads
~/.MacOSX/environment.plist and exports the environment variables from
that file to the current user's launchd instance via the same API that
is used by launchctl setenv and launchctl unsetenv.
免责声明:我与开发人员或他/她的项目没有任何关系。
P.S.我喜欢这个名字(听起来像"结束痛苦")。
山上的狮子,
苹果公司的开发forums说: </P >
"Change the Info.plist of the .app itself to contain an"LSEnvironment"
dictionary with the environment variables you want.~/.MacOSX/environment.plist is no longer supported."
所以我直接到编辑的"应用程序"页
</P >
一个新的和附加的键/词典对被称为: </P >
1 2 3 4 5 | <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> |
(七:launchserviceskeys文件在苹果(Apple) </P >
</P >
现在的应用程序(在我的案例sourcetree)使用在给定的路径和厂(NEA)的分述: </P >
PS:当然你要调整的路径进入你的特异性路径的需要。 </P >
虽然这里的答案不是"错误的",但我还要补充一点:对于给定用户交互运行的所有进程,不要在OS X中进行影响"所有进程"的环境变量更改,甚至在shell外部也不要对其进行更改。
根据我的经验,对环境变量(如所有进程的路径)的全局更改甚至比在Windows上更可能破坏OS X上的内容。原因是,许多OS X应用程序和其他软件(尤其是操作系统本身的组件)都依赖于引擎盖下的Unix命令行工具,并假定这些工具的版本与系统一起提供,这样做时不必使用绝对路径(类似的注释适用于动态加载的库和dyld_x环境变量)。例如,考虑一下,对于各种关于替换OSX提供的解释程序版本(如python和ruby)的堆栈溢出问题,最高级别的答案通常会说"不要这样做"。
在这方面,OS X与其他类似Unix的操作系统(如Linux、Freebsd和Solaris)没有什么不同;苹果之所以没有提供一种简单的方法来实现这一点,最可能的原因是它破坏了一切。从某种程度上说,Windows不太容易出现这些问题,这是由于以下两个原因:(1)Windows软件不像Unix软件那样依赖命令行工具;(2)Microsoft对"dll hell"和影响所有进程的安全问题有着如此广泛的历史记录,它们已经改变了在较新的Windows版本中动态加载的行为,以限制"全局"配置选项(如路径)的影响。
"跛脚"或不是,如果你把这种变化限制在更小的范围内,你将有一个更稳定的系统。
有时所有的先前的回答就是不工作。如果你想有一个访问系统变量(如
第一(步骤1)到地图的编辑
简单的修改.bash _轮廓不会工作,因为在他们的应用中的 ;X是不是在其他的UNIX入门的了;他们不继承父’s的shell变量。所有其他的修改将不会为工作的原因是未知的我。也许别人可以澄清关于这个。
更新(2017-08-04)
从(至少)MacOS 10.12.6(Sierra)开始,这种方法似乎已经停止适用于Apache HTTPD(对于
这涉及到OS X 10.10+(10.11+,特别是由于
我在很多地方读到,使用
1 | sudo launchctl config user path <new path> |
此选项记录在launchctl手册页中:
config system | user parameter value
Sets persistent configuration information for launchd(8) domains. Only the system domain and user domains may be configured. The location of the persistent storage is an
implementation detail, and changes to that storage should only be made through this subcommand. A reboot is required for changes made through this subcommand to take effect.[...]
path
Sets the PATH environment variable for all services within the target domain to the string value. The string value should conform to the format outlined for the
PATH environment variable in environ(7). Note that if a service specifies its own PATH, the service-specific environment variable will take precedence.NOTE: This facility cannot be used to set general environment variables for all services within the domain. It is intentionally scoped to the PATH environment vari-
able and nothing else for security reasons.< /块引用>< /块引用>
我已经确认这与一个从finder开始的GUI应用程序(它使用
getenv 来获取路径)一起工作。请注意,您只需要这样做一次,并且更改将通过重新启动而持久。在搜索完环境变量首选项窗格并发现链接被破坏后,在苹果网站上搜索似乎表明他们已经忘记了它…我又回到了难以捉摸的发射过程。
在我的系统(Mac OS X 10.6.8)上,environment.plist中定义的变量似乎被可靠地导出到从spotlight(通过launchd)启动的应用程序中。我的问题是这些var没有被导出到终端中的新bash会话。也就是说,我有与这里描述的相反的问题。
注意:environment.plist看起来像JSON,而不是XML,如前所述。
通过编辑~/macosx/environment.plist和通过将以下内容添加到.profile文件中,我可以将相同的var强制到新的终端会话中:
1 eval $(launchctl export)
这是一个非常简单的方式来做什么是你想要的。在我的情况下,它被越来越
gradle 工作(Android Studio ) </P >
- 开放的终端。
运行下面的命令: </P >
sudo nano /etc/paths 或sudo vim /etc/paths </P >输入你的密码,当prompted。。。。。。。 </P >
- 去"的文件,和回车键的路径添加到你的愿望。
- HIT Control-X退出"。
- 回车键"Y"保存到改性后的缓冲区。
一种新的开放型:当时的终端窗口 </P >
echo $PATH </P >
你应该看到新的路径appended到终点的路径 </P >
是的,我有这些细节,从这个帖子: </P >
http:/ / / / architectryan.com 2012年2月10日添加到该路径是Mac OS X狮子山/ # .uked3rxpp3q </P >
我希望这可以帮助其他的人 </P >
多样的答案马特柯蒂斯送,设定环境变量,通过launchctl,但我的包在一个函数被称为口,所以,只要我一口可变类平均在我的.bash _轮廓,它是由launchctl集也。这里是我是什么做的: </P >
我的.bash _简介主要由solely一行,(这是我个人的偏好。) </P >
1 source .bashrc我的.bashrc有这样的: </P >
1
2
3
4
5
6
7
8
9
10
11
12
13 function export()
{
builtin export"$@"
if [[ ${#@} -eq 1 &&"${@//[^=]/}" ]]
then
launchctl setenv"${@%%=*}""${@#*=}"
elif [[ !"${@//[^ ]/}" ]]
then
launchctl setenv"${@}""${!@}"
fi
}
export -f export在以上的bash会超负荷的内建的"口"和"一切将口normally(你会通知我"口口"与它!)然后,他们用恰当的集OS X的应用程序环境,通过launchctl,无论你使用的任何部下面的: </P >
1
2
3
4
5
6
7
8
9
10
11 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这段路,我没有对每一个变量launchctl发送到每一次,我可以要我的.bash _简介/ .bashrc弹出式的方式,我想。开放的一个终端窗口,检查出你的环境变量y-o-u-r-e interested在与
launchctl getenv myVar ,变化的东西在你的.bash _简介/ .bashrc的终端窗口,关闭和重新打开它,再次检查该变量与launchctl,瞧,它的改变了。 </P >又来了,像其他的解决方案的后山狮子的世界,任何新的环境变量的方法是可用的应用程序,你需要的发射或特写:它们在变化。 </P >
在bash启动任何文件
~/.bashrc ~/.bash_profile ~/.profile ——,,。。。。。。。也有一些奇怪的文件排序(《~/.MacOSX/environment.plist 环境变量在图形用户界面(GUI)的应用程序。我认为OP正在寻找一个简单的、类似Windows的解决方案。
干得好:
http://www.apple.com/downloads/macosx/system_disk_utilities/environmentvariablepreferencepane.html
简洁明了地说明每个文件的用途
- 每次启动terminal.app时,都会获取
~/.profile 。~/.bashrc 是"传统"设置bash环境的所有导出语句的地方。/etc/paths 是Mac OS中的主文件,其中包含为所有用户构建路径环境变量的默认路径列表。/etc/paths.d/ 包含包含附加搜索路径的文件非终端程序不会继承终端所继承的系统范围的路径和manpath变量!要为特定用户启动的所有进程设置环境,从而使环境变量可用于Mac OS X GUI应用程序,这些变量必须在您的
~/.MacOSX/environment.plist 中定义(Apple Technical Q&A QA1067)使用以下命令行将您的
environment.plist 与/etc/paths 同步:
1
2 defaults write $HOME/.MacOSX/environment PATH"$(tr '
' ':' </etc/paths)"
$PATH 变量也受path_helper 的约束,后者利用/etc/paths 文件和/etc/paths.d 中的文件。更详细的描述可以在这里找到:http://hea-www.harvard.edu/~fine/osx/path_helper.html
/etc/launchd.conf不用于约塞米蒂、埃尔卡皮坦或(高)塞拉。从
launchctl 手册页:
1
2 /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 中设置的环境变量。(在我的例子中,我需要将LANG 设置为en_US.UTF-8 ,以获得一个出色的文本插件。)
这是简单的: </P >
"编辑"/ .profile和把你的变量为后续的 </P >
$ vim ~/.profile
在把文件: </P >
MY_ENV_VAR=value
保存(WQ) </P >
重新对终端(退出和打开它了) </P >
让我相信这是所有被罚款: </P >
$ echo $MY_ENV_VAR
$ value
设置你的PATH环境变量是Mac OS开放的终端程序(这是在你的应用程序的工具/文件夹的默认值)。 运行下面的命令 触摸~ / .bash _简介;开放~ / .bash _简介 这将打开的文件在你的默认的文本编辑器。 </P >
for Android SDK为实例: </P >
你需要添加的路径,你的Android SDK平台工具和工具的目录。在我的第一个实例将使用"/发展/你的Android SDK的MacOSX",为的是installed SDK目录中。添加下面的行: </P >
1 export PATH=${PATH}:/Development/android-sdk-macosx/platform-tools:/Development/android-sdk-macosx/tools保存文件和退出的文本编辑器。 执行你的.bash _更新你的文件的路径。 </P >
1 source ~/.bash_profile现在你everytime开放的终端程序的路径将包含在你的Android SDK。 </P >
在单用户的使用。
~/.profile 修饰,你上市。下面的链接是在不同的explains文件读通过的狂欢。telin.ugent.be http:/ / / / / _ ~ slippens Drupal和其他被_
如果你想设置你的GUI应用程序的环境变量是需要environment.plist文件.macosx/~/
嗯,我不确定我们的
/etc/paths 和~/.MacOSX/environment.plist 文件。这些都是新的。但你应该知道与狂欢,是执行与每一个新的
.bashrc shell调用在一次执行.bash_profile 和仅仅是一个开始。我不知道这是一个经常与MAC  ; ;(i)的区分。《破晓下所有的窗口系统的发射。
一个人,以消除混乱,
.bashrc 文件创建一个具有所有我需要的,然后:
1 ln -s .bashrc .bash_profile除了建议的方法外,需要注意的一点是,在OS X 10.5(Leopard)中,至少
launchd.conf 中设置的变量将与.profile 中设置的变量合并。我想这对~/.MacOSX/environment.plist 中的设置也可能有效,但我还没有验证。登录外壳
1 /etc/profileshell首先执行/etc/profile中的命令。使用根权限的用户可以设置此文件,以为运行bash的用户建立系统范围的默认特性。
1
2
3 .bash_profile
.bash_login
.profile接下来,shell按顺序查找~/.bash_profile、~/.bash_login和~/.profile(~/是主目录的简写),在找到的第一个文件中执行命令。您可以将命令放在其中一个文件中,以覆盖/etc/profile中设置的默认值。在虚拟终端上运行的shell不执行这些文件中的命令。
1 .bash_logout当您注销时,bash执行~/.bash_注销文件中的命令。此文件通常保存在会话后清理的命令,例如删除临时文件的命令。
交互式非登录shell
1 /etc/bashrc虽然bash没有直接调用,但是许多~/.bashrc文件调用/etc/bashrc。此设置允许使用根权限的用户为非登录bash shell建立系统范围的默认特性。
1 .bashrc交互式非登录shell执行~/.bashrc文件中的命令。通常,登录shell的启动文件(如.bash_profile)运行此文件,因此登录shell和非登录shell都在.bashrc中运行命令。
因为.bashrc中的命令可能会执行很多次,而且由于子shell继承导出的变量,所以最好将添加到.bash_配置文件中现有变量的命令放在.bash_配置文件中。
这里有两种弹壳。
- 非登录:.bashrc每次启动新的bash副本时都会重新加载。
- 登录名:只有当您登录或明确告诉bash加载并将其用作登录shell时,才会加载.profile。
重要的是要理解,在bash.bashrc中,只有交互和非登录的shell才能读取bashrc,并且您会发现人们经常加载.bashrc到.bash_配置文件中来克服这个限制。
既然你已经有了基本的理解,让我们继续讨论我如何建议你设置它。
- .profile:创建不存在的文件。把你的路径设置放进去。
- .bashrc:如果不存在,则创建。把你所有的别名和自定义方法放进去。
- .bash_profile:如果不存在,则创建。把下面的内容放进去。
BasHyFrase:
1
2
3
4 #!/bin/bash
source ~/.profile # Get the PATH settings
source ~/.bashrc # Get Aliases and Functions
#只是做得很简单很快。首先从终端创建~/.bash_配置文件:
1 touch .bash_profile然后
1 open -a TextEdit.app .bash_profile添加
1 export TOMCAT_HOME=/Library/Tomcat/Home保存文档,就完成了。
iOS上的所有魔力都只与在文件中使用
source 结合使用,您可以在其中导出env变量。例如:
您可以创建这样的文件:
1
2 export bim=fooo
export bom=bar将此文件另存为
bimbom.env ,并执行source ./bimbom.ev 。嘿,你得到了你的env变量。请检查:
echo $bim
它的quite无知,编辑.profile(VI,纳米,sublimetext或其它文本编辑器)的文件,你可以发现它在~ /目录(Directory用户和样本集): </P >
export MY_VAR=[your value here] </P >与Java的模具为例: </P >
export JAVA_HOME=/Library/Java/JavaVirtualMachines/current </P >它保存和返回到终端。 </P >
你可以用它reload: </P >
source .profile or关闭/打开你的终端窗口。 </P >对于bash,请尝试将环境变量添加到文件
/etc/profile 中,以使它们对所有用户都可用。无需重新启动,只需启动新的终端会话。