我有一个用 ruby 编写的 TextMate 包,它可以访问 ENV 哈希以读取 shell 变量。
它有时会成功读取这个变量,有时却找不到。我一直无法弄清楚模式。
什么决定了哪些 shell 变量对 TextMate 包可见?
更新
啊哈!当我从命令行启动 TextMate 时,它可以工作。如果我从扩展坞启动它,它就不起作用(即使我随后从命令行打开一个目录)。
那么现在的问题是,为什么 TextMate 在这些情况下会选择拾取不同的环境,有没有办法让它们相同呢?
我有一个用 ruby 编写的 TextMate 包,它可以访问 ENV 哈希以读取 shell 变量。
它有时会成功读取这个变量,有时却找不到。我一直无法弄清楚模式。
什么决定了哪些 shell 变量对 TextMate 包可见?
更新
啊哈!当我从命令行启动 TextMate 时,它可以工作。如果我从扩展坞启动它,它就不起作用(即使我随后从命令行打开一个目录)。
那么现在的问题是,为什么 TextMate 在这些情况下会选择拾取不同的环境,有没有办法让它们相同呢?
Textmate 是通过 launchd 启动的,而不是从 shell 启动的。
如果您直接从 shell 运行某些东西,您的 $PATH 将会遍历(open -a Textmate 不起作用,open 不会将您的环境传递给 Textmate)。
解决这个问题的方法是 environment.plist、launchctl 或 launchd.conf:
更新
如果您编辑/etc/launchd.conf
并重新启动,更改将生效。每一行都可以是一个 launchctl 命令,例如setenv VAR_NAME "VAR_VALUE"
. 然后,您可以使用launchctl your_file
.
不过重启还是很痛苦的。如果你想要每个用户的环境设置,那就不好了。Apple 提议~/.launchd.conf
可用于用户特定的设置,但尚未实现此功能。
您可以使用 LoginHook 和 LogoffHook 设置脚本以在登录时运行(请参阅Apple 的文档)。或者,使用 LaunchAgents。有关如何设置 LaunchAgent 的详细说明,请查看 nicksay 在此 Macworld 帖子上的帖子。
登录时该launchctl setenv
命令似乎不起作用。我目前正在为此努力。
我遇到了您今天遇到的基本相同的问题(Makefile 包不会将 LIBRARY_PATH 传递给 gcc),现在我正在编写一个 python 脚本,它将在登录时读取变量分配文件,存储当前的副本环境和带有分配的文件,然后在注销时卸载所有变量。这也提醒我,我应该有一个更新选项。完成后,我将在此处发布带有 github 存储库链接的评论。如果它有效,那就是。