Which Shell Am I Using? How Can I Switch?

Finding your current shell

In macOS Catalina, the default shell is the Z shell (zsh). In previous macOS versions, the default was Bash. Each shell supports a configuration file in your home folder that gets read every time you open a new terminal window (or tab). This allows the shell environment to be set up properly with your preferences, and so that the tools you depend on are ready to use. In zsh, the configuration file is ~/.zshrc. In bash, it's ~/.bash_profile.1 If you're not sure which shell you're using, you can find out by running this command:

echo $0

Changing shells

If you want to switch between shells to explore the differences, or because you know you want one or the other, use these commands:

Switch to bash

chsh -s $(which bash)

Switch to zsh

chsh -s $(which zsh)

What the $() syntax does is it runs what's inside the parentheses (such as which bash), saves the output, and passes it to chsh -s. This is convenient when you don't know the exact path to the bash or zsh command.

This will prompt you for your macOS password. For the change to take effect, you need to open a new terminal tab, or quit and restart your terminal app.

Important Note

When you switch shells, if you expect to have the same configuration, make sure to copy the contents of ~/.bash_profile into ~/.zshrc or vice versa. Also look out for any code that is not compatible with both shells.

Possible error scenario

If you get a message about a non-standard shell, that means that your shell is not listed in /etc/shells. This can happen after installing a shell with Homebrew, which is a reasonable thing to do because you can get a newer version than the one that came with macOS.

To make macOS aware of the Homebrew version of a shell, it needs to be added to /etc/shells. Here's how you would safely add Homebrew's zsh:

Find the path of the Homebrew zsh:

which zsh

Open /etc/shells in Sublime Text, or another code editor, but not TextEdit:

open /etc/shells -a "Sublime Text"

Copy and paste the output of which zsh at the bottom of /etc/shells and save the file. This will prompt you for your macOS password. Run the chsh -s command again, and this time it should not complain. Remember to open a new tab to see the new shell.

Alternative

Another way to change shells is via the Terminal app preferences, by selecting the "Command (complete path)" radio button in the "Shells open with:" section as shown in the screenshot below:

Terminal Preferences for shells open with command

Note that this does not change your default login shell, which you can check by running echo $SHELL. You can test this by following these steps:

Set your login shell to zsh:

chsh -s $(which zsh)

At the top of your ~/.zshrc, add this line:

echo "hello from zsh"

At the top of your ~/.bash_profile, add this line:

echo "hello from bash"

If the file doesn't exist, you can create it with touch:

touch ~/.bash_profile

Update your Terminal preferences to open the shell with the command /bin/bash, as shown in the screenshot above.

Quit and restart Terminal.

You should see "hello from bash", but if you run echo $SHELL, you will see /bin/zsh.

I'm not sure if this affects anything while developing locally, so I would stick to the default settings and use chsh -s to switch shells.


  1. Bash also has .bashrc, but it doesn't get read automatically on macOS.