在OS X中修改环境变量如PATH的正确方法是什么?
我看了谷歌一点,找到了三个不同的文件进行编辑:
/etc/paths ~ / . profile ~ / tcshrc
我甚至没有这些文件中的一些,我很确定.tcshrc是错误的,因为OS X现在使用bash。这些变量,特别是PATH,定义在哪里?
我运行的是OS X v10.5 (Leopard)。
在OS X中修改环境变量如PATH的正确方法是什么?
我看了谷歌一点,找到了三个不同的文件进行编辑:
/etc/paths ~ / . profile ~ / tcshrc
我甚至没有这些文件中的一些,我很确定.tcshrc是错误的,因为OS X现在使用bash。这些变量,特别是PATH,定义在哪里?
我运行的是OS X v10.5 (Leopard)。
当前回答
对于单个用户修改,使用~/。你列出的人的简介。下面的链接解释了Bash何时读取不同的文件。
http://telin.ugent.be/~slippens/drupal/bashrc_and_others
如果你想为gui应用程序设置环境变量,你需要~/. macosx /environment。plist文件
其他回答
有时候,前面所有的答案都不适用。如果你想在Eclipse或IntelliJ IDEA中访问一个系统变量(如M2_HOME),在这种情况下,唯一适合我的是:
首先(步骤1)编辑/etc/launchd.conf以包含如下一行:“setenv VAR value”,然后(步骤2)重新启动。
简单地修改.bash_profile将不起作用,因为在OS X中应用程序不会像在其他Unix中那样启动;它们不继承父函数的壳变量。其他的修改都不管用了,原因我也不知道。也许有人可以解释一下。
来自单一来源的命令行和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"
我们需要一个启动代理,它将在每次登录时运行,并随时按需将这些变量加载到用户会话。我们还需要一个shell脚本来解析这些定义并构建由代理执行的必要命令。
在~/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执行shell脚本是必要的,以便~/。Bash_profile是在执行脚本之前首先获取的。
现在,shell脚本。在~/.osx-env-sync.sh中创建以下内容:
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应用程序并验证它可以读取环境变量。
设置是持久的。它将在重新启动和重新登录后仍然有效。
在初始设置之后(您刚刚完成了),如果您想在~/中反映任何更改。Bash_profile再次到您的整个环境,重新运行launchctl load…命令不会执行你想要的;相反,你会得到如下警告:
< $ HOME > /图书馆/ LaunchAgents / osx-env-sync。plist:操作已经在进行中
为了在不退出/登录的情况下重新加载环境变量,请执行以下操作:
launchctl unload ~/Library/LaunchAgents/osx-env-sync.plist
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist
最后,确保重新启动已经运行的应用程序(包括Terminal.app),让它们知道这些更改。
我还将这里的代码和解释推送到GitHub项目:osx-env-sync。
我希望这将是最终的解决方案,至少对于最新版本的OS X (Yosemite & El Capitan)来说是这样。
直到和包括OS X v10.7 (Lion),你可以设置它们:
~/.MacOSX/environment.plist
See:
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中设置(尽管您可能必须创建它)
对于OS X v10.8 (Mountain Lion)及以上版本,您需要使用launchd和launchctl。
更新(2017-08-04)
从macOS 10.12.6 (Sierra)开始,这个方法似乎已经停止在Apache httpd上工作(对于系统和launchctl配置的用户选项)。其他项目似乎没有受到影响。可以想象,这是httpd中的一个bug。
原来的答案
这涉及到OS X 10.10+(特别是10.11+由于无根模式,其中/usr/bin不再可写)。
我在很多地方读到过,使用launchctl setenv PATH <new PATH >来设置PATH变量由于OS X中的一个错误而不起作用(从个人经验来看似乎是正确的)。我发现还有另一种方法可以为非shell启动的应用程序设置PATH:
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(使用getenv获取PATH)开始的GUI应用程序一起工作。 请注意,您只需要这样做一次,并且更改将在重新启动时保持不变。
做的事: vim ~ / . bash_profile 文件可能不存在(如果不存在,您可以直接创建它)。 输入并保存文件: 导出路径= $路径:YOUR_PATH_HERE 运行 源~ / . bash_profile