我有一个 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
应该被会话环境替换,但它不是......
答案1
据我了解阅读手册,这是预期的行为。
当您创建第一个会话时(自动)启动服务器时,全球的环境确实已创建并获取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
在每个会话窗口中您得到 A=1 和 B=2环境并且在每个会话窗口中 A=5 和 B=5环境2。