Mac OS X 10.9 - 设置永久环境变量

72
在Mac OS X 10.9中如何设置永久环境变量(即不需要在每次启动新的终端会话时导出)?我找到了一些有关修改我的.bash_profile和.profile的答案,但是这些选项似乎都不能成为永久解决方案-只有临时的解决方案。我要设置的变量是MULE_HOME。我在我的bash配置文件中有以下行:
export MULE_HOME=$(/opt/mule-standalone-3.4.0)

然而,当我启动终端时,我会看到以下行(不确定这是否是正常行为?):

-bash: /opt/mule-standalone-3.4.0: is a directory

执行简单的env命令将返回以下内容:

TERM_PROGRAM=Apple_Terminal
SHELL=/bin/bash
TERM=xterm-256color
TMPDIR=/var/folders/fc/68bqp4jj411gynj5qvwhq6z1shs1fy/T/
Apple_PubSub_Socket_Render=/tmp/launch-xKtkql/Render
TERM_PROGRAM_VERSION=326
TERM_SESSION_ID=E97BFE4B-AF85-4933-B252-0883CC085349
USER=dan
SSH_AUTH_SOCK=/tmp/launch-rEmTWW/Listeners
__CF_USER_TEXT_ENCODING=0x730C85DE:0:0
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
__CHECKFIX1436934=1
PWD=/Users/dan
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home
LANG=en_GB.UTF-8
MULE_HOME=
SHLVL=1
HOME=/Users/dan
LOGNAME=danwiseman
_=/usr/bin/env

为了解决这个问题,我目前每次启动新的终端会话都需要打字输入 export MULE_HOME=/opt/mule-standalone-3.4.0,虽然不是很劳累,但有点不方便。我在这里做错了什么,导致变量只能临时设置?
8个回答

67

这个很容易又快速。首先在终端创建一个~/.bash_profile

touch ~/.bash_profile

那么
open -a TextEdit.app ~/.bash_profile

添加

export TOMCAT_HOME=/Library/Tomcat/Home

在TextEdit中保存文档,您就完成了。


43

去掉$(...)部分,这将尝试执行括号内的命令并将$MULE_HOME设置为它生成的任何内容。在您的情况下,/opt/mule-standalone-3.4.0不是可执行文件,因此您会收到错误信息。

export MULE_HOME=/opt/mule-standalone-3.4.0

使用~/.bash_profile而不是~/.bashrc

编辑:看起来有人认为应该在~/.bash_profile脚本中设置环境变量,而不是在~/.bashrc脚本中。


2
谢谢@trojanfoe,这个方法很有效。为了参考-使用~/.bashrc而不是~/.bash_profile的原因是什么? - danw
6
.bash_profile 仅在登录 shell 时执行,而 .bashrc 在每个新的 shell 实例中执行。 - trojanfoe
1
@fedorqui 我本应该使用"交互式" shell 这个词,不过 bash 也会在 .bash_profile 中的一行中为登录和交互式 shell 执行 .bashrc。所以我选择了"instance"。在大多数 Unix 系统中,只有在登录时(从其他主机通过 ssh 或通过控制台)才会执行登录 shell,但是在 OSX 下 Terminal.app 运行 shell 时也会作为登录 shell。因此,在 OSX 下两个脚本之间没有太大区别。 - trojanfoe
4
通常情况下,环境变量应该放在.bash_profile文件中,因为它们只需要在登录时设置一次。所有子进程都会继承它们的值。在OS X系统中,bash不是初始登录过程的一部分,而且Terminal.app(或其他终端仿真器)进程存在于任何现有的bash会话之外,因此每个新窗口(默认情况下)都将自己视为一个新的登录会话。 - chepner
1
@trojanfoe:OSX没有默认的/.bash_profile文件,因此您不能依赖该行存在(显然,即使最初存在,也不能保证以后会存在)。使用`/.bash_profile是稳健的选择。重点是OSX不会自动为所有交互式bash实例源/.bashrc,而且一些OSX用户可能根本不使用/.bashrc。如果您仍然想推荐使用它,请更新您的答案明确说明先决条件:在~/.bash_profile中存在行[ -f ~/.bashrc ] && . ~/.bashrc`。 - mklement0
显示剩余4条评论

14

MacOS 10.15 Catalina及以上版本

如果任何使用MacOS 10.15(Catalina)及以上版本的人来到这里,需要使用.zshenv文件代替.bash_profile文件。这是因为自Catalina以来,默认终端使用zhs而不是bash。

以下是永久导出路径的方法:

  1. 创建.zshenv文件:

touch ~/.zshenv

  1. 接下来,使用以下命令打开它:

open -a TextEdit.app ~/.zshenv

  1. 按照以下格式输入你想要导出的内容:

export NAME=path 例如:export PICO_SDK_PATH=/Users/[redacted]/Developer/pico-sdk


4

或者,如果你想让图形应用程序看到你的环境变量,也可以将以下命令添加到你的 .bash_profile 中。在Mac OS X中,图形应用程序不会继承你的 .bash_profile 配置:

launchctl setenv MYPATH myvar

4
似乎苹果一直在改变如何做到这一点。而且这全部取决于上下文。一个方法不一定在另一个方法有效时也有效。我需要它在IDE中起作用,这里提到的两个bash文件(Linux风格)都没有做到这一点。GUI应用程序永久地遵循这种方式的当前方法与Windows和Linux相比非常复杂!
简而言之,你需要将一大堆丑陋的XML写入plist文件中以运行一些bash。这进入你的“启动代理”目录,即〜/Library/LaunchAgents/my.startup.plist。以下是关于此主题的另一个Stack Exchange线程: https://apple.stackexchange.com/questions/106355/setting-the-system-wide-path-environment-variable-in-mavericks 这给了你一个完整的复制和粘贴,你可以调整它来设置你的特定变量。

3
您可以将您的导出语句放在~/.bashrc中。

6
在OSX上,~/.bashrc不会被登录 shell执行 - 所有由Terminal.app启动的shell都是登录shell; 因此,请使用~/.bash_profile - mklement0

1
在MacOS的Big Sur中,我认为`.bashrc`现在是`.zshrc`,而`.bash_profile`现在是`.zprofile`。

1

我在 Big Sur 上修改了 ~/.bashrc,但必须运行 source ~/.bashrc 才能使更改生效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接