Modern Macs use zsh by default. It's the right choice for most people. Here's how the popular shells compare.

Quick Comparison

Feature zsh bash fish
Mac default Yes (2019+) Before 2019 No
Tab completion Excellent Basic Excellent
Syntax highlighting With plugins With plugins Built-in
POSIX compatible Mostly Yes No
Config file ~/.zshrc ~/.bash_profile ~/.config/fish/config.fish
Plugin ecosystem Oh My Zsh Limited Fisher, Oh My Fish

zsh (Z Shell)

The Mac default since Catalina (2019).

Pros:

  • Excellent tab completion
  • Spelling correction
  • Rich plugin ecosystem (Oh My Zsh)
  • POSIX-compatible (most bash scripts work)
  • Good balance of features and compatibility

Cons:

  • Slower startup with many plugins
  • Some minor bash incompatibilities

Best for: Mac users who want features without compatibility issues.

bash (Bourne Again Shell)

The classic. Default on Linux and older Macs.

Pros:

  • Most compatible - scripts work everywhere
  • Huge documentation and community
  • Simpler, predictable
  • Comes with Mac (older version)

Cons:

  • Mac ships outdated version (3.2 from 2007)
  • Fewer modern features
  • Tab completion is basic
  • Updating requires Homebrew

Best for: People who write scripts for multiple systems, or prefer simplicity.

fish (Friendly Interactive Shell)

A modern shell focused on user experience.

Pros:

  • Syntax highlighting out of the box
  • Autosuggestions based on history
  • Web-based configuration
  • Helpful error messages
  • Easy to learn

Cons:

  • Not POSIX compatible - bash scripts won't run
  • Smaller community
  • You'll need to translate bash examples
  • Some tools assume bash/zsh

Best for: People who primarily use the shell interactively (not scripting).

Check Your Current Shell

echo \$SHELL
  • /bin/zsh - You're using zsh
  • /bin/bash - You're using bash
  • /usr/local/bin/fish - You're using fish

Switching Shells

To bash:

chsh -s /bin/bash

To zsh:

chsh -s /bin/zsh

To fish (install first):

brew install fish
sudo sh -c 'echo /opt/homebrew/bin/fish >> /etc/shells'
chsh -s /opt/homebrew/bin/fish

Restart Terminal after switching.

My Recommendation

Use zsh. It's the Mac default, has great features, and runs bash scripts with minor modifications.

  • Already on zsh? Stay there.
  • On bash? Consider switching if you want better completion and plugins.
  • Want something different? Try fish for interactive use.

Tab Completion Comparison

bash:

\$ ls Do[TAB]
Documents/ Downloads/

Lists options.

zsh:

\$ ls Do[TAB]
# Cycles through: Documents → Downloads

Cycles through options, case insensitive.

fish:

\$ ls Do[TAB]
# Shows: Documents  Downloads
# With colors and icons

Visual completion with highlighting.

Plugin Ecosystems

zsh: Oh My Zsh

The most popular zsh framework:

sh -c "\$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

Themes, plugins, easy configuration.

fish: Fisher or Oh My Fish

# Fisher
curl -sL https://git.io/fisher | source && fisher install jorgebucaran/fisher

# Oh My Fish
curl https://raw.githubusercontent.com/oh-my-fish/oh-my-fish/master/bin/install | fish

bash

Fewer frameworks. Most people manually configure ~/.bash_profile.

Script Compatibility

Most scripts start with:

#!/bin/bash

This runs in bash regardless of your interactive shell. Your shell choice mainly affects interactive use, not scripts.

However, if you type bash commands at a fish prompt, they may not work. fish has different syntax.

Configuration Files

Shell Config file
zsh ~/.zshrc
bash ~/.bash_profile or ~/.bashrc
fish ~/.config/fish/config.fish

The Practical Answer

zsh is the safe, powerful choice for Mac. It works with almost everything and has great features.

bash is fine if you have existing bash configs or value maximum compatibility.

fish is worth trying if you prioritize the interactive experience and don't need bash compatibility.


Keep Learning

Your shell matters less than knowing how to use it. The free course teaches Terminal skills that work in any shell.

Check it out at Mac Terminal for Humans.