如果不存在,如何创建新的tmux会话

ram*_*ion 137 tmux

我试图找出如何附加到一个tmux session命名的tmux会话,如果不存在,我想创建一个具有给定名称的新会话.

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

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

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

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

ram*_*ion 157

我弄明白了(并指出了我).

tmux attach || tmux new
Run Code Online (Sandbox Code Playgroud)

  • 这个答案对我来说效果更好,因为我可以命名会话:`tmux attach-session -t my-session || tmux new-session -s my-session`.唯一的问题是这不是原子的.tmux真的应该有一个create-or-attach命令. (26认同)
  • 注意那些不熟悉tmux并且想知道`new` vs`new-session`的人:他们是同义词,`attach`和`attach-session`也是如此. (10认同)
  • Upvoting因为有一个小的调整,这适用于命名会话:`tmux attach -t some_name || tmux new -s some_name`.将some_name更改为$ 1添加一个shebang,然后保存. (9认同)
  • 我在bash中有下一个别名 - "alias tm ='tmux attach || tmux new'` (5认同)

Leo*_*sov 87

或者,您可以添加

new-session
Run Code Online (Sandbox Code Playgroud)

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

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

  • @SebastianBlask如果你命名你的会话,你可以使用`-A`选项来'new-session`.`new-session -A -s mysession`可以很好地配置重新配置. (11认同)
  • 当这创建一个新会话时,默认路径是我的主目录,而不是调用tmux的路径. (3认同)
  • @AB:你的意思是哪个答案? (2认同)
  • 这会打破tmux配置重新加载,以防你使用它(`source-file~/.tmux.conf`) (2认同)

alp*_*989 51

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

 tmux new -A -s mySession
Run Code Online (Sandbox Code Playgroud)

来自man tmux:

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

(别名:new)

使用名称创建新会话session-name.

[...]

-A标志使new-session行为类似attach-session,如果session-name已经存在; 在这种情况下,-D行为就像-dattach-session.

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

  • 确实,这应该是公认的答案. (3认同)

Ale*_*dio 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
Run Code Online (Sandbox Code Playgroud)

注意:

-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 
Run Code Online (Sandbox Code Playgroud)


Anm*_*Anm 13

在启动时调整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
Run Code Online (Sandbox Code Playgroud)

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


Mic*_*ael 8

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

alias tmuxre='tmux new-session -t default || tmux new-session -s default'
Run Code Online (Sandbox Code Playgroud)

我把它添加到我服务器上的.login中.

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

这也类似于跑步screen -xRR.

  • 到目前为止,您只需键入:`tmux new -A -s default`即可启动新会话(如果不存在或自动附加).我认为它比编辑配置文件要好得多. (3认同)
  • 如果您经常进入和离开会话,这将留下大量未使用的会话,如`tmux list-sessions`所示. (2认同)