【问题标题】:How to prevent Tmux from filling up the global PATH variable with duplicated paths?如何防止 Tmux 用重复的路径填充全局 PATH 变量?
【发布时间】:2012-10-24 22:08:42
【问题描述】:

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

【问题讨论】:

    标签: path zsh tmux zshrc


    【解决方案1】:

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

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

    $TMUX

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

    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。

    排版

    另一个类似于您链接到的用于防止添加重复的代码 sn-p 行的另一个选项是将您的路径修改更改为:

    typeset -aU path
    path=( $path /foo )
    

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

    【讨论】:

    • 谢谢,$TMUX 和 typeset 变体完美结合。只有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,我在 ~/.bash_aliases 文件中使用了set -g default-command /bin/bash 并修改了if [[ -z $TMUX ]]; then PATH="$PATH:/foo" fi。为我工作,谢谢!
    【解决方案2】:

    我发现this GitHub thread 非常有用。 this comment 的解决方案对我有用:

    # /etc/zshenv
    if [ -x /usr/libexec/path_helper ]; then
      PATH="" # Add this line
      eval `/usr/libexec/path_helper -s`
    fi
    

    通过这样做,您必须将 PATH 修改放入 ~/.zshrc 而不是 ~/.zprofile。我还从线程中尝试了this solution,但对我不起作用。

    【讨论】:

    • 解决方案对我不起作用
    【解决方案3】:

    我的解决方案:

    第 1 步:

    在 .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,所以它不会弄乱你的 PATH

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      • 2013-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      相关资源
      最近更新 更多