如果会话存在,如何使用附加启动 tmux

rub*_*o77 156 tmux

如果我使用

tmux attach
Run Code Online (Sandbox Code Playgroud)

我可以附加到正在运行的会话,但如果没有运行会话,我只会收到错误

no sessions
Run Code Online (Sandbox Code Playgroud)

如果没有运行,如何自动启动新会话?就像是

tmux attach-or-create-new-session
Run Code Online (Sandbox Code Playgroud)

小智 223

如果命名会话没问题,那么使用以下new-session命令很容易:

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

main如果需要,将附加到或创建的会话名称在哪里。

来自man tmux

-A标志使new-session行为很像attach-session,如果会话的名称已经存在; 在这种情况下,-D行为就像-dattach-session

这可以缩短为依赖默认会话名称(即0):

tmux new -As0
Run Code Online (Sandbox Code Playgroud)

另请注意,该-A选项于2013 年 3 月 26 日tmux 版本1.8中引入。对于早期版本,请使用:

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

  • `[ -z "$TMUX" ] && exec tmux new -As .` 这是我在我的 `.bashrc` 中使用的。 (3认同)
  • 如果你通常只使用一个会话,它的默认名称是 `0`,所以你可以这样做:`tmux new-session -A -s 0`。 (3认同)
  • 在我的别名列表中:`alias "tmux-attach-or-create-main-session=tmux new-session -A -s main"`。谢谢你的提示!手册页:http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/tmux.1 (2认同)
  • 作为屏幕转换程序,此命令与“screen -xR main”相比太长了。它可以缩写为 `tmux new -As main`,只需 2 个额外字符即可接受。 (2认同)

小智 72

答案要简单得多。只需将其放入您的~/.tmux.conf文件中:

# if run as "tmux attach", create a session if one does not already exist
new-session -n $HOST
Run Code Online (Sandbox Code Playgroud)

如果您运行tmux attach并且有一个会话,那么它将附加到该会话(无论它是否已经附加)。如果还没有会话,那么它会为您创建一个。

  • 这是一个巧妙的技巧,但有一个警告:如果在没有参数的情况下调用 `tmux`,它将创建一个新会话,然后在它到达你的 `~/.tmux.conf` 中的这一行时创建第二个会话。您可以通过在创建 **first** 会话后执行 `tmux ls` 来查看此问题。实际上,将其放入文件后,就不能再不带参数地调用 `tmux` (17认同)
  • 所以你必须添加一个别名 `alias tmux="tmux attach"` 来防止这个问题 (5认同)

rub*_*o77 45

如果 attach 出现错误,这将启动一个新会话:

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

所以别名将完成这项工作:

tm="tmux attach || tmux new"
Run Code Online (Sandbox Code Playgroud)


Aar*_*ang 5

如果您在 .shrc 文件或类似文件中使用它,exec我建议

if tmux ls &> /dev/null; then
  exec tmux attach
else
  exec tmux
fi
Run Code Online (Sandbox Code Playgroud)


小智 5

为了扩展 Wesley Baugh 的答案(在登录时在 .bashrc 中使用时对我来说是双重嵌套会话)并增加一点灵活性,因为我经常sudo -s在服务器上使用(这会尽职尽责地再次加载我的 .bashrc 并双重嵌套),这里是我的 .bashrc 中有什么:

if [ -z "$TMUX" ] && [ ${UID} != 0 ]
then
    tmux new-session -A -s main
fi
Run Code Online (Sandbox Code Playgroud)

这会检查 tmux 会话并确保您在创建新会话或附加到名为main.