Tmux 환경 변수는 현재 쉘이 아닌 다른 세션에서 상속됩니다.

Tmux 환경 변수는 현재 쉘이 아닌 다른 세션에서 상속됩니다.

여러 프로젝트를 작업할 때 나는 일반적으로 각 프로젝트마다 새로운 Conda 환경을 만듭니다.

예를 들어 다음 명령을 사용하여 "projectA" 환경을 만듭니다.

conda create -n projectA python=3.6 pip

또한 각 프로젝트마다 별도의 tmux 세션을 사용합니다. 하지만 tmux에 가서 새 창이나 새 창을 만들 때 conda activate projectA... 너무 느리고 불편하다고 생각합니다. 그래서 .bashrc 파일에 다음 줄을 넣었습니다.

conda activate $CONDA_DEFAULT_ENV

잘 작동합니다. 첫 번째 tmux 세션은 현재 쉘의 환경을 상속합니다. 하지만 두 번째 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새 세션을 만듭니다.

관련 정보