例如,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)
environ
execve(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 程序也应如此,因此请添加注释以查看是否可行。
注意事项
- 此解决方法可能仅适用于
bash
shell 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 的问题,那就太好了。