How to create new tmux session if none exists
-
26-09-2019 - |
문제
I am trying to figure out how to attach to a tmux session
if a named tmux session exists, if not I want to create a new one with the given name.
Currently, I know of a few tmux
commands which can partly achieve what I am looking for, but its not clear how to combine them together to get what I am looking for:
tmux attach
attaches to an automatically existing session - but errors out if no session existstmux new
creates a new session - but it does so every time, so I can't leave it in my.tmux.conf
tmux has-session
tests whether a session exists - but I don't know how to stitch it together with the other commands
Thus, I would like to create a tmux script, so that this happens automatically, instead of having to manually create it everytime I need to log into a sessions.
How can I write a automatic script so as to create a new tmux session (if a given session name doesnt exist) or attach to a session name (if it exists)?
해결책
Alternately, you can add
new-session
to your .tmux.conf
- that will create a default session on server start.
Then tmux attach
will either attach to the current session (running server, that is), or create a new session (start the server, read the config file, issue the new-session
command) and attach to that.
다른 팁
I figured it out (and had it pointed out to me).
tmux attach || tmux new
As pointed out in comments from Petr Viktorin, jkoelker and pjincz, you can use the following command to attach to mySession
if it exists, and to create it if it doesn't:
tmux new -A -s mySession
From man tmux
:
new-session
[-AdDEP] [-c
start-directory
] [-F
format
] [-n
window-name
] [-s
session-name
] [-t
group-name
] [-x
width
] [-y
height
] [
shell-command
]
(alias:
new
)Create a new session with name
session-name
.[...]
The
-A
flag makesnew-session
behave likeattach-session
ifsession-name
already exists; in this case,-D
behaves like-d
toattach-session
.
Although I find rampion's answer is sufficient for using 1 session, this script lets you setup multiple sessions:
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
NOTE:
-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
Adapting Alex's suggestion to include project based configuration upon startup, I started using the following:
# ~/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
where tmux-myproject.conf
is my startup series of tmux commands to create my windows and panes, as well as start my editors.
I use an alias to create a new session if needed, and attach to my default session if it already exists:
alias tmuxre='tmux new-session -t default || tmux new-session -s default'
I added this to my .login on my server.
The reason I do it this way is because I don't want to attach to the same actual session, I want a new session which uses the same group of windows.
This is also similar to running screen -xRR
.
For those who want to do the same thing in fish
:
tmux attach -t mysesh; or tmux new -s mysesh