在OS-X中修改像PATH这样的环境变量的正确方法是什么?
我在Google上看了一下,发现有三个不同的文件需要编辑:
我甚至没有其中的一些文件,我非常确定.tcshrc是错的,因为OS-X现在使用bash。这些变量是在哪里定义的,尤其是PATH?
我正在运行OS X v10.5 (豹)。
发布于 2009-02-25 23:42:27
布鲁诺走上了正轨。我做了大量的研究,如果你想设置在所有图形用户界面应用程序中可用的变量,你唯一的选择就是/etc/launchd.conf
。
sudo vi /etc/launchd.conf
(注意:此文件可能还不存在)grep
/xargs
命令。export
来证明您的变量正在工作,您应该会看到新的变量。这些也将在IntelliJ IDEA和通过Spotlight启动的其他图形用户界面应用程序中可用。发布于 2008-09-25 20:08:31
在包括 ()之前,您可以在以下位置设置它们:
~/.MacOSX/environment.plist
请参见:
对于终端中的路径,您应该能够在.bash_profile
或.profile
中进行设置(尽管您可能必须创建它)
适用于 (山狮)和beyond you need to use launchd
and launchctl
的。
发布于 2015-09-05 04:06:52
从单一来源同时使用命令行和图形用户界面应用程序的解决方案(适用于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>/Library/LaunchAgents/osx-env-sync.plist: Operation already in progress
要在不进行注销/登录过程的情况下重新加载环境变量,请执行以下操作:
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)来说是这样。
https://stackoverflow.com/questions/135688
复制相似问题