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

Path 如何防止Tmux用重复的路径填充全局路径变量?,path,zsh,tmux,zshrc,Path,Zsh,Tmux,Zshrc,我通过自制使用MacOSX、iTerm2、zsh和Tmux。当我在iTerm2中启动终端会话时,全局路径变量看起来仍然很好。但是当我打开一个Tmux会话时,PATH变量被扩展为它已经包含的相同路径。我将在我的.zshrc中解决一个问题,但我仍然对PATH变量被填充两次的原因感兴趣。之所以会发生这种情况,是因为您的.zshrc会针对每个新的zsh进程进行评估。因此,当您启动iTerm2时,它会在对$PATH进行更改时得到评估,然后当您启动tmux时,它会得到修改后的$PATH并将其传递给其中的新z

我通过自制使用MacOSX、iTerm2、zsh和Tmux。当我在iTerm2中启动终端会话时,全局路径变量看起来仍然很好。但是当我打开一个Tmux会话时,PATH变量被扩展为它已经包含的相同路径。我将在我的.zshrc中解决一个问题,但我仍然对PATH变量被填充两次的原因感兴趣。

之所以会发生这种情况,是因为您的.zshrc会针对每个新的zsh进程进行评估。因此,当您启动iTerm2时,它会在对$PATH进行更改时得到评估,然后当您启动tmux时,它会得到修改后的$PATH并将其传递给其中的新zsh实例,新的zsh进程会再次评估进行更改的.zshrc

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

$TMUX 首先,如果设置了$tmux,则可以跳过进行这些更改,以防止在tmux内部的shell中发生这种情况:

if [[ -z $TMUX ]]; then
  PATH="$PATH:/foo"
fi
zprofile 另一种选择是将.zshrc的该部分移动到.zprofile文件中。此文件仅由登录shell计算。但是,默认情况下,tmux以登录shell的形式启动新shell,因此您还需要通过向tmux配置中添加以下内容来防止tmux这样做:

set -g default-command /bin/zsh
您可能需要调整到zsh的路径。这将防止tmux将zsh进程作为登录shell启动,因此tmux中的zsh不会查看.zprofile

排版 另一个类似于您所链接的代码段的选项是将路径修改更改为类似于:

typeset -aU path
path=( $path /foo )
这是因为zsh会自动将$path变量设置为镜像$path内容的数组。typeset的-U选项修改该变量,使条目唯一。

我发现非常有用。我的解决方案是:

# /etc/zshenv
if [ -x /usr/libexec/path_helper ]; then
  PATH="" # Add this line
  eval `/usr/libexec/path_helper -s`
fi
通过这样做,您必须将路径修改放在
~/.zshrc
而不是
~/.zprofile
中。我也尝试了线程,但对我无效。

我的解决方案:

步骤1:

In.bashrc或.zshrc

ExtraPath="/foo/bar:$HOME/bin" # your customized path here, /foo/bar and $HOME/bin for instance
if ! [[ "$PATH" =~ "$ExtraPath" ]] ; then PATH="$ExtraPath:$PATH" ; fi # if the PATH does not contain your customized path, then insert yours, else do nothing.
步骤2:

在~/.tmux.conf中,添加

set -g default-command "${SHELL}"

在这种情况下,tmux将不会源代码/etc/profile,因此不会弄乱您的路径

谢谢,$tmux和排版变体完美地结合在一起。只有RVM不能用这种方式处理。我把
[[-s“$HOME/.rvm/scripts/rvm”]]&&。“$HOME/.rvm/scripts/rvm”
插入$TMUX if块,但每次启动新的TMUX会话时,它(或其他内容)仍会执行。所以我总是得到重复的RVM路径。你检查过你的.zprofile文件吗?rvm似乎将类似的代码放在那里以及.zshrc文件中。另外,由于$path设置是唯一的,您应该能够通过执行
path=($path)
path=($path)
来清除重复项。不幸的是,这并不能解决问题。我还重新检查了我的.zprofile和所有其他.z*文件,但它们没有rvm内容;然后在我的~/.bash_别名文件中的PATH=“$PATH:/foo”fi。为我工作,谢谢!