【问题标题】:How to create new tmux session if none exists如果不存在,如何创建新的 tmux 会话
【发布时间】:2010-08-07 23:58:03
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • @kzh:我把它看作一个编程工具的问题,就像vim一样
  • 我已经为这个问题写了另一个可能的答案作为要点,以防万一有人感兴趣:gist.github.com/chakrit/5004006
  • 同时,我的man tmux 说:“如果会话名称已经存在,-A 标志使新会话的行为类似于附加会话”
  • 对于那些标记要移动这个的人,我应该注意,即使是版主也不能将超过 60 天的问题迁移到另一个站点。这个系统限制的原因解释here
  • @BradLarson,目前,最好/最简单的选项在评论中得到回答,如下:stackoverflow.com/questions/3432536/…。大多数来这里的用户都找不到这个。这显然是一个非常重要的问题,从票数可以看出。是否可以打开这个问题,以便我可以将其添加为答案,以便新人可以找到这个?

标签: tmux


【解决方案1】:

我想通了 (and had it pointed out to me)。

tmux attach || tmux new

【讨论】:

  • 这个答案对我来说效果更好,因为我可以将会话命名为:tmux attach-session -t my-session || tmux new-session -s my-session。唯一的问题是这不是原子的。 tmux 真的应该有一个 create-or-attach 命令。
  • 我在 bash 中有下一个别名 - alias tm='tmux attach || tmux new'
  • 赞成,因为只需稍加调整,即可使用命名会话:tmux attach -t some_name || tmux new -s some_name。将 some_name 更改为 $1 添加一个 shebang,然后保存。
  • 注意那些不熟悉 tmux 并想知道 newnew-session 的人:它们是同义词,attachattach-session 也是同义词。
  • tmux new-session -ds default \; split-window -dv 2>/dev/null; tmux attach -t default 工作得更好,并且不会打开第二个 tmux,以防你 /bin/kill 第一个。唯一的缺点是您需要为此命名会话。
【解决方案2】:

或者,您可以添加

new-session

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

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

【讨论】:

  • 创建新会话时,默认路径是我的主目录,而不是调用 tmux 的路径。
  • @A.B:你的意思是哪个答案?
  • 有没有办法解决@RichardHansen 的问题?从当前路径调用似乎最有意义,如果 new-session 破坏了它,那么这似乎是一个真正的问题。
  • 这会破坏 tmux 配置重新加载以防您使用它 (source-file ~/.tmux.conf)
  • @SebastianBlask 如果你命名你的会话,你可以使用-A 选项到new-sessionnew-session -A -s mysession 可以很好地配合重新加载配置。
【解决方案3】:

正如 Petr Viktorinjkoelkerpjincz 的 cmets 中所指出的,您可以使用以下命令附加到 mySession(如果存在),如果存在则创建它不会:

 tmux new -A -s mySession

来自man tmux

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

(别名:new

创建一个名为 session-name 的新会话。

[...]

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

new-session has supported -A since tmux-1.8.

【讨论】:

  • 如果您打算在 gnome-terminal 这样的命令中使用它,我建议您不要使用 -s 和特定的会话名称,这样您就不会得到每个新的 @ 987654360@ 会话附加到同一会话。打开新终端后,您始终可以使用prefix + s 选择现有会话。
【解决方案4】:

根据 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-myproject.conf 是我的启动系列 tmux 命令,用于创建我的窗口和窗格,以及启动我的编辑器。

【讨论】:

    【解决方案5】:

    虽然我发现 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 
    

    【讨论】:

      【解决方案6】:

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

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

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

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

      这也类似于运行screen -xRR

      【讨论】:

      • 如果您经常进出会话,这会留下很多未使用的会话,如 tmux list-sessions 所见。
      • 是的,确实如此,我只是不时清理它们。获得我想要的功能是一个小缺点。
      • 嘿@mateusz-piotrowski - 我同意将我的代码包装在代码块中的编辑,但你为什么要编辑其他文本与我所说的不同?很抱歉在这里发表评论,但我没有看到其他任何地方。
      • 我不是故意冒犯你的。我只是觉得你不能运行一个别名in配置文件,所以它一定是一个错字。
      • 现在,您只需键入:tmux new -A -s default 以启动新会话(如果它不存在或自动附加)。我认为这比编辑配置文件要好得多。
      【解决方案7】:

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

      tmux attach -t mysesh; or tmux new -s mysesh
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多