如何在不同环境下启动两个 tmux 会话?

sma*_*ing 3 tmux

这样做的天真方法行不通。尝试这个:

启动第一个 tmux 会话。

$ export ENVIRONMENT="production"
$ tmux
Run Code Online (Sandbox Code Playgroud)

然后您可以验证会话内部ENVIRONMENTproduction

然后,在第二个终端中启动另一个会话

$ export ENVIRONMENT="staging"
$ tmux
Run Code Online (Sandbox Code Playgroud)

出人意料的是在这届ENVIRONMENT也是production!这是非常不直观的!

这里发生了什么?我怎样才能做到这一点?我喜欢会话中的所有窗口“继承”环境变量。

che*_*ner 5

“最简单”的解决方案是创建一个tmux具有不同环境的新服务器。

$ ENVIRONMENT=production tmux -L prod-tmux
Run Code Online (Sandbox Code Playgroud)

$ ENVIRONMENT=staging tmux -L staging-tmux
Run Code Online (Sandbox Code Playgroud)

每当您重新连接到现有会话时,您始终需要指定要使用的套接字prod-tmuxstaging-tmux


下一个解决方案是使用一台服务器,但修改该服务器中每个会话的环境。就像是

$ tmux new-session -d -s production
$ tmux new-session -d -s staging
$ tmux set-environment -t production ENVIRONMENT production
$ tmux set-environment -t staging ENVIRONMENT staging
Run Code Online (Sandbox Code Playgroud)

请注意,ENVIRONMENT不会在每个会话的最初的窗口中运行的过程中进行设置,但将是创建的任何后续的窗口。(除非服务器ENVIRONMENT在第一次启动时继承了它。)


当您运行 时tmux,它首先查找现有服务器(默认服务器,或由-L-S选项指定的服务器)。如果没有服务器,则启动一个,服务器的环境继承自当前环境。

如果有一个服务器,tmux简单地请求执行TMUX命令的服务器(默认为new-session,或任何命令由一个参数指定tmux)命令,然后退出。tmux命令本身的环境不相关,除非请求的命令被记录为从中读取(参见set-environment)。

服务器管理一组窗口,每个窗口代表一个由服务器创建的进程(不是tmux命令本身)。会话只是一组逻辑窗口,也由服务器管理。