111

I would like my default bash shell to go straight into tmux instead of my always having to type tmux every time.

16 Answers 16

59

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
  • 2
    For me this also required [[ $- != *i* ]] && return to not being an infinite loop (from the same page) – Keith Smiley Apr 14 '13 at 1:45
  • 7
    This 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 the TMUX variable is set or not. – Kusalananda Dec 30 '16 at 13:21
  • Can confirm this works for zsh as well. – Telmo Trooper Jun 8 '20 at 12:47
154

@StarNamer's answer is generally accurate, though I typically include the following tests to make sure that (1) tmux exists on the system, (2) we're in an interactive shell, and (3) tmux doesn't try to run within itself:

if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
  exec tmux
fi

References

  • 1
    Nice, I have needed command before but didn't realize it existed. – Freedom_Ben Jun 21 '15 at 0:25
  • 3
    this exec statement doesn't let you exit tmux without quitting the entire terminal! :| – Louis Maddox Aug 2 '15 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 :) – Mark K Cowan Dec 8 '15 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 of tmux attach – user7089 Feb 20 '19 at 12:54
  • 12
    instead of exec tmux I use exec 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 using tmux attach in case there is no session available (found here: unix.stackexchange.com/a/176885/256942) – Verena Haunschmid Aug 13 '19 at 8:55
28

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 G Feb 3 '19 at 2:40
  • @MattG Feel like it's something wrong with the tmux configuration file. – huangzonghao Feb 3 '19 at 18:40
  • I was unable to login with this setting. Running Ubuntu 20.04. – Richard Jan 12 at 18:05
  • @Richard what's the error message? – huangzonghao Jan 12 at 18:59
  • After logging in, something would fail and take be back to the login screen. See my answer for a fix. – Richard Jan 13 at 19:33
6

Go to terminal preferances. enter image description here

And then click to "command" bar. enter image description here

Check the "Run a custom command instead of my sell" and write whatever command you want to execute at the startup of your terminal.

6

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:

https://unix.stackexchange.com/a/306165/198110

https://unix.stackexchange.com/a/113768/198110

5

There is command chsh which changes login shell. Consult man chsh.

  • 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. – Mikel Jul 20 '12 at 15:32
  • 1
    Although 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.st May 11 '14 at 2:11
  • 5
    tmux as of at least 1.8 on Ubuntu adds itself to /etc/shells, so it is a valid login shell. – claytron Mar 26 '15 at 17:14
  • 4
    This requires you configure the default-shell setting in the tmux configuration to point to an actual shell. – Kusalananda Jan 14 '17 at 13:35
5

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.

3

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 :) – Mark K Cowan Dec 8 '15 at 12:22
  • 1
    tmux new -A -s mysession will probably work too. – poolie Apr 22 '16 at 1:16
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 & – Daniel Chateau Oct 6 '15 at 20:21
2

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).

1

You could (and as of now probably should) use chsh command to set tmux as default shell, then add the following to .tmux.conf:

set-option -g default-shell /path/to/your/favourite/shell

Just remember to modify the path at the end of the line.

0

Add this into your ~/.tmux.conf

set -g default-command /usr/local/bin/fish
  • 5
    I think you misunderstood the question mate! ;) – PhilT May 6 '17 at 5:29
0

this make tmux open by default on all new shell of user

cmd='[ $TERM == screen ] || exec tmux'
echo -e "$cmd\n$(cat ~/.bashrc)" > ~/.bashrc
  • 1
    This is little more than a rewrite of the accepted answer, from eight years ago —  better answers have been posted since then. – G-Man Says 'Reinstate Monica' Mar 6 '20 at 7:50
0

The following solution is built upon the given solutions. It is a improvement on them and addresses few issues.

  1. If you are using a DE and try to use 'Right Click > Open In Terminal' then it will open in current location.

  2. What happens if you have multiple clients?

In the following solution:

first client always use session named default0
second client always use session named default1
third client always use session named default2
....

if you 'Right Click > Open In Terminal' and no session exists, then it will open new session in given directory. if you 'Right Click > Open In Terminal' and session exists, then it will attach and then cd to $PWD.

function tmux-as-default-terminal () {

  # If we are not inside tmux session 
  if command -v tmux &> /dev/null && [ -n "$PS1" ] && [ -z "$TMUX" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]]  
  then

    notmuxsession=$(tmux list-clients | wc -l)

    if tmux has-session -t default${notmuxsession}
    then
        tmux send-keys -t default${notmuxsession}:0.0 "^U"
        tmux send-keys -t default${notmuxsession}:0.0 "cd $PWD &> /dev/null" ENTER
        tmux send-keys -t default${notmuxsession}:0.0 "^L"
        tmux attach-session -t default${notmuxsession}:0.0
    else
        tmux new-session -s default${notmuxsession} -c $PWD
    fi
  fi

}

tmux-as-default-terminal

P.S. I have tested this code for few days before publishing here. However, if you find any bug and have any idea for improvement, then please let me know.

0

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; }
-3

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.

  • 2
    What your first paragraph describes is what chsh does! Except that your way requires being root and is error-prone. Running tmux from .bash_login is more likely to break remote logins. – Gilles 'SO- stop being evil' Jul 20 '12 at 23:10

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.