这样做的天真方法行不通。尝试这个:
启动第一个 tmux 会话。
$ export ENVIRONMENT="production"
$ tmux
Run Code Online (Sandbox Code Playgroud)
然后您可以验证会话内部ENVIRONMENT是production
然后,在第二个终端中启动另一个会话
$ export ENVIRONMENT="staging"
$ tmux
Run Code Online (Sandbox Code Playgroud)
出人意料的是在这届ENVIRONMENT也是production!这是非常不直观的!
这里发生了什么?我怎样才能做到这一点?我喜欢会话中的所有窗口“继承”环境变量。
“最简单”的解决方案是创建一个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-tmux或staging-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命令本身)。会话只是一组逻辑窗口,也由服务器管理。