path_helper 和 zsh

path_helper 和 zsh

我读到,Apple 没有将越来越多的PATH变量变体塞到 shell 配置文件的末尾,而是创建了path_helper二进制文件,以便它可以PATH通过从/etc/paths.d/目录读取路径列表来自动扩展变量。

另外 - 该文件仅生成 csh 和 bash 的输出(-c以及-s相应的标志)。没有输出zsh(尽管 zsh 在某种程度上与 bash 兼容 - 我明白)。

我正在使用 zsh。我的/etc/zshenv文件包含以下几行:

# system-wide environment settings for zsh(1)
if [ -x /usr/libexec/path_helper ]; then
    eval `/usr/libexec/path_helper -s`
fi

当我打开终端或其新选项卡时,该过程需要大约半秒钟才能完成。只有一个文件具有单一路径 ( /usr/X11/bin)。如果我/etc/zshenv完全删除,我会冒多大的风险?将上述路径放入我的.zshrc或文件中就足够了吗.zshenv

答案1

您是否在 superuser.com 上看到过类似问题? 所链接的博客文章说(我引用了几乎完整的帖子):

/usr/libexec/path_helperMac OS X 每次创建登录 shell 时都会运行它,速度非常慢。 (特别是,我认为缓慢的是[[ "$NEWPATH" = *(*:)${p}*(:*) ]]。)我的终端窗口打开大约需要四秒钟。通过删除 /etc/paths.d 中的文件并将其内容直接放入 .bash_profile 中的 $PATH 中,终端窗口现在可以立即加载。

讨论还包括一个链接用 Perl 编写的替换,github.com/mgprot/path_helper(不知道它的速度)。

编辑:从上述博客文章的评论来看——一个补丁path_helper这应该是解决问题的另一种方法。

答案2

我知道以下内容对启动新终端的速度没有影响。然而它咬了我,所以我想我应该投入两分钱。

我认为这个调用(对path_helper)是在zshenv中(它是为所有shell调用的,而不仅仅是登录shell),这实际上是有问题的。对于其他 shell,path_helper 调用位于 /etc/profile 或 /etc/csh.login 中——仅针对登录 shell 调用。

如果您在 zsh 下运行“screen”实用程序,这就会成为问题。 'screen' 不会启动登录 shell,而是从调用 shell 继承环境。但它仍然会调用 /etc/zshenv 和 bu 扩展 path_helper。

事实上,path_helper 不仅会从 /etc/paths.d 中获取 PATH 候选者,而且如果在调用它时存在现有 PATH,它将主动操作该 PATH —— 它将删除在 /etc/ 中找到的组件。 paths 和 /etc/paths.d 并将它们放在前面。因此,如果您将 ${USER}/bin 或 /usr/local/bin 放在 PATH 的开头(因为您希望首先找到您自己的程序),那么这在“屏幕”会话中将不起作用。

我建议解决我自己的问题是将 /etc/zshenv 重命名为 /etc/zprofile (当前不存在),但我担心这会产生不良影响......在那里可能这就是为什么 OS X 上的 zsh 实现在 /etc/zshenv 中有这个调用的原因,当下一个操作系统出现时,它肯定会被破坏,我会忘记所有我的修复。

还有其他人看过这个吗?或者有什么想法吗?

相关内容