如果我使用

tmux attach


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

no sessions


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

tmux attach-or-create-new-session


评论

相关:stackoverflow.com/questions/3432536/…

#1 楼

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

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


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

评论


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

–布鲁诺·波拉科(Bruno Polaco)
2014年11月23日23:35



因此,您必须添加一个别名别名tmux =“ tmux attach”来防止此问题

–rubo77
15年3月21日在15:07



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

–rubo77
16-09-26在3:14

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

–rovr138
17 Mar 24 '17 at 17:05

#2 楼

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

main开始:


如果会话名称已经存在,则man tmux标志使-A的行为类似于new-session;在这种情况下,attach-session的行为类似于-D-d


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

评论


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

–阿里·帕特里克(Ari Patrick)
15年3月21日在14:10

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

– Jeroen Wiert Pluimers
15-10-14在10:40



tmux:未知选项-A这似乎仅在最新版本中可用。

– xApple
16 Mar 26 '16 at 18:15

[-z“ $ TMUX”] && exec tmux new -As。这就是我在.bashrc中使用的。

–ryenus
17年11月24日在3:26

如果通常只使用一个会话,则默认名称为0,因此您可以执行以下操作:tmux new-session -A -s 0。

– Ciro Santilli郝海东冠状病六四事件法轮功
19年3月31日在12:19

#3 楼

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

tmux attach || tmux new


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

tm="tmux attach || tmux new"


评论


您甚至可以通过将tmux附件更改为tmux a来使其更短

–布鲁诺·波拉科(Bruno Polaco)
2014年11月24日10:46

虽然这是可行的,但Wesley Baugh的解决方案使用tmux的内置功能来完成相同的操作

–阿里·帕特里克(Ari Patrick)
2015年3月21日14:08



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

–克里斯托弗·彼得森(Christopher Peterson)
19年1月16日在14:35

#4 楼

考虑将以下内容添加到您的.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 repo的ZSH资源文件中看到我的使用情况

#5 楼

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

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


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

#6 楼

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色端子,因此可能不支持适合您的情况。

#7 楼

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

if tmux ls
  exec tmux attach
else
  exec tmux
fi


评论


有关更深入的示例,请参见github.com/aaronjameslang/dotfiles/blob/master/.zshrc

–亚伦·J·朗(Aaron J Lang)
16-11-22在11:38

不只是tmux && exec tmux attach ||的等效项exec tmux?

– Pablo A
20-05-28在6:06

#8 楼

我对@SuperMagic的回答有所改进。我将此块放在我的.zshrc的顶部

if [[ $TMUX = "" ]]; then
  # try to reattach sessions
  tmux ls | grep -vq attached && TMUXARG="attach-session -d"
  exec eval "tmux -2 $TMUXARG"
fi


#9 楼

我确实创建了此功能,希望对您有所帮助!
tm() {
  local targetSession=""
  local DEFAULT_SESSION="main"

  [ -z "$targetSession" ] && targetSession="$DEFAULT_SESSION"

  tmux attach-session -t "$targetSession">/dev/null 2>&1 || \
    tmux new -s "$targetSession">/dev/null 2>&1
}

# If any, complete with a list of current tmux sessions
complete -C "tmux ls 2>&1 | cut -d':' -s -f1" tm


#10 楼

这是此博客的替代解决方案。

 session="main"

# Check if the session exists, discarding output
# We can check $? for the exit status (zero for success, non-zero for failure)
tmux has-session -t $session 2>/dev/null

if [ $? != 0 ]; then
  # Set up your session
fi

# Attach to created session
tmux attach-session -t $session
 


摘自手册页

has-session [-t target-session] (alias: has)
Report an error and exit with 1 if the specified session does not exist.
If it does exist, exit with 0.