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


144

我试图弄清楚如何连接一个tmux session已命名的tmux会话,如果不存在,我想用给定的名称创建一个新的会话。

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

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

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

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


15
@kzh:我将其视为编程工具问题,例如vim

6
如果有人有兴趣,我已经针对这个问题写了另一个可能的答案:gist.github.com/chakrit/5004006
chakrit

9
同时,我man tmux说:“如果会话名称已存在,则-A标志使新会话的行为类似于附加会话”
Petr Viktorin

1
对于那些举报此问题的人,我应该注意,即使是主持人也不能将超过60天的问题迁移到另一个站点。该系统限制的原因进行了说明这里
布拉德·拉尔森

1
@BradLarson,目前,执行此操作的最佳/最简单的方法是在一条注释中给出答案:stackoverflow.com/questions/3432536/…。多数来这里的用户将无法找到该文件。从投票数可以看出,这显然是一个非常重要的问题。是否可以打开这个问题,所以我可以添加为一个答案,以便新人们找到它?
alpha_989

Answers:


89

或者,您可以添加

new-session

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

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


3
创建新会话时,默认路径是我的主目录,而不是从其中调用tmux的路径。
理查德·汉森

2
@AB:你是什么意思?
尔根·埃哈德

有没有办法解决@RichardHansen的问题?从当前路径调用似乎是最有意义的,如果new-session销毁它,那似乎是一个现实问题。
Lee Olayvar 2013年

2
如果您使用tmux config(source-file ~/.tmux.conf
则会

11
@SebastianBlask您可以使用该-A选项来new-session命名会话。new-session -A -s mysession将与配置重载一起很好地玩。
jkoelker '16

163

我弄清楚了(并指出了这一点)。

tmux attach || tmux new

28
这个答案对我来说效果更好,因为我可以将会话命名为:tmux attach-session -t my-session || tmux new-session -s my-session。唯一的问题是这不是原子的。tmux实际上应该有一个创建或附加命令。
安德鲁(Andrew)

5
我在bash中有下一个别名alias tm='tmux attach || tmux new'
azat

10
赞成,因为稍作调整,即可使用命名会话:tmux attach -t some_name || tmux new -s some_name。将some_name更改为$ 1,添加一个shebang,然后保存。
Cheezmeister 2014年

10
至于那些不熟悉TMUX和疑惑newVS new-session:他们是同义词,所以是attachattach-session
Esteis

1
tmux new-session -ds default \; split-window -dv 2>/dev/null; tmux attach -t default工作得更好,并且如果您/bin/kill是第一个,则不会打开第二个tmux 。唯一的缺点是您需要为此命名会话。
蒂诺

64

正如Petr Viktorinjkoelkerpjincz的评论中所指出的那样,可以使用以下命令来附加mySession它(如果存在)或创建它(如果不存在):

 tmux new -A -s mySession

来自man tmux

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

(别名:new

使用name创建一个新会话session-name

[...]

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

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


1
如果您打算以类似gnome-terminal命令的方式使用它,我建议-s您不要使用和特定的会话名称,这样您就不会在同一个gnome-terminal会话上附加每个新会话。prefix + s打开新终端后,您始终可以选择一个现有会话。
dragon788 '18

14

尽管我发现使用raponion的答案足以使用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 

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

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


8

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

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

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

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

这也类似于运行screen -xRR


2
如果您经常进出会话,这将留下很多未使用的会话,如所见tmux list-sessions
2012年

是的,确实如此,我不时清理它们。获得我想要的功能是一个小缺点。
迈克尔

嘿@ mateusz-piotrowski-我同意将代码包装在代码块中的编辑,但是为什么您要编辑其他文本以使其与我所说的有所不同?很抱歉在这里发表评论,但我看不到其他地方。
迈克尔

我不是故意要冒犯你的。我只是认为您无法配置文件中运行别名,因此它一定是拼写错误。
Mateusz Piotrowski

3
现在,您可以键入:tmux new -A -s default启动一个新会话(如果不存在)或自动附加。我认为这比编辑配置文件要好得多。
pjincz

1

对于那些谁想要在做同样的事情fish

tmux attach -t mysesh; or tmux new -s mysesh
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.