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.