在OS X中修改PATH等环境变量的正确方法是什么?
我在Google上看了一下,发现了三个不同的文件要编辑:
-
/ etc / paths
-
~ / .profile
-
~ / .tcshrc
我不确定.tcshrc是错误的,因为OS X现在使用bash . 这些变量,尤其是PATH,在哪里定义?
我正在跑OS X v10.5(豹) .
在OS X中修改PATH等环境变量的正确方法是什么?
我在Google上看了一下,发现了三个不同的文件要编辑:
/ etc / paths
~ / .profile
~ / .tcshrc
我不确定.tcshrc是错误的,因为OS X现在使用bash . 这些变量,尤其是PATH,在哪里定义?
我正在跑OS X v10.5(豹) .
30 回答
在追逐Environment Variables preference pane并发现链接被破坏并且苹果's site seems to indicate they'上的搜索被遗忘之后......我开始回到难以捉摸的启动过程的轨迹上 .
在我的系统(Mac OS X 10.6.8)上,似乎environment.plist中定义的变量可靠地导出到从Spotlight启动的应用程序(通过launchd) . 我的麻烦是这些变量没有被导出到终端中的新bash会话 . 即我有与此处描述的相反的问题 .
注意:environment.plist看起来像JSON,而不是XML,如前所述
我能够通过editing ~/MacOSX/environment.plist and 获得Spotlight应用程序以查看变量我通过将以下内容添加到我的.profile文件中,可以将相同的变量强制转换为新的终端会话:
这很简单:
编辑〜/ .profile并将变量放在下面
在文件中:
保存(:wq)
重新启动终端(退出并再次打开)
确保一切正常:
除了建议的方法之外,还有一点需要注意的是,至少在OS X 10.5(Leopard)中,
launchd.conf
中设置的变量将与.profile
中的设置合并 . 我想这也可能对~/.MacOSX/environment.plist
中的设置有效,但我还没有验证 .来自单一来源的命令行和GUI应用程序解决方案(适用于Yosemite和El Capitan)
假设您有环境变量定义在您的
~/.bash_profile
中,如下面的代码段:我们需要一个启动代理,它将在每次登录时随时随地运行,并将这些变量加载到用户会话 . 我们还需要一个shell脚本来解析这些定义并构建由代理执行的必要命令 .
在
~/Library/LaunchAgents/
目录中创建一个带有plist
后缀(例如,名为osx-env-sync.plist
)的文件,其中包含以下内容:-l
参数在这里至关重要;使用 login shell 执行shell脚本是必要的,以便在执行此脚本之前首先获取~/.bash_profile
.现在,shell脚本 . 使用以下内容在
~/.osx-env-sync.sh
创建它:确保shell脚本是可执行的:
现在,加载当前会话的启动代理:
(重新)启动GUI应用程序并验证它是否可以读取环境变量 .
设置是持久的 . 它将在重新启动和重新运行后继续存在 .
在初始设置之后(您刚刚进行了设置),如果您希望再次将
~/.bash_profile
中的任何更改反映到整个环境中,请重新运行launchctl load ...
命令赢得't perform what you want; instead you' ll会收到如下警告:<$HOME>/Library/LaunchAgents/osx-env-sync.plist: Operation already in progress
要在不经过注销/登录过程的情况下重新加载环境变量,请执行以下操作:
最后确保重新启动已经运行的应用程序(包括Terminal.app),以使他们了解更改 .
我还将代码和解释推送到GitHub项目:osx-env-sync .
我希望这将是最终解决方案,至少对于最新版本的OS X(Yosemite和El Capitan)而言 .
这很简单,编辑.profile(vi,nano,sublimeText或其他文本编辑器)文件,你可以在〜/ directory(用户目录)找到它并设置如下:
export MY_VAR=[your value here]
例如java home:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/current
保存并返回终端 .
您可以使用以下命令重新加载:
source .profile
或关闭/打开终端窗口 .有时,以前的所有答案都不起作用 . 如果你想在Eclipse或IntelliJ IDEA中访问系统变量(如
M2_HOME
),在这种情况下,对我来说唯一有用的是:首先(步骤1)编辑
/etc/launchd.conf
以包含如下所示的行:"setenv VAR value"然后(步骤2)重新启动 .简单地修改.bash_profile是行不通的,因为在OS X中应用程序不像其他Unix那样启动;它们不会继承父级的shell变量 . 所有其他修改都不适用于我不知道的原因 . 也许其他人可以澄清这一点 .
虽然这里的答案并非“错误”,但我将添加另一个:永远不要在OS X中对环境变量进行更改,这些更改会影响“所有进程”,甚至在shell外部,对于给定用户以交互方式运行的所有进程 .
根据我的经验,对于所有进程的环境变量(如PATH)的全局更改甚至更可能破坏OS X而不是Windows . 原因是,许多OS X应用程序和其他软件(包括,特别是OS本身的组件)依赖于UNIX命令行工具,并假设系统提供的这些工具的版本行为,以及这样做时不一定使用绝对路径(类似的注释适用于动态加载的库和DYLD_ *环境变量) . 例如,考虑一下有关替换OS X提供的解释器版本(如Python和Ruby)的各种Stack Overflow问题的最高评级答案通常会说“不要这样做” .
在这方面,OS X与其他类UNIX操作系统(例如Linux,FreeBSD和Solaris)没有什么不同;苹果公司没有提供简单方法的最可能原因是因为它打破了局面 . 由于以下两点原因导致Windows失败:(1)Windows软件没有改变新版Windows动态加载的行为,以限制"global"配置选项(如PATH)的影响 .
“Lame”与否,如果将此类更改限制在较小的范围内,您将拥有一个更稳定的系统 .
在Mountain Lion上所有的
/etc/paths
和/etc/launchd.conf
编辑都没有任何效果!Apple的开发者论坛说:
所以我直接编辑了应用程序
Info.plist
(右键单击"AppName.app"(在本例中为SourceTree),然后“Show package contents
”)并添加了一个名为的新键/ dict对:
(见:LaunchServicesKeys Documentation at Apple)
现在App(在我的情况下是SourceTree)使用给定的路径并使用git 1.9.3 :-)
PS:当然,您必须根据特定路径需求调整Path条目 .
这样做非常简单快捷 . 首先从终端创建 ~/.bash_profile :
然后
加
保存文件,你就完成了 .
对于Bash,请尝试将环境变量添加到文件
/etc/profile
,以使其可供所有用户使用 . 无需重启,只需启动新的终端会话即可 .简明扼要地说明每个文件的用途
每次启动Terminal.app时都会获取
~/.profile
~/.bashrc
是"traditionally"设置了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
同步:就像Matt Curtis给出的答案一样,我通过launchctl设置环境变量,但是我将它包装在一个名为export的函数中,这样每当我在.bash_profile中导出一个像normal一样的变量时,它也会被launchctl设置 . 这是我做的:
这样我就不会对
launchctl getenv myVar
感兴趣,更改.bash_profile / .bashrc中的内容,关闭终端窗口并重新打开它,再次使用launchctl检查变量,然后改变它 .同样,与后山狮世界的其他解决方案一样,对于可用于应用的任何新环境变量,您需要在更改后启动或重新启动它们 .
布鲁诺正好走上正轨 . 我做了大量的研究,如果你想设置所有GUI应用程序中可用的变量,你唯一的选择是
/etc/launchd.conf
.请注意environment.plist does not work for applications launched via Spotlight. This is documented by Steve Sexton here .
打开终端提示
键入
sudo vi /etc/launchd.conf
(注意:此文件可能尚不存在)将以下内容放入文件中
在vi中保存更改并重新启动Mac . 或者使用上面代码注释中显示的grep / xargs命令 .
通过打开终端窗口并键入
export
来证明您的变量正常工作,您应该看到新的变量 . 这些也可以在您通过Spotlight启动的IntelliJ IDEA和其他GUI应用程序中使用 .IOS上的所有Magic只能使用
source
与文件一起导出ENV-Variables .For Example:
您可以像这样创建一个文件:
将此文件另存为
bimbom.env
,然后执行source ./bimbom.ev
Voilá,即可获得ENV-Variables .检查它们:
echo $bim
在Mac OS上设置PATH环境变量
打开终端程序(默认位于Applications / Utilites文件夹中) . 执行以下命令touch~ / .bash_profile; open~ / .bash_profile这将在您的默认文本编辑器中打开该文件 .
For ANDROID SDK as example :
您需要添加Android SDK平台工具和工具目录的路径 . 在我的示例中,我将使用“/ Development / android-sdk-macosx”作为安装SDK的目录 . 添加以下行:
保存文件并退出文本编辑器 . 执行.bash_profile以更新PATH .
现在每次打开终端程序时,PATH都会包含Android SDK .
对于单个用户修改,请使用列出的
~/.profile
. 以下链接说明了Bash读取不同文件的时间 .http://telin.ugent.be/~slippens/drupal/bashrc_and_others
如果要为gui应用程序设置环境变量,则需要〜/ .MacOSX / environment.plist文件
Up to and including OS X v10.7 (Lion) 您可以将它们设置为:
看到:
https://developer.apple.com/legacy/library/qa/qa1067/_index.html
https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPRuntimeConfig/Articles/EnvironmentVars.html
对于终端中的PATH,您应该能够在
.bash_profile
或.profile
中设置(您可能必须创建它)For OS X v10.8 (Mountain Lion) and beyond you need to use launchd and launchctl .
另一个免费的开源Mac OSX Mountain Lion(10.8)首选项窗格/ environment.plist解决方案是EnvPane .
EnvPane的source code可在Github上找到 . EnvPane看起来具有与RCEnvironment类似的功能,但是,似乎它可以立即更新其存储的变量,即无需重启或登录,这是受欢迎的 .
正如开发人员所说:
免责声明:我与开发人员或他/她的项目没有任何关系 .
附:我喜欢这个名字(听起来像'Ends Pain') .
好吧,我不确定
/etc/paths
和~/.MacOSX/environment.plist
文件 . 那是新的 .但是对于Bash,你应该知道
.bashrc
是在每次新的shell调用时执行的,.bash_profile
只在启动时执行一次 .我不知道Mac OS X的频率是多少 . 我认为这种区别已经打破了窗口系统启动一切 .
就个人而言,我通过创建一个包含我需要的所有内容的
.bashrc
文件来消除混淆,然后执行:更新(2017-08-04)
截至(至少)macOS 10.12.6(Sierra),此方法似乎已停止为Apache httpd工作(对于
launchctl config
的system
和user
选项) . 其他程序似乎没有受到影响 . 可以想象这是httpd中的一个错误 .原始答案
这涉及OS X 10.10(10.11特别是由于无根模式,其中
/usr/bin
不再可写) .我已经在多个地方读过,使用
launchctl setenv PATH <new path>
设置PATH
变量因OS X中的错误而无效(从个人经验来看似乎是真的) . 我发现还有另一种方法可以为未从shell启动的应用程序设置PATH
:launchctl手册页中记录了此选项:
我已经确认这可以使用从Finder启动的GUI应用程序(使用
getenv
来获取PATH) . 请注意,您只需执行一次此操作,并且更改将在重新启动后保持不变 .Login Shells
shell首先执行/ etc / profile中的命令 . 使用root权限的用户可以设置此文件,以便为运行bash的用户 Build 系统范围的默认特征 .
接下来,shell按顺序查找〜/ .bash_profile,〜/ .bash_login和〜/ .profile(〜/是您的主目录的简写),执行它找到的第一个文件中的命令 . 您可以将命令放在其中一个文件中,以覆盖/ etc / profile中设置的默认值 . 在虚拟终端上运行的shell不会在这些文件中执行命令 .
当您注销时,bash会执行〜/ .bash_logout文件中的命令 . 此文件通常包含在会话后清理的命令,例如删除临时文件的命令 .
Interactive Nonlogin Shells
虽然没有直接调用bash,但很多〜/ .bashrc文件调用/ etc / bashrc . 此设置允许使用root权限的用户为非登录bash shell Build 系统范围的默认特征 .
交互式非登录shell在〜/ .bashrc文件中执行命令 . 通常,登录shell的启动文件(例如.bash_profile)运行此文件,因此login和nonlogin shell都运行.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.
$PATH
变量也受path_helper
的约束,后者又使用/etc/paths
中的/etc/paths
文件和文件 .可以在此处找到更全面的描述:http://hea-www.harvard.edu/~fine/OSX/path_helper.html
1 .
该文件可能不存在(如果没有,您可以创建它) .
2.在此输入并保存文件:
3.run
/etc/launchd.conf未在Yosemite,El Capitain或(High)Sierra中使用
从
launchctl
手册页:此Ask Different answer中描述的方法适用于我(重启后):从Dock或Spotlight启动的应用程序继承了我在
~/Library/LaunchAgents/my.startup.plist
中设置的环境变量 . (就我而言,我需要将LANG
设置为en_US.UTF-8
,以获取Sublime Text插件 . )在OS X中处理环境变量时,基本上有两个问题需要解决 . 第一个是从Spotlight调用程序(Mac菜单/状态栏右侧的放大镜图标),第二个是从Dock调用程序时 . 从终端应用程序/实用程序调用程序是微不足道的,因为它从标准shell位置读取环境(
~/.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
Emacs lisp函数:
~/lib/emacs/elisp/macosx/envionment-support.el
注意:这个解决方案是我加入我之前的混合物,特别是Matt Curtis提供的那些,但我故意试图保持我的
~/.bash_profile
内容平台独立,并将launchd
环境(仅限Mac设施)的设置放入单独的脚本 .任何Bash启动文件 -
~/.bashrc
,~/.bash_profile
,~/.profile
. 对于GUI应用程序中的环境变量,还有一些名为~/.MacOSX/environment.plist
的奇怪文件 .如何为Spotlight启动的新进程设置环境(无需重启)
您可以使用
launchctl setenv
设置launchd(以及扩展名,从Spotlight开始的任何内容)使用的环境 . 例如,设置路径:或者,如果要在
.bashrc
或类似的路径中设置路径,请将其镜像到launchd中:There's no need to reboot 虽然您需要重新启动应用程序,如果您希望它能够获取更改的环境 .
这包括已经在Terminal.app下运行的所有shell,但如果你在那里,你可以更直接地设置环境,例如用
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
表示bash或zsh .重启后如何保持更改
要 keep changes after a reboot ,您可以从
/etc/launchd.conf
设置环境变量,如下所示:重启时会自动执行
launchd.conf
.如果您希望这些更改现在生效,您应该使用此命令重新处理
launchctl.conf
(感谢@mklement提示!)您可以通过命令
man launchctl
找到有关launchctl
以及如何加载launchd.conf
的更多信息 .这是一个非常简单的方法来做你想要的 . 在我的情况下,它正在
gradle
工作(Android Studio
)打开终端 .
运行以下命令:
sudo nano /etc/paths
或sudo vim /etc/paths
出现提示时输入您的密码 .
转到文件底部,然后输入要添加的路径 .
点击control-x退出 .
输入'Y'至保存修改后的缓冲区 .
打开一个新的终端窗口然后键入:
echo $PATH
您应该看到新路径附加到PATH的末尾
我从这篇文章中得到了这些细节:
http://architectryan.com/2012/10/02/add-to-the-path-on-mac-os-x-mountain-lion/#.UkED3rxPp3Q
我希望能帮助别人
我认为OP正在寻找一种简单的,类似Windows的解决方案 .
干得好:
http://www.apple.com/downloads/macosx/system_disk_utilities/environmentvariablepreferencepane.html
这里有两种类型的贝壳 .
非登录:每次启动bash的新副本时都会重新加载.bashrc
登录:.profile仅在您登录时加载,或者明确告诉bash加载它并将其用作登录shell .
重要的是要理解,使用bash .bashrc只能由一个既可以进行交互也可以进行非登录的shell读取,你会发现人们经常在.bash_profile中加载.bashrc来克服这个限制 .
既然您已经掌握了基本知识,那么我们将继续讨论如何建议您进行设置 .
.profile:创建它不存在 . 将PATH设置放在那里 .
.bashrc:如果不存在则创建 . 将所有别名和自定义方法放在那里 .
.bash_profile:如果不存在则创建 . 把以下内容放在那里 .
.bash_file: