Mac OS X Lion不再识别environment.plist文件?

29

今天刚安装了Lion系统,但是我的PATH环境变量不再由~/.MacOSX/environment.plist文件设置了。有什么改变吗?找不到任何信息或解决方法。有什么想法吗?

以下是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>PATH</key>
    <string>/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11/bin:/Users/mdi/bin</string>
</dict>
</plist>
11个回答

15

今天我遇到了同样的问题。我联系了苹果支持,经过被升级为高级顾问,然后是她的主管后,我被告知他们不再支持environment.plist,并且在Mac OS 10.7中没有官方支持的定义环境变量的方法。


2
environment.plist在Lion系统中运行得非常完美,并且仍然被引用于苹果的开发者文档中:http://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPRuntimeConfig/Articles/EnvironmentVars.html#//apple_ref/doc/uid/20002093-BCIJIJBH。我总是对“某个苹果支持人员”所说的话持怀疑态度。 - mluisbrown
我也有所怀疑,特别是支持人员一开始甚至不知道environment.plist的存在(因此升级到高级顾问的主管)。然而,上面列出的开发人员文档日期为2009年,最新版本的XCode似乎不再包括Property List Editor应用程序(尽管我在旧的开发人员工具文件夹中找到了一个)。如果它在您的系统上运行,请告诉我它的权限是什么?我的权限是-rw-r--r--@,文件属于我的用户和组(即,用户名为我的组)。 - sworisbreathing

14

请使用~/.launchd.conf替代(请参见man launchctl)。

有关详细信息,请参见此答案


2
实际上我撤回之前的话了。它正在工作,但是它没有在shell中设置我的PATH。因此,如果我在~/.launchd.conf~/.bash_profile中设置路径,一切都恢复正常了。谢谢! - Michael Irwin
实际上,我又说得太早了。这并没有为GUI应用程序设置PATH。我尝试了各种方法来解决这个问题,但似乎什么都行不通。暂时放弃... - Michael Irwin
1
~/.launchd.conf在登录或启动时不会被读取。只有在终端中运行“cat ~/.launchd.conf | launchctl”时才有效。当我查看Lion 10.7.3中的man launchd.conf时,它说:“$HOME/.launchd.conf”是您的launchd配置文件(目前不受支持)。 - uncreative
手册中的引用:虽然文档记录了在设置用户会话之前将会查阅 $HOME/.launchd.conf,但这一功能从未被实现。 - Simba

10
无论苹果是否正式支持此机制,当前的技术说明文档Technical Q&A QA1067仍然准确。但是需要注意的一点是:属性列表需要以二进制格式保存。使用Xcode 4创建新属性列表时,无论文件检查器中指定的类型是什么,它都会生成文本格式的文件。因此,您需要使用“plutil”将已保存的文件转换为二进制格式。
plutil -convert binary1 environment.plist

或者使用“defaults”写出一个新的模板文件,在Xcode中进行编辑(保存时将遵守原始二进制格式):

defaults write defaults write $HOME/.MacOSX/environment Root "1"

2
引用的文档现在在developer.apple.com上已列为“已停用”。 - Dorrin

1

很奇怪,因为在这里它完美地运作。我不得不设置一个JRI环境来从Java应用程序中访问R内部,并且更新.profile并不足以使NetBeans捕获所有环境变量。

创建environment.plist文件解决了问题。

供参考,以下是文件的内容:

Malessere:~ xxxxx$ cat .MacOSX/environment.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>DYLD_LIBRARY_PATH</key>
      <string>/Users/xxxxx/lib/jri-2.13</string>
      <key>R_HOME</key>
      <string>/Library/Frameworks/R.framework/Resources</string>
   </dict>
   </plist>

嗯,这个确实是以三个空格开头吗?如果是的话,那就不对了:XML声明必须位于文件的最开始(除了可能存在的BOM)。 - SamB

1

