如果命名的 tmux 会话存在,则创建新的会话并与其分组,否则创建该命名的 tmux 会话

如果命名的 tmux 会话存在,则创建新的会话并与其分组,否则创建该命名的 tmux 会话

我想要的是

我正在尝试在多个单独的 ssh 终端中自动连接到远程机器,并为每个远程终端提供独立的 tmux 会话,同时共享相同的窗口(即,可以在不影响其他远程终端的情况下更改会话设置和活动窗口/窗格,同时仍然可以访问相同的 tmux 窗口)。

我想在不改变 tmux 可执行文件最初运行方式的情况下做到这一点,并且完全以每个用户的方式(所有更改仅限于/home/$USER/)。

我如何努力实现它

Ubuntu 16.04 TMUX 2.1 (from package manager)

ssh我在本地系统(Windows 10)上使用 MS 的端口(OpenSSH)。

目前,当我打开远程终端(或本地终端)时,tmux 会通过启动~/.zprofile并创建一个全新的会话。我有一个~/.tmux.conf包含以下行的文件:

#(this is a single line in my .tmux.conf, I've broken it up here for readability)

if-shell 'tmux has-session -t theonering' \
    'new-session -t theonering'           \
    'rename-session theonering'

我也在destroy-unattached on第二行中设置了会话级别,但是为了清晰起见,我在这里省略了它。它不会改变结果。

我期望发生什么

据我所知,这意味着“如果在 shell 中 tmux 说它有一个名为 的会话,theonering则创建一个新的(未命名的)会话并将其与 分组theonering。如果 tmux 没有名为 的会话,theonering则将当前会话重命名为theonering。”

实际情况

现在,如果我远程连接,脱离现有会话,然后运行上述命令(tmux显然以 为前缀)?效果很好。

但如果我把它放在我的~/.tmux.conf? bupkiss 中。就好像这条线根本不存在一样。没有错误,没有消息,没有偏离库存行为。

答案1

我找到了一种方法,可以做我想做的事情,但又不是真的,自从我发布这篇文章以来,我一直在使用这种方法。然而,我最近偶然发现了一个似乎完全没有文档记录的功能,它可以让我实现我想要的功能:

function smartgrpsc {
  GRPSC_GID=${1:=grpsc}
  GRPSC_CID=${GRPSC_GID}-$(date +'%H%M%S')
  if ! tmux has-session -t ${GRPSC_GID} &>/dev/null; then
    tmux new-session -d -s ${GRPSC_GID}
  fi
  tmux new-session -d -t ${GRPSC_GID} -s $GRPSC_CID \; set-option destroy-unattached \; attach-session -t $GRPSC_CID
}

if ! [[ -n "${TMUX}" || "${TERM}" =~ "tmux.*" || "${TERM}" =~ "screen.*" ]]; then
  # we are (probably) not in a tmux session
  smartgrpsc
  sleep 5
  exit
fi

秘诀是\;s(转义分号),它会导致将new-session后面的内容作为 tmux 命令传递给正在创建的 tmux 会话。这解决了我之前面临的先有鸡还是先有蛋的问题。它允许我创建一个会话,更改其设置,然后然后通过从启动会话的同一脚本向新的 tmux 会话发送命令(因此在会话之外运行)来附加到它。这样就不用在会话启动后试图弄清楚我在哪个会话中,而这似乎无法从.tmux.conf.

.zshrc通过将以上内容放在我的(或等)的顶部.bashrc

  1. 它会进行多次检查,看看它是否在 tmux 会话内
  • 如果不是,则运行该smartgrpsc函数
    1. 生成会话组名(上述情况下为默认)
    2. 根据组名和当前时间生成会话名称(以防止会话 ID 冲突)。
    3. 检查会话是否以...开头或等于组名存在。(这是对 的会话名称的独特处理has-session。属于该组的会话通常以组名开头。同样记录不全。)
    • 如果没有,它会创建一个新的命名且分离的 tmux 会话(使用组名)。
    • 除此之外什么也没有
    1. 最后,同时:
    • 在同一组中创建另一个新的、分离的会话
    • 当没有更多客户端连接时,将该会话设置为自毁
    • 附加到新创建的会话。
  • 除此之外什么也没有

最终效果正如我在上面的问题中所述。一个独立的、正在运行的“真实”会话,以及与该“真实”会话分组的每个登录的一个新的“查看器”会话,该会话可以看到它所看到的内容……但也可以更改它正在查看的窗口而不影响其他登录。当登录注销时,该“查看器”会话将被清理,而“真实”会话和所有其他“查看器”会话将继续。

相关内容