为什么我的TextMate包有时无法访问环境/ shell变量?

时间:2011-04-06 19:13:01

标签: shell environment-variables textmate textmatebundles

我有一个用ruby编写的TextMate包,它访问ENV哈希以读取shell变量。

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

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

更新

啊哈!当我从命令行启动TextMate时,它可以工作。如果我从Dock启动它,它就不起作用(即使我随后从命令行打开一个目录)。

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

1 个答案:

答案 0 :(得分:2)

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

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

解决这个问题的方法有environment.plist,launchctl或launchd.conf:

Setting environment variables in OS X?

<强>更新

如果您修改/etc/launchd.conf并重新启动,则更改将生效。每一行都可以是setenv VAR_NAME "VAR_VALUE"之类的launchctl命令。然后,您可以使用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 repo链接的评论。如果它有效,那就是。