150

我试图弄清楚如何附加到tmux session一个命名的 tmux 会话是否存在,如果不存在,我想创建一个具有给定名称的新会话。

目前,我知道一些tmux命令可以部分实现我正在寻找的东西,但不清楚如何将它们组合在一起以获得我正在寻找的东西:

  • tmux attach附加到一个自动存在的会话 - 但如果不存在会话则会出错
  • tmux new创建一个新会话 - 但它每次都会这样做,所以我不能把它留在我的.tmux.conf
  • tmux has-session测试会话是否存在 - 但我不知道如何将它与其他命令拼接在一起

因此,我想创建一个 tmux 脚本,以便自动发生,而不是每次我需要登录会话时都必须手动创建它。

如何编写自动脚本以创建新的 tmux 会话(如果给定的会话名称不存在)或附加到会话名称(如果存在)?

4

7 回答 7

168

我想通了(并让它指出给我)。

tmux attach || tmux new
于 2010-08-08T01:31:10.983 回答
89

或者,您可以添加

new-session

到您的.tmux.conf- 这将在服务器启动时创建一个默认会话。

然后tmux attach将附加到当前会话(即正在运行的服务器),或者创建一个新会话(启动服务器,读取配置文件,发出new-session命令)并附加到该会话。

于 2011-01-17T20:49:08.730 回答
86

正如Petr Viktorin 、jkoelkerpjincz的评论中所指出的,如果它存在,您可以使用以下命令附加,mySession如果不存在则创建它:

 tmux new -A -s mySession

来自man tmux

new-session[-AdDEP] [-cstart-directory] [-Fformat] [-nwindow-name] [-ssession-name] [-tgroup-name] [-xwidth] [-yheight] [shell-command]

(别名new:)

使用 name 创建一个新会话session-name

[...]

-A标志使new-session行为就像attach-session已经session-name存在一样;在这种情况下,表现-D得像.-dattach-session

new-session-A从 tmux-1.8开始支持

于 2018-03-06T15:52:57.030 回答
15

适应 Alex 的建议以在启动时包含基于项目的配置,我开始使用以下内容:

# ~/bin/tmux-myproject shell script
# The Project name is also used as a session name (usually shorter)
PROJECT_NAME="myproject"
PROJECT_DIR="~/myproject"

tmux has-session -t $PROJECT_NAME 2>/dev/null
if [ "$?" -eq 1 ] ; then
    echo "No Session found.  Creating and configuring."
    pushd $PROJECT_DIR
    tmux new-session -d -s $PROJECT_NAME
    tmux source-file ~/bin/tmux-${PROJECT_NAME}.conf
    popd
else
    echo "Session found.  Connecting."
fi
tmux attach-session -t $PROJECT_NAME

我的启动系列 tmux 命令在哪里tmux-myproject.conf创建我的窗口和窗格,以及启动我的编辑器。

于 2012-08-16T19:12:25.717 回答
14

尽管我发现 rampion 的答案足以使用 1 个会话,但此脚本可让您设置多个会话:

SESSIONS="work play"

function has-session {
    tmux has-session -t $1 2>/dev/null
}

function except 
{
    if [ "$?" -eq 1 ] ; then
        $1
    fi
}

# Configure your sessions here
function session-work
{
    tmux new-session -d -s work
    tmux neww -k -t work:1
}

function session-play
{
    tmux new-session -d -s play
    tmux neww -k -t play:1
}

#
#MAIN 
for x in $SESSIONS
do
    echo $x
    has-session $x
    except session-$x
done

笔记:

-k  --> new-window will not be created if already exists
-d  --> start session or window, but don't attach to it yet
-s  --> name the session
-t  --> specify a target location in the form session:window.pane 
于 2011-08-29T14:46:58.937 回答
9

如果需要,我使用别名创建一个新会话,如果它已经存在,则附加到我的默认会话:

alias tmuxre='tmux new-session -t default || tmux new-session -s default'

我将此添加到我服务器上的 .login 中。

我这样做的原因是因为我不想附加到同一个实际会话,我想要一个使用同一组窗口的新会话。

这也类似于跑步screen -xRR

于 2011-10-17T20:45:34.170 回答
2

对于那些想做同样事情的人fish

tmux attach -t mysesh; or tmux new -s mysesh
于 2018-05-07T00:21:39.943 回答