如何使用不同的环境启动两个tmux会话?

时间:2018-05-24 10:14:58

标签: tmux

这种天真的方式是行不通的。试试这个:

开始第一次tmux会话。

$ export ENVIRONMENT="production"
$ tmux

然后,您可以验证会话ENVIRONMENT内的production

然后,在第二个终端开始另一个会话

$ export ENVIRONMENT="staging"
$ tmux

令人惊讶的是,在这次会议中ENVIRONMENT也是production!这非常不直观!

这里发生了什么? 我怎么能得到这个?我喜欢会话中的所有窗口"继承"环境变量。

3 个答案:

答案 0 :(得分:1)

“最简单”的解决方案是使用不同的环境创建新的tmux服务器。

$ ENVIRONMENT=production tmux -L prod-tmux

$ ENVIRONMENT=staging tmux -L staging-tmux

每当您重新连接到现有会话时,您始终需要指定要使用的套接字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

请注意ENVIRONMENT (除非服务器在首次启动时继承ENVIRONMENT。)

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

如果服务器,tmux只是请求服务器执行tmux命令(默认情况下为new-session,或者{tmux的参数指定的任何命令{1}})命令,然后退出。 tmux命令本身的环境不相关,除非记录所请求的命令以便从中读取(参见set-environment)。

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

答案 1 :(得分:0)

基于@chepner的出色回答,我们可以通过添加别名为不同的服务器定义不同的tmux命令来解决此问题。例如,我们可以将以下内容附加到~/.bashrc

# somewhere in ~/.bashrc
alias tmux-s1='tmux -L s1'
alias tmux-s2='tmux -L s2'
alias tmux-s3='tmux -L s3'
alias tmux-s4='tmux -L s4'
alias tmux-s5='tmux -L s5'

现在,我们可以使用tmux-s1tmux-s2等...,就像通常使用tmux命令的方式一样,只是每个变体将与不同的服务器关联。当我们为没有活动会话的服务器创建会话时,当前环境变量将用于初始化服务器。要重新连接到会话,我们将需要使用创建会话的服务器的别名。

示例

$ export ENVIRONMENT="production"
$ tmux-s1 ls
no server running on /tmp/tmux-12345/s1
$ tmux-s1
############### now attached to session 0 on server s1 ################
$ echo $ENVIRONMENT
production
################### (ctrl+b,d) detach from session ####################
[detached (from session 0)]
$ tmux-s1 ls
0: 1 windows (created Sun Nov 17 18:13:18 2019) [80x20]

$ export ENVIRONMENT="staging"
$ tmux-s2 ls
no server running on /tmp/tmux-12345/s2
$ tmux-s2
############### now attached to session 0 on server s2 ################
$ echo $ENVIRONMENT
staging
################### (ctrl+b,d) detach from session ####################
[detached (from session 0)]
$ tmux-s2 ls
0: 1 windows (created Sun Nov 17 18:13:22 2019) [80x20]

答案 2 :(得分:0)

较新版本的 tmux 似乎本身就支持这一点!我为多个客户端提供 devops 支持,并希望为每个客户端设置一个单独的 bash 历史文件。以下对我来说非常有效!它将工作目录设置为客户端/项目目录,并设置 bash 历史文件路径

tmux new -c ~/Documents/code/CLIENT/ -e HISTFILE=~/Documents/code/CLIENT/.bash_history -s CLIENT -d