如何启动带有不同环境变量的两个tmux会话?
tmux会话共享环境变量的原因及独立配置方法
你的问题我太懂了!
你碰到的这个情况确实有点反直觉——明明在不同终端设置了不同的ENVIRONMENT变量,启动tmux后却全变成第一个的production,完全不符合预期对吧?
先再明确下你的操作场景,方便后面解释:
- 终端1操作:
会话内执行export ENVIRONMENT="production" tmuxecho $ENVIRONMENT输出production,没问题; - 终端2操作:
结果新会话里export ENVIRONMENT="staging" tmuxENVIRONMENT还是production,这就很离谱了。
为啥会出现这种情况?
核心原因是tmux的服务器级环境变量继承机制:
- 当你第一次运行
tmux时,它会在后台启动一个默认的tmux服务器进程,这个服务器会直接继承你当时终端的所有环境变量(也就是ENVIRONMENT=production); - 之后不管你在哪个终端再敲
tmux,它不会新建服务器,而是自动连接到已经存在的那个默认服务器上。所以新会话用的是服务器启动时的环境变量,跟你当前终端的变量完全没关系!
说白了,tmux的环境变量是跟着服务器走的,不是跟着你启动tmux的终端走的。
怎么实现会话独立的环境变量?
这里有几种实用方案,按需选择:
方案1:启动独立的tmux服务器(最推荐)
给不同的tmux服务器指定不同的socket标识,让它们完全隔离,各自继承启动时终端的环境变量:
# 终端1启动production专属的tmux服务器 export ENVIRONMENT="production" tmux -L prod # -L 指定socket名称,随便取,比如prod、stg都行 # 终端2启动staging专属的tmux服务器 export ENVIRONMENT="staging" tmux -L stg
之后要重新连接对应会话时,也要加上-L参数,比如tmux -L prod attach,这样就绝对不会串环境了。
方案2:在会话内手动设置环境变量
如果不想搞多个服务器,进入tmux后直接重新设置变量,还能让同会话的所有窗口都继承:
# 进入tmux后执行,临时生效,当前窗口可用 export ENVIRONMENT="staging" # 或者用tmux内置命令设置,让整个会话的所有窗口都继承这个变量 tmux set-environment ENVIRONMENT "staging"
不过这个方法每次新建会话都要手动操作,适合临时调整的场景。
方案3:启动tmux时直接传递变量
可以跳过终端导出的步骤,直接在启动tmux时指定环境变量:
# 直接启动production会话 ENVIRONMENT="production" tmux # 直接启动staging会话 ENVIRONMENT="staging" tmux
⚠️注意:如果默认服务器已经存在,这个方法不会覆盖服务器的环境变量,所以最好配合方案1的-L参数一起用,确保启动的是全新服务器:
ENVIRONMENT="staging" tmux -L stg
内容的提问来源于stack exchange,提问作者smatting
相关产品推荐
相关产品推荐

