如何防止Tmux用重复路径填充全局PATH变量?

Mar*_*arc 12 zsh path zshrc tmux

我通过Homebrew使用Mac OS X,iTerm2,zsh和Tmux.当我在iTerm2中启动终端会话时,全局PATH变量看起来仍然很好.但是当我打开一个Tmux会话时,PATH变量扩展了它已经包含的相同路径.我将在我的.zshrc中提出解决代码片段的问题,但我仍然对PATH变量填充两次的原因感兴趣.

qqx*_*qqx 22

这是因为您的.zshrc是针对每个新的zsh进程进行评估的.因此,当你启动iTerm2时,会对你的$ PATH进行评估,然后当你启动获取修改后的$ PATH的tmux并将其传递给那里的zsh的新实例时,新的zsh进程再次评估.zshrc制作再次改变.

有几种方法可以防止这种情况发生.

$ TMUX

首先,要专门防止tmux内部的shell发生,如果设置了$ TMUX,你可以跳过进行这些更改:

if [[ -z $TMUX ]]; then
  PATH="$PATH:/foo"
fi
Run Code Online (Sandbox Code Playgroud)

zprofile

另一种选择是将.zshrc的该部分移动到.zprofile文件中.此文件仅由登录shell评估.但是,默认情况下,tmux会将新shell作为登录shell启动,因此您还需要通过在tmux配置中添加以下内容来阻止tmux执行此操作:

set -g default-command /bin/zsh
Run Code Online (Sandbox Code Playgroud)

您可能需要调整zsh的路径.这会阻止tmux将zsh进程作为登录shell启动,因此tmux中的zsh不会查看.zprofile.

排字

为了防止重复添加,您链接到的代码片段的另一个选项是将路径修改更改为:

typeset -aU path
path=( $path /foo )
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为zsh会自动将$ path变量设置为一个镜像$ PATH内容的数组.排版的-U选项修改该变量,以使条目唯一.