I would like my default bash shell to go straight into tmux instead of my always having to type tmux every time.
18 Answers
@StarNamer's answer is generally accurate, though I typically include the following tests to make sure that
tmux
exists on the system- we're in an interactive shell, and
tmux
doesn't try to run within itself
So, I would add this to the .bashrc
:
if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
exec tmux
fi
References
- Using bash's
command
to check for existence of a command - http://man7.org/linux/man-pages/man1/bash.1.html#SHELL_BUILTIN_COMMANDS - Why to use
command
instead ofwhich
to check for the existence of commands - https://unix.stackexchange.com/a/85250 - Using
$PS1
to check for interactive shell - https://www.gnu.org/software/bash/manual/html_node/Is-this-Shell-Interactive_003f.html - Expected state of
$TERM
environment variable "for all programs running inside tmux" - http://man7.org/linux/man-pages/man1/tmux.1.html#WINDOWS_AND_PANES
-
1Nice, I have needed
command
before but didn't realize it existed. Jun 21, 2015 at 0:25 -
3this
exec
statement doesn't let you exit tmux without quitting the entire terminal! :| Aug 2, 2015 at 20:43 -
6@LouisMaddox:
exec
replaces the current process with a new one - in this case, it replaces the bash login shell with tmux, so when tmux exits then there is no other terminal to fall back to :) Dec 8, 2015 at 12:21 -
1@rjt That's correct, this starts a new session by design. If you prefer to attach to an existing tmux session simply replace
exec tmux
with your preferred flavor oftmux attach
– user7089Feb 20, 2019 at 12:54 -
23instead of
exec tmux
I useexec tmux new-session -A -s main
so I will always have a session called main and attach to it (instead of creating a new one everytime I connect to my remote machine) but it will not crash like usingtmux attach
in case there is no session available (found here: unix.stackexchange.com/a/176885/256942) Aug 13, 2019 at 8:55
Start tmux on every shell login, from Arch wiki, seems to work. Simply add the following line of bash code to your .bashrc
before your aliases; the code for other shells is very similar:
[[ $TERM != "screen" ]] && exec tmux
-
2For me this also required
[[ $- != *i* ]] && return
to not being an infinite loop (from the same page) Apr 14, 2013 at 1:45 -
10This is a bad solution since the
TERM
might be set to some other value by the user's.tmux.conf
file. Better to check whether theTMUX
variable is set or not.– Kusalananda ♦Dec 30, 2016 at 13:21 -
Adding a line like
[ -z "$TMUX" ] && { tmux attach || exec tmux new-session && exit;}
in your bashrc file will probably do the job. Note this line will exit ssh and terminate the connection once you detach or exit tmux. I like this configuration as it saves key strokes to terminate the connection. But if you don't love this(which I think is very unlikely) and would rather remain in the login shell after termination, just remove the exit
part:
[ -z "$TMUX" ] && { tmux attach || exec tmux new-session;}
Also note you shouldn't wrap tmux attach
with exec
, as this would cause the connection to be closed when there are no tmux sessions to attach to.
-
I've added this line to my .bashrc, but now when I start a terminal, I get some messages: /home/z/.tmux.conf:10: no current session (the message repeats for lines 11, 13, 14, 15). Those lines are things like "set default-command "exec bash"" and "set default-terminal "screen-256color".– Matt GFeb 3, 2019 at 2:40
-
@MattG Feel like it's something wrong with the tmux configuration file. Feb 3, 2019 at 18:40
-
-
-
After logging in, something would fail and take be back to the login screen. See my answer for a fix.– RichardJan 13, 2021 at 19:33
I'm successfully using
case $- in *i*)
[ -z "$TMUX" ] && exec tmux
esac
in my .zshrc
. If you're using bash, put it in your .bashrc
instead.
I also just tried setting tmux
as my default shell (chsh -s $(which tmux)
) and it seems to break direct command execution via SSH, e.g. ssh $some_server echo foo
will not produce any output.
-
-
1@AhmadIsmail
$-
contains the current shell options, includingi
if the shell is interactive (i.e. a user prompt is requested, rather than directly executing a command).case … in *i*)
is a fairly portable way to check if a variable contains the letteri
anywhere (no need to break outexpr
or[[
and regular expressions for something so simple).– n.stJul 12 at 4:39 -
1And for the last part,
$TMUX
is set inside tmux sessions, so we can check if it's unset/empty to only spawn tmux if we are not already inside a tmux session.– n.stJul 12 at 4:40
And then click to "command" bar.
Check the "Run a custom command instead of my sell" and write whatever command you want to execute at the startup of your terminal.
-
I tried this before getting here. However, I can't use the
tmux a || tmux new-session
command. When there's a session to connect, it connects, but, otherwise, the terminal closes immediately. This forced me to use another TTY to revert the configuration (which may be scary for newby users). Apr 10 at 12:41
I combined the extensive checks, with the conditional session checking, and put my own spin on it, to create a default session that is connected to or else created. Unless you are inside of another tmux session, or other protective conditions are met.
if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
tmux a -t default || exec tmux new -s default && exit;
fi
Based on these answers:
There is command chsh
which changes login shell. Consult man chsh
.
Make tmux
your login shell, but don't forget to configure the default-shell
setting for tmux
first!
Example of ~/.tmux.conf
:
set-option -g default-shell "/bin/bash"
You need to test this first, before setting tmux
as your login shell.
-
7
tmux
is not a shell, it's a terminal multiplexer like GNU screen. Interestingly, it does support the-c
option according to the man page, so it may work like a shell just enough to use it as your login shell, but I suspect it won't work properly in all situations, e.g. graphical logins via gdm/kdm.– MikelJul 20, 2012 at 15:32 -
1Although this is sensible and backed by the documentation, it seems to break direct command execution via SSH (something like
ssh $some_server echo foo
).– n.stMay 11, 2014 at 2:11 -
5tmux as of at least 1.8 on Ubuntu adds itself to
/etc/shells
, so it is a valid login shell.– claytronMar 26, 2015 at 17:14 -
5This requires you configure the
default-shell
setting in the tmux configuration to point to an actual shell.– Kusalananda ♦Jan 14, 2017 at 13:35
Adding to @Louis Maddox 's answer, I would execute tmux part with;
(exec tmux attach || exec tmux new-session)
-
I use
exec sh -c 'tmux a || tmux'
, which (after looking at your answer) will probably make bad things happen if tmux can't start for any reason..... thanks, I'll use yours from now on :) Dec 8, 2015 at 12:22 -
2
None of the above responses worked for me - exec tmux
prevents me closing tmux without quitting the shell (whether it's opened with Ctrl
+ T
or from the application menu).
I use Linux Mint, which lets you map certain hotkeys to commands, and (un-kosher as it may be to some..) I've got bash shells with commands starting up there, e.g. Win
+Alt
+B
does some sort of convoluted bash -exec(vim)
statement to edit my .bashrc, so it acts like a regular shell.
tmux loaded rather than vim under that situation after placing the above at the top of my .bashrc
. I've wrapped the tmux executing line in another if statement, checking that it's running in interactive mode.
if command -v tmux>/dev/null; then
if [ ! -z "$PS1" ]; then # unless shell not loaded interactively, run tmux
[[ ! $TERM =~ screen ]] && [ -z $TMUX ] && tmux
fi
fi
You could wrap all that onto one line but for readability I think that's fine.
-
Adding a ampersand would solved that issue like so.
[[ ! $TERM =~ screen ]] && [ -z $TMUX ] && exec tmux &
Oct 6, 2015 at 20:21
This is in my ~/.profile
(I'm using ksh93
):
if [[ -z "$TMUX" ]]; then
if tmux has-session 2>/dev/null; then
exec tmux attach
else
exec tmux
fi
fi
If the TMUX
environment variable is unset/empty, then we're not already in a tmux session, so...
If tmux has-session
returns with a zero exit status (true), there is an available session to attach to. Attach to it.
If not, create a new session.
It's also possible to use tmux
as your login shell. If you do this, however, make sure to set default-shell
to an actual shell in your ~/.tmux.conf
file (see the tmux manual for more info about this).
You could (and as of now probably should) use sudo chsh $(logname)
command to set /usr/bin/tmux
, or whatever is the path to it, as a default shell, then add the following to ~/.tmux.conf
:
set-option -g default-shell </path/to/your/favourite/shell>
-
Correct me if I'm wrong, but tmux ain't a shell, is a shell/screen multiplexer. What OP meant by "shell" is launching tmux by default, with the default shell in each pane. Point is, you can't set default-shell to tmux afaik because it ain't a shell and if you could anyway, it could result in tmux complaining about "tmux session inside a tmux session" if you would open a new pane inside tmux which would use the default shell.– EksapsyMay 2, 2021 at 12:37
-
@Eksapsy You are wrong. I have had my default shell set to
/usr/bin/tmux
for the last 5 years and that's how it is supposed to work, it doesn't complain about anything. After it fires up it starts another tmux session (see the second paragraph of man7.org/linux/man-pages/man1/tmux.1.html), and using the option mentioned above, it fires up ZSH in that session's window. You can have any binary whatsoever as your a login shell.tmux
does handle being login shell without an issue, even when logging in via SSH. May 2, 2021 at 13:25 -
@Eksapsy FTR, here's what
man tmux
says abouttmux -c
: Execute shell-command using the default shell. If necessary, the tmux server will be started to retrieve the default-shell option. This option is for compatibility with sh(1) when tmux is used as a login shell. May 2, 2021 at 13:36 -
Im sorry but to me your instructions didn't work either.
tmux
doesn't exist as a shell in/etc/shells
. I added it manually, even if you're not supposed to do that, andchsh
totmux
anyway. Didn't work again. Then addedset-option -g default-shell /usr/bin/zsh
. Didn't work either. The most important thing here though is, thattmux
didn't appear as a shell in/etc/shells
at all. Maybe I'm doing something wrong, but it only shows that this is not the default best way to do things? Usually when you install a shell it sets itself inside/etc/shells
on its own.– EksapsyMay 2, 2021 at 15:23 -
1
The following solution is built upon the given solutions. The difference being, If you are using a DE and try to use 'Right Click > Open In Terminal' then it will open in current location.
function tmux-as-default-terminal() {
if command -v tmux &> /dev/null && [[ -z "$TMUX" ]]
then
notmuxsession=$(tmux list-clients | wc -l)
if tmux has-session -t default${notmuxsession}
then
exec tmux attach-session -t default${notmuxsession} -c $PWD
else
exec tmux new-session -s default${notmuxsession} -c $PWD
fi
fi
}
tmux-as-default-terminal "$@"
this make tmux open by default on all new shell of user
cmd='[ $TERM == screen ] || exec tmux'
echo -e "$cmd\n$(cat ~/.bashrc)" > ~/.bashrc
-
1This is little more than a rewrite of the accepted answer, from eight years ago — better answers have been posted since then. Mar 6, 2020 at 7:50
I had an issue where I could not login (on Ubuntu 20.04). I added the following tweak to huangzonghao's answer:
# autoload tmux - place at EOF (end-of-file) within ~/.bashrc
# if shell is interactive, and TMUX var is set...
[[ $- == *i* ]] && [[ -z "${TMUX}" ]] && { tmux attach || exec tmux new-session && exit; }
Add the below line to ~/.config/fish/conf.d/omf.fish
if not set -q TMUX
set -g TMUX tmux new-session -d -s base
eval $TMUX
tmux attach-session -d -t base
end
The above worked on Fedora 34. However, on exit, only tmux is exited and the running session remains active.
There seem to be two classes of answers here:
Those that just "start tmux" (
exec tmux
) using various techniques and (preferably) wrappers for error handling. E.g.exec tmux
Those that first attempt to attach to an existing tmux and then fallback to the first method if an existing session doesn't exist. E.g.
tmux attach || exec tmux
.
This second method can be simplified and made more efficient with:
exec tmux new -A
The -A
flag to new
(short for new-session
):
- Checks to see if an existing tmux session exists
- Attaches to it if if so
- Starts a new session if not
In addition to being more concise than the longer form, it's also theoretically slightly more efficient, since tmux only has to start once, rather than potentially twice (once to check, again to actually run if it wasn't running).
I use a slightly longer form personally:
exec tmux new -AD -t main -s main
This:
- Makes sure that there is only one session-group and session running (named
main
) - Detaches any other running tmux client.
I do still recommend wrapping this in an if
statement per user7089's answer.
Add this into your ~/.tmux.conf
set -g default-command /usr/local/bin/fish
-
6
As Mikel already stated in his comment to have tmux as your login shell can have side effects. But you can make tmux
your default shell, literally. A user's default shell is defined in /etc/passwd. So you can become root and edit /etc/passwd, e.g. sudo vi /etc/passwd
search for the line that begins with your username. It probably ends with :/bin/bash
. Change /bin/bash to /usr/bin/tmux and now tmux is your default login shell.
However, no guarantee that this won't cause problems!
What may work better is to NOT do anything that requries root privileges. I would try to create a file in my home directoy named .bash_login and start tmux from within that file: `echo "tmux" >~/.bash_login.
This should work, but you have to try and find our yourself, b/c the bash documentation is not very exact about what file is read and executed when.
-
2What your first paragraph describes is what
chsh
does! Except that your way requires being root and is error-prone. Runningtmux
from.bash_login
is more likely to break remote logins. Jul 20, 2012 at 23:10