为了让当前 UI 用户启动的所有进程都能够设置环境变量,现代的方法是使用启动代理。

使用 AutoDesk 文档中的 示例,在 ~/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>Label</key>
    <string>my.startup</string>
    <key>ProgramArguments</key>
    <array>
    <string>sh</string>
    <string>-c</string>
    <string>launchctl setenv RV_OS_PATH_OSX /volumes/zdisk;
launchctl setenv RV_OS_PATH_WINDOWS Z:;</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

1

我之前在Snow Leopard上遇到了类似的问题,最后找出了问题所在。

我当时正在做的是:

$ cd
$ defaults write .MacOSX/environment FOO bar

...但事实证明,这与我的情况不同:

$ cd
$ defaults write /Users/ljnelson/.MacOSX/environment FOO bar

也就是说,你的域名“路径”(实际上并不是路径)必须是你的$HOME/.MacOSX/environment.plist文件的完整路径(减去.plist后缀)。否则,它会将变量写入到不同的域中(我也不知道它被放在哪里)。

所以,要点就是:始终执行defaults write /full/path/to/your/.MacOSX/environment VARNAME value;不要对write子命令的第一个参数使用任何快捷方式。


1

像使用brew一样,在/usr/local/bin/中创建一个符号链接。对我而言,这种方法非常完美,而且在我看来更像是Unix风格的解决方案,因为一切都是文件。


0

您可以使用以下$PATH示例编辑您的~/.MacOSX/environment.plist

defaults write $HOME/.MacOSX/environment PATH "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11/bin:/opt/local/bin"

这将重写您的~/.MacOSX/environment.plist

或编辑此文件:

/etc/paths

更改系统变量的顺序。


0

[[我将我的答案复制到这里,因为它可能对某些人有帮助:]]

通过自己的探索,我现在知道了如何以8种不同的方式设置环境变量中的7种。我试图将一个envar传递给我正在Xcode下开发的应用程序。我使用这些不同的方法设置“tracer” envars来告诉我哪些方法可以将其放入我的应用程序的范围内。从下面可以看出,在Xcode中编辑“scheme”以添加参数是有效的,使用“putenv”也是有效的。没有设置它的范围:~/.MACOS/environment.plist、特定于应用程序的plist、.profile和添加运行自定义脚本的构建阶段(我在Xcode中找到了另一种方法[至少]来设置一个,但忘记了我称之为tracer的内容,现在找不到它了;也许它在另一台机器上....)

GPU_DUMP_DEVICE_KERNEL为3

GPU_DUMP_TRK_ENVPLIST为(null)

GPU_DUMP_TRK_APPPLIST为(null)

GPU_DUMP_TRK_DOTPROFILE为(null)

GPU_DUMP_TRK_RUNSCRIPT为(null)

GPU_DUMP_TRK_SCHARGS为1

GPU_DUMP_TRK_PUTENV为1

...另一方面,如果我进入终端并输入“set”,似乎它只获取了来自.profile的那个(我本以为它也会读取environment.plist,而且我确定曾经在终端中看到第二个跟踪器变量,所以自那时以来可能出了些问题;今天过得很长....)


0

我最近将Xcode运行脚本阶段使用的工具打包并放置在$HOME/bin中。我的bash shell的PATH环境变量包括了这个路径,所以我认为Xcode也会这样做。

但实际上从未奏效,我像这里描述的一样遇到了问题。

我从被Xcode调用的脚本(echo $PATH)中打印了PATH变量,以查看设置的是什么。

幸运的是,其中一个路径/Applications/Xcode.app/Contents/Developer/usr/local/bin从未被使用过。

这是我的解决方案。我从上述目录创建了一个符号链接到$HOME/bin。

导航到/Applications/Xcode.app/Contents/Developer/usr/local并执行sudo ln -s $HOME/bin bin。

现在我的工具已经可以在Xcode平台上使用了。


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