背景

背景

例如,TeX Live Utility 1.17 及更早版本无法在 Mac OS X 10.10 Yosemite 上运行。如果 shell 任务依赖PATH环境变量来启动命令,而不是完全指定的路径,则可能会失败。典型的错误消息如下所示:

/usr/texbin/updmap-sys: line 30: exec: updmap: not found

这也可能发生在作为排版过程的一部分启动pdflatex、、或其他命令的程序dvipng中。epstopdf

答案1

背景

Yosemite 中存在与环境变量相关的错误(或可能存在多个相关错误)。当通过双击在 Finder 中启动某个程序时,它将从其父进程继承一组默认的环境变量(我相信launchd目前是这样,但这并不重要)。

GUI 程序不会从 或其他 shell 初始化文件继承~/.bash_profile变量~/.bashrc

TeX Live Utility 允许用户PATH通过首选项设置将 TeX 二进制文件添加到其内部(即内存中)变量。其他程序可以通过 shell 脚本、主目录中的配置文件或其他配置机制来实现。

问题

传统上,UNIX 程序将环境变量存储在全局变量中environ(7)(要查看文档,请man 7 environ在终端中输入)。此 C 数组中的值通常通过调用(例如 和 )进行更改,setenv(3)使用 读取。使用和getenv(3)启动的子进程将继承父进程的变量,尽管某些变体(例如 )允许传递一组不同的环境变量。fork(2)execv(3)environexecve(2)

当您调用时setenv("PATH", "/usr/texbin:/usr/bin:/usr/sbin", 1),它应该替换PATH=…环境数组中的现有值。在 Yosemite 下,它似乎要么附加另一个PATH变量,要么根本无法修改environ。因此,即使getenv(3)可能返回正确的值,取消引用environ变量也会返回具有重复值或陈旧值的内容……换句话说,就是垃圾。

解决方法

对于 TeX Live Utility,解决方法是从终端启动它,如下所示:

/Applications/TeX/TeX\ Live\ Utility.app/Contents/MacOS/TeX\ Live\ Utility

请注意,反斜杠用于保护程序名称中的空格;这是实际的二进制文件,位于.app包内。其他 GUI 程序也应如此,因此请添加注释以查看是否可行。

注意事项

  • 此解决方法可能仅适用于bashshell
  • echo $PATH此解决方法仅在包含 TeX 二进制文件的路径时才有效(对于 MacTeX,这是/usr/texbin
  • 如果你正在编写代码,现在似乎environ(7)无法使用,你需要构建自己的环境并将其传递给execve(2)execle(3)

备择方案

这显然是一个 Bug,Apple 需要在 Yosemite 中修复这个问题。TeX Live 实用程序 1.19有一个不需要从终端启动的解决方法,因此我在这里使用它只是为了说明目的。CocoaNSProcessInfo对象可用于获取看似正确的环境,可以对其进行修改并传递给NSTask。请注意,NSProcessInfo在所有版本的 OS X 上都不是线程安全的,并且此解决方法依赖于 Cocoa 选择“正确”的环境变量。

替代解决方法可能涉及使用launchctl设置环境变量除非万不得已,我不建议将其设置为默认设置;它会修改环境全部您运行的程序,并且可能会导致将来极难调试的问题(就像 Mac OS X 曾经~/.MacOSX/environment.plist发生过的那样)。

受到评论中@JoeCheng的启发,我还编写了一个简单的C解决方法,在此处有差异。这应该是 OS X 的最低标准。

额外的

可以找到更多详细信息和用于测试此内容的示例 Cocoa 程序的链接这里。相关问题可以在 RStudio 和 Sublime-Text 标签下找到。

任何使用NSTask(的包装器对象fork/exec)启动 shell 或其他脚本的 Cocoa 程序似乎都会受到影响。例如,这包括 Python;据我所知,问题并不局限于 C/Objective-C 语言。这个问题极难调试,因为当您从终端中的调试器启动或在 Xcode 中的调试器下启动时,一切工作正常。如果我的推断是错误的,那很可能就是原因!

在 Yosemite 发布前两个月,我向 Apple 提交了一份错误报告。唯一的反馈是要求我描述我看到的情况是如何出乎意料的。如果我收到进一步的消息,我会更新此信息。

答案2

一位匿名用户编辑了我的回答如下:

它适用于 AlphaX,版本 8.2.2;在您的终端中输入:open -a AlphaX。

我将把这个移到一个单独的答案,因为这个解决方案确实如此不是按照提出的问题进行工作(针对 TeX Live Utility 或我测试过的其他程序)。如果它确实解决了 AlphaX 的问题,那就太好了。

相关内容