RVM + TMUX - $PATH 中的重复条目

RVM + TMUX - $PATH 中的重复条目

我的 Linux 终端配置文件(.bash_profile、.profile、.bashrc)通过在前面添加一些自定义目录来扩展 $PATH。这只会发生一次(并且我还包含了一些基于 ENV 变量的防护来强制它只能发生一次)。我.bash_profile还获取了 .rvm 脚本 ( ~/.rvm/scripts/rvm),该脚本在其前面添加了自己的自定义目录。这些 RVM 目录必须位于第一位。

只要我处于干净的bash会话中,一切都好。

但是,如果我运行tmux,我的配置文件中的目录条目将双重添加到 PATH 前面(无论我的 ENV 变量保护如何)。 tmux 似乎有两个 ENV 变量环境,然后将其合并。

这是一个问题,因为 .rvm 脚本前置的条目仅前置一次,并且在 tmux 场景中它们不会首先结束。

我怎样才能防止这种情况发生?

编辑—附加信息: 我所有的 PATH 添加都放在前面.profile,我将其包含在.bash_profile( . ~/.profile) 中。我的所有 GUI 终端都“作为登录 shell”运行。

在每个配置文件中,我使用以下形式的防护来防止双重包含:

    if [ "$PROFILE_SOURCED" != "true" ]; then
         export PROFILE_SOURCED=true
    ...
    fi

通过在 PATH 中添加一个条目,我的意思是export PATH=entry:$PATH.

答案1

通过以下方法解决:

  1. 在我的 PATH 操作代码周围放置了一个警卫.profile

    if [ "$PATHS" != "true" ]; then
        export PATHS="true"
    #Manipulate and export PATH over here
    fi
    
  2. .bash_profile删除了周围的文件级防护.bashrc

  3. 重要的: 重新启动服务器tmux。(killall tmux)——手册表明服务器维护自己的环境,该环境从其父 shell 继承而来。如果配置文件发生变化,则tmux需要重新启动。

答案2

获得环境变量重复条目的一种可能性是递归地定义它们。当你有 in~/.bashrc类似的东西时,就会发生递归定义:

export SOME_VARIABLE=$SOME_VARIABLE:/some/paths/

启动时tmux,它默认启动登录 shell。您可以通过在~/.tmux.conf选项中设置来更改此行为

set-option -g default-command bash #or zsh, or whatever

正如中所述这个问题。无论哪种方式,tmux都会启动一个 shell,该 shell 又会提供源~/.bashrc(作为非登录 shell 或作为登录 shell,通过~/.profile)。由于环境变量是在文件中递归定义的.bashrc,因此再次遍历~/.bashrc将添加/some/paths到那些已定义的路径中。所以它们会被复制。

当 shell 启动时,许多环境变量都是空的。因此将它们定义为

export SOME_VARIABLE=:/some/paths/

应该不会造成任何伤害,并且会防止tmux创建重复项。如果他们从某些值开始(例如PATH),一种解决方案可能是在变量的定义中写下这些默认值。

相关内容