Tmux 环境变量继承自其他会话,而不是当前 shell

Tmux 环境变量继承自其他会话,而不是当前 shell

在处理多个项目时,我通常会为每个项目创建一个新的 conda 环境。

例如,我使用以下命令创建“projectA”环境:

conda create -n projectA python=3.6 pip

我还为每个项目使用单独的 tmux 会话。但是当我进入 tmux 并创建新窗格或新窗口时,我必须conda activate projectA.我觉得太慢而且不方便。因此,我将以下行放入 .bashrc 文件中:

conda activate $CONDA_DEFAULT_ENV

它工作得很好,第一个 tmux 会话继承了当前 shell 的环境。但是当我创建第二个 tmux 会话时,我遇到了一个问题,它从第一个会话继承环境变量,而不是当前的 shell。

使用案例:

  • 步骤1:创建shell(基础环境),激活“projectA”环境。
  • 步骤2:创建tmux会话0,它位于“projectA”环境中。
  • 步骤3:在会话0中创建一个新窗格,它仍在“projectA”环境中。
  • 步骤4:创建另一个shell(基础环境),激活“projectB”环境。
  • 步骤5:创建tmux会话1,它位于“projectA”环境中。 (虽然我希望它在“projectB”环境中。为什么?以及如何实现我的希望?

我尝试使用“printenv | grep CONDA”来调试环境变量,在步骤 4 中,它生成:

CONDA_SHLVL=2
CONDA_EXE=/home/z/anaconda3/bin/conda
CONDA_PREFIX=/home/z/anaconda3/envs/projectB
CONDA_PREFIX_1=/home/z/anaconda3
CONDA_PYTHON_EXE=/home/z/anaconda3/bin/python
_CE_CONDA=
CONDA_PROMPT_MODIFIER=(projectB) 
CONDA_DEFAULT_ENV=projectB

在第 5 步,它产生:

CONDA_SHLVL=2
CONDA_EXE=/home/z/anaconda3/bin/conda
CONDA_PREFIX=/home/z/anaconda3/envs/projectA
CONDA_PREFIX_1=/home/z/anaconda3
CONDA_PYTHON_EXE=/home/z/anaconda3/bin/python
_CE_CONDA=
CONDA_PROMPT_MODIFIER=(projectA) 
CONDA_DEFAULT_ENV=projectA

答案1

您如何创建新的 tmux 会话?如果您从键绑定或 tmux 命令提示符创建它C-b :,那么 tmux 无法自动知道正在运行的 shell 内的环境变量是什么。

你可以通过在 PS1 中执行以下操作来告诉 tmux 它是什么:

[ -n "$TMUX" -a -n "$CONDA_DEFAULT_ENV" ] && tmux setenv -g CONDA_DEFAULT_ENV "$CONDA_DEFAULT_ENV"

这将CONDA_DEFAULT_ENV在 tmux 全局环境中更新为您最近使用 shell 的窗格中的值。但这样做的问题是,它将应用于任何会话中的所有新窗格。

如果您希望它仅在一个会话的新窗格中使用,则需要将其放入该会话的会话环境中。

new-window-e创建窗口时必须设置一个环境变量,但不幸的是这没有添加到,new-session所以你最好的选择是包装脚本。

因此,如果您在 PS1 中有类似这样的操作,将 CONDA_DEFAULT_ENV 放入 tmux 全局环境中的自定义环境变量中:

[ -n "$TMUX" -a -n "$CONDA_DEFAULT_ENV" ] && tmux setenv -g MY_CONDA_DEFAULT_ENV "$CONDA_DEFAULT_ENV"

您可以编写类似这样的脚本来创建新会话并将保存的变量复制到会话环境中:

S=$(tmux new -dP)

eval `tmux showenv -gs MY_CONDA_DEFAULT_ENV 2>/dev/null`
if [ -n "$MY_CONDA_DEFAULT_ENV" ]; then
    tmux setenv -t$S CONDA_DEFAULT_ENV "$MY_CONDA_DEFAULT_ENV"
fi

if [ -n "$TMUX" ]; then
    tmux switch -t$S
else
    tmux attach -t$S
fi

然后使用此脚本而不是运行new-session来创建新会话。

相关内容