tmux 会对 PATH 变量进行“排序”吗?

tmux 会对 PATH 变量进行“排序”吗?

我有一个可重现的问题:

  1. 在 Bash .profile 中设置我的 PATH
  2. tmux通过或tmux attach任何其他方式启动 tmux
  3. echo $PATH 并查看其具有相同组件但不同顺序

如何阻止这种现象?这又该如何解释呢?

答案1

如果您使用的是 Mac,并且一直想知道为什么/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin在运行 tmux 时会不断将其添加到 PATH 前面,这是因为从您的/etc/profile文件中运行了一个名为 path_helper 的实用程序。

您无法轻易说服 tmux(或者更确切地说是 bash)不要进行源代码/etc/profile(由于某种原因,tmux 始终作为登录 shell 运行,这意味着将读取 /etc/profile),但您可以确保 path_helper 的效果不会影响您的 PATH。

诀窍是在 path_helper 运行之前确保 PATH 为空。在我的~/.bash_profile文件中,我有以下内容:

if [ -f /etc/profile ]; then
    PATH=""
    source /etc/profile
fi

在 path_helper 执行之前清除 PATH 将阻止它将默认 PATH 添加到您(之前)选择的 PATH 之前,并允许您的其余个人 bash 设置脚本(下面的命令.bash_profile,或者.bashrc如果您从中获取它,则在 中.bash_profile)相应地设置您的 PATH。

希望这有意义...

答案2

不;排序$PATH是一件太疯狂的事情,因为许多系统依赖于用户设置的顺序。

然而,tmux以“登录”模式启动你的 shell,从而~/.profile导致再次。这意味着如果你PATH=/my/dir:/another/dir:$PATH在该文件中有类似的东西,它会再次发生,导致 $PATH 包含/my/dir:/another/dir:/my/dir:/another/dir:(etc.)。为了避免这种情况,您可以使用另一个变量来检查:

if [ "$_SKIP_PROFILE" ]; then
    return 0
else
    export _SKIP_PROFILE=y
fi

export PATH="/my/dir:/another/dir:$PATH"

答案3

@Graham Ashton 谢谢你的想法

我的建议是

if [ -f /etc/profile ]; then
    PATH=""
    source /etc/profile
fi

在 .zshrc 文件顶部。

确保您的

export NVM_DIR="$HOME/.nvm"
. "/usr/local/opt/nvm/nvm.sh"

在下面。

相关内容