Bash
第一個會話和後續會話的全域和會話環境?
我有一個 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 將環境複製到全域環境中;此外,每個會話都有一個會話環境。創建視窗時,會話和全域環境將合併。如果兩者都存在變數,則使用會話環境中的值。
當我第一次執行時
123
,TEST
為 tmux 伺服器設置了 GLOBAL。但是當我執行時555
,TEST=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 。