I wanted to start
tmux(1)—the terminal multiplexer—automatically when I
opened a new terminal window.
I had some specific requirements however. For instance, I wanted to have a
“main” tmux session that new windows should try to attach to. And if I was
already attached to the main tmux session, then I wanted any subsequent new
terminal windows to create new unnamed sessions (this way each window has its
own independent session).
- If the “main” session doesn’t exist, create a new session named “main”.
- If the “main” session exists and there are zero clients attached to it,
attach to it ourselves.
- If the “main” session exists and there is already a client attached to it,
create a new unnamed session.
I wrote a program to do this, since it seems like tmux’s built-in subcommands
and flags can’t account for these requirements on their own. The command
new -A -s main comes close but doesn’t meet the third requirement.
# mux: tmux session helper
# the name of the main session.
>/dev/null 2>&1 tmux has-session -t "$session"
if [ $? != "0" ]; then
# create named session.
tmux new -s "$session"
# attach to the existing one if it has zero clients,
# otherwise create an unnamed session.
nclients="$(tmux list-clients -t "$session" | wc -l | xargs)"
if [ $nclients = "0" ]; then
tmux attach -t "$session"
Save this script to a file like
$HOME/bin/mux and make it executable (
+x ...). Then either run the program in your shell’s rc file (but only if
$TMUX is unset to avoid nesting of tmux sessions), or use the “Run command
instead of my shell” option of your terminal emulator to run the program.