第一个会话及后续会话的全局和会话环境?

第一个会话及后续会话的全局和会话环境?

我有一个 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将环境复制到全局环境中;此外,每个会话都有一个会话环境。创建窗口时,会话环境和全局环境将合并。如果两者都存在一个变量,使用会话环境中的值

当我第一次运行时123TESTtmux 服务器设置为 GLOBAL 。但是当我运行时555TEST=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

相关内容