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

我试图找出如何附加到一个 tmux session,如果一个命名的 tmux 会话存在,如果没有,我想创建一个新的与给定的名称。

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

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

因此,我希望创建一个 tmux 脚本,这样就可以自动执行,而不必在每次需要登录到会话时手动创建它。

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

77561 次浏览

我弄明白了(然后指给我看)。

tmux attach || tmux new

或者,您可以添加

new-session

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

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

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

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

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

我把它添加到我的服务器上的. login 中。

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

这也类似于运行 screen -xRR

根据 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 命令的启动程序,用于创建窗口和窗格以及启动编辑器。

正如在 彼得・维克多林JkoelkerPjincz的注释中指出的,如果 mySession存在,可以使用以下命令附加到它,如果不存在,可以创建它:

 tmux new -A -s mySession

来自 man tmux:

new-session [-AdDEP] [-c[-AdDEP] [-c8] [-F[-AdDEP] [-c9] [-nstart-directory0] [-sstart-directory1] [-tstart-directory2[-AdDEP] [-c1start-directory3start-directory4[-AdDEP] [-c5start-directory5[-AdDEP] [-c7

(化名: new)

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

[...]

如果 session-name已经存在,则 -A标志使 new-session的行为类似于 attach-session; 在本例中,-D的行为类似于 -dattach-session

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

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

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