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


Answers:


51

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

# if run as "tmux attach", create a session if one does not already exist
new-session -n $HOST

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


11
这是一个巧妙的技巧,但有一个警告:如果tmux在不带参数的情况下调用它,它将创建一个新会话,然后在到达您的这一行时立即创建第二个会话~/.tmux.conf。您可以通过tmux ls在创建第一个会话后执行来查看此问题。实际上,将其放入文件中后,您将无法再不tmux带任何参数调用
Bruno Polaco,2014年

4
因此,您必须添加别名alias tmux="tmux attach"以防止出现此问题
rubo77

@BrunoPolaco:什么是最大的警告,始终有一个额外的空tmux会话运行(除此之外,它在任务列表中看起来并不整洁)?
rubo77

@ rubo77资源。有些人在启动时会创建一些默认工具,窗口,窗格等tmux
rovr138

129

如果可以命名您的会话,那么使用以下new-session命令很容易:

tmux new-session -A -s main

main如果需要,将在何处附加或创建会话名称。

来自man tmux

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

另请注意,此-A选项自2013年3月26日起tmux版本中1.8引入,对于早期版本,请使用tmux attach || tmux


10
+1,用于使用内置功能并提供人工文档摘要
Ari Patrick

1
在我的别名列表中:alias "tmux-attach-or-create-main-session=tmux new-session -A -s main"。谢谢你的提示!手册页:openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/tmux.1
Jeroen Wiert Pluimers

tmux: unknown option -- A这似乎仅在最新版本中可用。
xApple

这是我使用的方法,但是您不能再使用“ tmux detach”。您需要使用快捷键<ctrl> b-d保存并退出现有会话。
杰西(Jess)

2
[ -z "$TMUX" ] && exec tmux new -As .这就是我用在我的.bashrc
ryenus

30

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

tmux attach || tmux new

因此,别名将完成这项工作:

tm="tmux attach || tmux new"

你甚至可以把它缩短改变tmux attachtmux a
布鲁诺Polaco

尽管此功能有效,但Wesley Baugh的解决方案使用tmux的内置功能来完成相同的操作
Ari Patrick

之前,这似乎是较早版本的最佳答案,在引入-A之前(例如v1.6)
Christopher Peterson

3

考虑将以下内容添加到您的 .bashrc

if [ -z "$TMUX" ]; then
    base_session='my_session'
    # Create a new session if it doesn't exist
    tmux has-session -t $base_session || tmux new-session -d -s $base_session
    # Are there any clients connected already?
    client_cnt=$(tmux list-clients | wc -l)
    if [ $client_cnt -ge 1 ]; then
        session_name=$base_session"-"$client_cnt
        tmux new-session -d -t $base_session -s $session_name
        tmux -2 attach-session -t $session_name \; set-option destroy-unattached
    else
        tmux -2 attach-session -t $base_session
    fi
fi

您可以在我的github存储库的 ZSH资源文件中看到我对此的使用


2

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

if [ -z "$TMUX" ] && [ ${UID} != 0 ]
then
    tmux new-session -A -s main
fi

这会检查tmux会话,并确保您不是超级用户,然后再创建新会话或将其附加到名为的现有会话main


1

Drew Frank在这里回答了这个问题:https : //superuser.com/questions/487363/tmux-equivalent-of-screen-r

这是我现在用于此的脚本(尽管由于tmux的另一个问题,我已切换回屏幕)/somewhere/on/your/path/ttmux或作为shell函数:

#!/bin/sh
# many thanks to Drew Frank: https://superuser.com/questions/487363/tmux-equivalent-of-screen-r
(tmux ls | grep -vq attached && tmux -2 at) || tmux -2

这些-2选项使tmux假定支持256色终端,因此这些可能不适用于您的情况。



1

我对@SuperMagic的回答有所改进。我把这个方块放在我的顶部.zshrc

if [[ $TMUX = "" ]]; then
  # try to reattach sessions
  tmux ls | grep -vq attached && TMUXARG="attach-session -d"
  exec eval "tmux -2 $TMUXARG"
fi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.