在解决了Mavericks发行版中的OSX PATH问题之后,问题又在优胜美地再次出现!!!
因此,我想模仿launch.conf
新版Mac OSX 10.10 Yosemite中的旧功能,以便在GUI应用程序(例如Carbon Emacs或RStudio)中提供PATH环境变量。我使用了stackoverflow用户ursa的好主意来设置一个shell脚本,该脚本通过配置环境变量launchctl
。(请参阅此处的 stackoverflow答案。)这适用于大多数环境变量,但不适用于PATH变量。
1.我做了什么?
首先,我将 /etc/environment.rc
脚本编写如下:
launchctl setenv PATH /Users/halloleo/bin:/usr/texbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
launchctl setenv JAVA_HOME /usr/local/jdk1.7
launchctl setenv ENVIRONMENT_RC "yes"
然后,我创建了plists用于launchd
(下面的附录中的这些脚本和其他提到的脚本的列表)。然后我用
$ sudo launchctrl load ...
然后,我path_helper
在Shell初始化文件/etc/
配置文件中禁用了该实用程序,以便它不会覆盖environment.rc
设置。最后,我重启了机器。
2.有什么作用?
当我启动终端新的环境变量JAVA_HOME
,并ENVIRONMENT_RC
根据设定environment.rc
的,但路径设置为
/ usr / bin:/ bin
为了确保没有任何bash
初始化文件妨碍我编写一个小python脚本(也在附录中)来显示当前环境中的变量,因此我直接通过双击Platypus包装器执行此操作。再次设置新变量,而PATH为系统默认值。
那么为什么要设置其他变量,但不能设置PATH变量呢?我该如何统一解决呢?
更新:
这种情况令人非常困惑:bash
Terminal或Emacs中的shell(至少)会选择您通过设置的PATH launchctl
,但其他GUI应用程序不会这么做。例如,通过Platypus直接调用的上述最小python脚本不会显示您的自定义路径。甚至Emacs本身也不知道正确的PATH:例如,当您发出Emacs命令时,您会注意到这一点M-x ispell-buffer
;ispell
如果仅在您的自定义路径上,找不到emacs尝试调用的unix工具。
附录
net.halloleo.environment.plist
,启动的配置文件位于/Library/LaunchDaemons/
:
<?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>KeepAlive</key>
<false/>
<key>Label</key>
<string>net.halloleo.environment</string>
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
<string>/etc/environment.rc</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>WatchPaths</key>
<array>
<string>/etc/environment.rc</string>
</array>
</dict>
</plist>
net.halloleo.environment-user.plist
,启动的配置文件位于/Library/LaunchAgents/
:
<?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>KeepAlive</key>
<false/>
<key>Label</key>
<string>net.halloleo.environment-user</string>
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
<string>/etc/environment.rc</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>WatchPaths</key>
<array>
<string>/etc/environment.rc</string>
</array>
</dict>
</plist>
/etc/profile
,修改后的bash启动文件:
# System-wide .profile for sh(1)
# if [ -x /usr/libexec/path_helper ]; then
# eval `/usr/libexec/path_helper -s`
# fi
if [ "${BASH-no}" != "no" ]; then
[ -r /etc/bashrc ] && . /etc/bashrc
fi
show_environ.py
,该脚本显示所有环境变量:
import os
print (os.environ)
/usr/libexec/path_helper
在初始化过程中调用的shell 。根据-的要求,GUI应用程序未获取PATH/etc/paths
,我专门询问了GUI应用程序。