2011-04-06 56 views
2

我有一个用ruby写的TextMate包,它访问ENV哈希以读取shell变量。为什么我的TextMate软件包有时无法访问环境/ shell变量?

它有时会成功读取此变量,有时无法找到它。我一直无法弄清楚这种模式。

什么决定哪些shell变量对TextMate包可见?

更新

啊哈哈!当我从命令行启动TextMate时,它起作用。如果我从码头启动它,它不起作用(即使我随后从命令行打开目录)。

所以现在的问题是,为什么TextMate选择在这些情况下选择不同的环境,并且有没有办法使它们相同?

+0

林不知道,但我不知道,如果你有一个变量,你想总是overrided你可以通过首选项添加它。 – prodigitalson 2011-04-06 19:19:05

回答

2

Textmate通过launchd启动,而不是从shell启动。

如果您直接从shell运行某些内容(打开-a Textmate不起作用,打开将不会将您的环境传递给Textmate),则$ PATH将遍历。

来解决这个问题的办法是environment.plist,launchctl,或launchd.conf的:

Setting environment variables in OS X?

更新

如果编辑/etc/launchd.conf并重新启动,更改将生效。每行可以是一个launchctl命令,如setenv VAR_NAME "VAR_VALUE"。然后你可以用launchctl your_file运行这个文件。这是一个不得不重启的痛苦。如果你想要每个用户的环境设置,这是不好的。 Apple建议~/.launchd.conf可用于用户特定的设置,但尚未实现此功能。

您可以设置脚本以使用LoginHook和LogoffHook在登录时运行(请参阅Apple's documentation)。或者,使用LaunchAgents。有关如何设置LaunchAgent的详细说明,请参阅this Macworld post上nicksay的帖子。

launchctl setenv命令在登录时似乎不起作用。我目前正在对此进行抨击。

我遇到了与今天基本相同的问题(Makefile包不会将LIBRARY_PATH传递给gcc),现在我正在编写一个python脚本,它将在登录时读取变量赋值文件,存储将当前环境和该文件与作业复制,然后卸载注销时的所有变量。这也提醒我,我应该有一个更新选项。当我完成后,我会在这里发布一条评论,指向这里的github回购链接。如果它有效,那就是。

+0

当然,必须有某种解决方法来始终将自己的环境合并到Textmate看到的内容中?此外,这并不能解释为什么它有时会但不是全部都有效。 – 2011-04-12 01:02:48

+0

啊哈 - 当我从命令行启动textmate,它的工作。如果我从码头启动它,它不起作用(即使我随后从命令行打开目录)。 – 2011-04-12 01:05:18

+0

(更新了问题) – 2011-04-12 01:06:26