158

On a new setup, tmux is using bash instead of my default (zsh).

How can I force it to use zsh?

  • 12
    figured it out. Can set the following in tmux config: set -g default-command /bin/zsh set -g default-shell /bin/zsh – re5et Mar 6 '11 at 5:33
  • 4
    FWIW, you don't need to set default-command if you've set default-shell. – Nicholas Riley Feb 29 '12 at 20:03

10 Answers 10

207
set-option -g default-shell /bin/zsh

in ~/.tmux.conf or /etc/tmux.conf. Works on Fedora.

You can reload the config with <leader>: source-file <conf file> e.g.

<C-b>: source-file ~/.tmux.conf

You would need to do it for every tmux instance. Otherwise you may restart tmux with killall tmux; tmux

  • 6
    If this doesn't work for you then make sure you've restart tmux. Seems obvious but took me a good hour to figure out! – Andy Smith Sep 20 '12 at 20:55
  • 28
    BTW: Restarting tmux means killall tmux; tmux. Took me quite a while to figure out. – js-coder Dec 21 '12 at 14:48
  • 5
    Configs could be reloaded without killing a server: bind R source-file ~/.tmux.conf \; display-message " Config reloaded..". – ДМИТРИЙ МАЛИКОВ Jul 2 '13 at 8:01
  • 14
    Or simply run tmux source-file ~/.tmux.conf from the command line. – Petr Pudlák Oct 29 '14 at 12:43
  • 13
    @js-coder: to more cleanly kill your tmux server I'd recommend tmux kill-server instead. – Chuim Feb 13 '15 at 22:32
44

First ensure your default shell is set properly to zsh via running this in your command line:

chsh -s $(`which zsh`) $USER

Placing the folloowing in your ~/.tmux.conf is a more robust option for any shell.

set-option -g default-shell $SHELL
  • 1
    It is unnecessary to set user shell (chsh -s) as tmux offers an option independent of that. – Mahmoud Al-Qudsi May 30 '17 at 6:00
  • I thought it was more robust to use the $SHELL variable. But it adds an extra step and confusion so I do prefer the accepted answer. – DebugXYZ Jan 13 at 22:05
  • This is better than the accepted answer. My zsh is not installed in /bin/zsh. – HappyFace Aug 4 at 17:56
20

Drop this line in the bottom of your ~/.tmux.conf

set-option -g default-command "reattach-to-user-namespace -l zsh"

After you add that, kill and restart your tmux server and all should work.

  • 2
    Er, is there any indication that re5et (the OP) is on a Mac, or has that wrapper program installed? – Chris Johnsen Feb 1 '12 at 7:13
  • 1
    I think this answer only works for Mac OS X – EhevuTov Jul 25 '13 at 6:29
  • 5
    tmux kill-server is the command to end all tmux servers – Keith Smiley Oct 14 '13 at 17:05
  • 1
    Although it wasn't the answer the OP asked for, I ended up in this thread and indeed I am on OS X, using this wrapper, and this is the solution I needed; so Thank You! – Jose Alban Sep 24 '15 at 11:47
  • 1
    how does this differ from set-option -g default-shell ? the above does not seem to work with the Fish shell. – Tommy Feb 9 '16 at 1:50
6

If you want to force tmux to use the same shell as specified in your environment variable, you could use:

# force SHELL ENV variable as shell
set-option -g default-shell ${SHELL}

in your ~/.tmux.conf or /etc/tmux.conf.

To get the change to actually take effect, you may need to tmux kill-server and then tmux to restart tmux.

  • 1
    This is the only answer that worked for me (the tmux kill-server command) – undefined Jan 27 '18 at 0:30
5

tmux appears to use the SHELL environment variable, so the following should work:

SHELL=/usr/bin/zsh tmux

or

env SHELL=/usr/bin/zsh tmux
  • Not sure why this was down-voted. It appears to be correct: a common problem is using a different shell for e.g. iTerm but leaving login shell as /bin/bash to ensure nothing non-iteractive breaks. iTerm will not set $SHELL to the new shell name (unsure why), and bash initialisation will set it to the login shell if unset at startup. tmux then uses this value if default-shell is not set explicitly. – Sam Brightman Nov 4 '16 at 8:38
  • Yeah.. maybe env SHELL=/usr/bin/zsh tmux is better? (updated the answer). – blueyed Nov 6 '16 at 0:33
2

Use chsh(1):

chsh -s /bin/zsh $USER
  • 1
    i already had this set, but tmux was ignoring it. – re5et Mar 6 '11 at 5:33
2

Log-out and log-in again fixed my problem. When echoed $SHELL it was still /bin/bash but after log-out it was changed to /usr/bin/zsh

1

Add this into your ~/.tmux.conf

set -g default-command /usr/local/bin/fish
1

The accepted answer did not work for me.

I had to write both

set -g default-shell "/bin/bash"

and

set -g default-commanmd "/bin/bash"

in my ~/.tmux.conf — Dont forget to tmux kill-server; tmux, to reload the tmux.conf


Im am using tmux -V 2.6 under Ubuntu 18 in the gnome-shell emulator.

I also enhanced tmux with https://github.com/samoshkin/tmux-config. Check it out, it's really cool.

0

For me I had to replace:

default-command "/usr/local/bin/fish"
default-shell "/usr/local/bin/fish"

with

set-option -g default-command "/usr/local/bin/fish"
set-option -g default-shell "/usr/local/bin/fish"

in .tmux.conf and run command tmux kill-server; tmux

  • This is a duplicate of answer superuser.com/a/1370909/174140. – 174140 Sep 18 at 9:31
  • @john I've used set-option -g instead of set -g. different versions of tmux most probably – Ali Amin Sep 19 at 11:24
  • set is an alias for set-option. – 174140 Sep 19 at 11:28

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.