如何附加到第一个 tmux 会话没有附加客户端或者,如果没有未附加的会话,请创建一个新会话并附加到该会话?
(用例是我的终端模拟器在打开新终端窗口时运行的命令。我不希望它在每次打开窗口时创建一个新会话,如果周围有分离的会话。我也不希望它创建一个新会话。希望它每次都重新附加到同一个命名会话,如果已经有一个窗口附加到该会话,我希望它回收现有的未附加会话,但在没有未附加会话时创建新会话。)
答案1
可能有一种更简单的方法可以使用 tmux 本身来完成此操作,而无需求助于 shell 脚本。但我通过组合几个脚本让它工作起来。
第一个脚本打印出第一个未附加会话的名称。这是,tmux-first-unattached-session
:
#!/usr/bin/env sh
# Print the name of the first tmux session that has no clients attached.
tmux ls -F '#{session_name}|#{?session_attached,attached,not attached}' 2>/dev/null | grep 'not attached$' | tail -n 1 | cut -d '|' -f1
第二个脚本附加到第一个未附加的会话或新会话:
#!/usr/bin/env sh
# Attach to the first tmux session that has no attached clients.
# If there are no unattached sessions, then create a new session.
tmux attach -t `,tmux-first-unattached-session` 2> /dev/null || tmux
答案2
我有这样的东西,非常简单。
- 检测是否有未附加的会话,尝试附加
- 否则开始一个干净的会话
# Start TMUX first; try to reattach a session
if [[ -z $TMUX ]]; then
ATTACH_OPT=$(tmux ls | grep -vq attached && echo "attach -d")
exec eval "tmux $ATTACH_OPT"
fi
答案3
我创建了一个tmux2
脚本来处理这个问题:
#!/bin/bash
#
# tmux2 - attach to first unattached session or
# create new session if none are found
#
N=$(tmux ls | grep -v attached | head -1 | cut -d: -f1)
if [[ ! -z $N ]]
then
ATTACH_OPTS="attach -t $N"
fi
exec tmux -CC $ATTACH_OPTS
就我而言,我使用它与我的 Mac 进行 iterm 连接。连接设置如下:
现在,如果我的终端会话断开,我只需重新连接,它就会从我留下的地方恢复。