Tmux 環境変数は、現在のシェル以外のセッションから継承されます。

Tmux 環境変数は、現在のシェル以外のセッションから継承されます。

複数のプロジェクトを作業するとき、私は通常、各プロジェクトに新しいConda環境を作成します。

たとえば、次のコマンドを使用して「projectA」環境を作成します。

conda create -n projectA python=3.6 pip

また、プロジェクトごとに別々のtmuxセッションを使用します。しかし、tmuxに行き、新しいウィンドウや新しいウィンドウを作成するときconda activate projectA...遅すぎると不便だと思います。だから私は.bashrcファイルに次の行を入れました。

conda activate $CONDA_DEFAULT_ENV

うまくいきます。最初の tmux セッションは現在のシェルの環境を継承します。しかし、2番目のtmuxセッションを作成するときに問題が発生しました。現在、シェルではなく最初のセッションから環境変数を継承しました。

ユースケース:

  • ステップ1:シェル(デフォルト環境)を作成し、「projectA」環境を有効にします。
  • ステップ2: "projectA"環境にtmuxセッション0を作成します。
  • ステップ3:まだ「projectA」環境にあるセッション0に新しいウィンドウを作成します。
  • ステップ4:別のシェル(デフォルト環境)を作成し、「projectB」環境を有効にします。
  • ステップ5:「projectA」環境にあるtmuxセッション1を作成します。 ("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は実行中のシェル内にどの環境変数があるかを自動的に知ることはできません。

PS1では、次のようにしてtmuxが何であるかを知ることができます。

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

これにより、CONDA_DEFAULT_ENVtmux グローバル環境が最新のシェルを使用したウィンドウの値で更新されます。しかし、これの問題は、すべてのセッションのすべての新しいウィンドウに適用されることです。

あるセッションの新しいウィンドウでのみ使用できるようにするには、そのセッションのセッションコンテキストに入れる必要があります。

new-window-eウィンドウを作成するときに設定する必要がある環境変数がありますが、残念ながら追加されていないので、new-session最善の方法はスクリプトをラップすることです。

したがって、PS1にこのようなものがある場合は、tmuxグローバル環境のカスタム環境変数にCONDA_DEFAULT_ENVを入れます。

[ -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新しいセッションを作成します。

関連情報