Bash

第一個會話和後續會話的全域和會話環境?

  • January 23, 2022

我有一個 bash 腳本:

#!/bin/bash
export TEST=$1
tmux new-session -d -s $1
tmux send-keys -t $1:0 "printenv | grep TEST" C-m

跑:

# ./test.sh 123  #The tmux server is automatically launched
# ./test.sh 555

結果:

  • tmux a -t 123節目TEST=123
  • tmux a -t 555顯示TEST=123而不是TEST=555!!!!

為什麼我的下一個 TMUX 會話會繼承第一個創建的會話的所有環境變數?

這很令人驚訝,我該怎麼做才能阻止這種無意義的行為?

https://manpages.debian.org/experimental/tmux/tmux.1.en.html#GLOBAL_AND_SESSION_ENVIRONMENT

當伺服器啟動時,tmux 將環境複製到全域環境中;此外,每個會話都有一個會話環境。創建視窗時,會話和全域環境將合併。如果兩者都存在變數,則使用會話環境中的值

當我第一次執行時123TEST為 tmux 伺服器設置了 GLOBAL。但是當我執行時555TEST=123應該被會話環境替換,但它不是……

據我了解閱讀手冊,這是預期的行為。

當您在創建第一個會話時(自動)啟動伺服器時,確實會創建全域TEST環境並獲取變數。

為什麼你認為當你創建第二個會話時,會話環境會得到TEST.

要設置會話環境,您可以使用set-environment.

#!/bin/bash

tmux new-session -d -s $1
tmux set-environment -t $1 TEST $1

執行

./test.sh 123
./test.sh 555

然後你可以使用show-environment

tmux show-environment -t 123 TEST
tmux show-environment -t 555 TEST

編輯

視窗 0 在創建,new-session因此沒有使用set-environment.

我同意這很奇怪。

我認為你想要的可以通過(類似的).bashrc 來實現:

if [ -n "$TMUX" -a -n "$ENVFILE" ]; then
   source $ENVFILE
fi

和 newsess.sh:

#!/bin/bash

sname=`basename $1`
tmux new-session -d -s $sname "ENVFILE=$1 bash"
tmux set-environment -t $sname ENVFILE $1

/tmp/環境:

export A=1
export B=2

/tmp/env2:

export A=5
export B=5

然後

./newsess.sh /tmp/env
./newsess.sh /tmp/env2

您在 session env的每個視窗中獲得 A=1 和 B=2 ,在session env2的每個視窗中獲得 A=5 和 B=5 。

引用自:https://unix.stackexchange.com/questions/687543