这种天真的方式是行不通的。试试这个:
开始第一次tmux会话。
$ export ENVIRONMENT="production"
$ tmux
然后,您可以验证会话ENVIRONMENT
内的production
然后,在第二个终端开始另一个会话
$ export ENVIRONMENT="staging"
$ tmux
令人惊讶的是,在这次会议中ENVIRONMENT
也是production
!这非常不直观!
这里发生了什么? 我怎么能得到这个?我喜欢会话中的所有窗口"继承"环境变量。
答案 0 :(得分:1)
“最简单”的解决方案是使用不同的环境创建新的tmux
服务器。
$ ENVIRONMENT=production tmux -L prod-tmux
和
$ ENVIRONMENT=staging tmux -L staging-tmux
每当您重新连接到现有会话时,您始终需要指定要使用的套接字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
请注意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-s1
,tmux-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