How to start tmux with attach if a session exists

If I use

tmux attach

I can attach to a running session but if there is no session running, I only get the error

no sessions

How can I automatically start a new session if there is none running? something like

tmux attach-or-create-new-session
Asked By: rubo77


Drew Frank answered this here:

Here’s the script I now use for this (though, I’ve switched back to screen due to another issue with tmux) /somewhere/on/your/path/ttmux or as a shell function:

# many thanks to Drew Frank:
(tmux ls | grep -vq attached && tmux -2 at) || tmux -2

The -2 options make tmux assume 256 color terminal support, so those may not be appropriate for your situation.

Answered By: SuperMagic

Consider adding the following to your .bashrc

if [ -z "$TMUX" ]; then
    # 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
        tmux new-session -d -t $base_session -s $session_name
        tmux -2 attach-session -t $session_name ; set-option destroy-unattached
        tmux -2 attach-session -t $base_session

You can see my use of this in my ZSH resource file at my github repo

Answered By: sparticvs

This will start a new session if attach gives an error:

tmux attach || tmux new

So an alias will do the job:

tm="tmux attach || tmux new"
Answered By: rubo77

The answer is much simpler. Just put this in your ~/.tmux.conf file:

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

If you run tmux attach and there is a session, then it will attach to that session (whether it’s already attached or not). If there is not a session already then it will create one for you.

Answered By: Joe Casadonte

If naming your session is okay, then it’s easy to do with the new-session command:

tmux new-session -A -s main

where main is the session name that will be attached to or created if needed.

From man tmux:

The -A flag makes new-session behave like attach-session if session-name already exists;
in this case, -D behaves like -d to attach-session.

This can be shortened to rely on the default session name (which is 0):

tmux new -As0

Please also note that the -A option was introduced in tmux version 1.8 on 26 March 2013. For earlier versions, use:

tmux attach || tmux
Answered By: Wesley Baugh

If you’re using this inside a .shrc file or similar with exec I’d recommend

if tmux ls &> /dev/null; then
  exec tmux attach
  exec tmux
Answered By: Aaron J Lang

I improved on @SuperMagic answer a little. I put this block at the top of my .zshrc

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

To expand on Wesley Baugh’s answer (which was double-nesting sessions for me when used in .bashrc on logins) and add a bit of flexibility since I often use sudo -s on servers (which would dutifully load my .bashrc again and double nest), here’s what I have in my .bashrc:

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

This checks for a tmux session and makes sure you aren’t superuser before creating a new session or attaching to that existing one named main.

Answered By: Celsius1414

Here is an alternative solution from this blog. Works like a charm.


# 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

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

From man page

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.
Answered By: Levon

I did create this function, hope it helps!

tm() {
  local targetSession="$1"
  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
Answered By: Edgardo Arriagada

Use this:

$ tmux a || tmux

The || operator is the opposite of the && operator, meaning the second command is performed if the first one fails.

Make an aliast of it if it’s too long.

Answered By: MichaƂ Leon

Here’s a zsh script Eden Berger and I wrote to do this.

If any unused (no clients attached) tmux sessions exist, then tmux will attach to one of them (the first, sorted by their session id).
Otherwise, a new tmux session will start.

It also supports skipping tmux altogether if already in a tmux session or if SKIP_TMUX is set.
I find the latter useful because this snippet is at the top of my .zshrc.
So, to run my terminal without starting or attaching a tmux session, I can run an occasional SKIP_TMUX=1 alacritty.

#!/usr/bin/env zsh

if [ -z $TMUX ] && [ -z $SKIP_TMUX ]; then
  sessions=$(tmux list-sessions -F "#{session_attached}${delimiter}#{session_id}")
  unused_sessions=$(echo $sessions | grep ^0)
  unused_sessions_ids=$(echo $unused_sessions | cut --delimiter=$delimiter --fields=2)
  sorted_unused_sessions_ids=$(echo $unused_sessions_ids | sort --numeric)
  first_unused_session_id=$(echo $sorted_unused_sessions_ids | head --lines 1)
  if [ -z $first_unused_session_id ]; then
    exec tmux new-session
    exec tmux attach-session -t $first_unused_session_id

Answered By: mightyiam

this help me to open tmux when terminal opened and attach S1 if exist, if not exist: will be created

i have already a session called S1
for attach tmux to this session from .zshrc or .bashrc i’m add this in .zshrc|.bashrc

if [[ ! $TERM =~ screen ]]; then
    tmux attach -t tmux-ay || tmux new-session -s tmux-ay -n win1-ay
Answered By: nextloop
Categories: Answers Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.