Bash vs Zsh: A Beginner's Guide
Unix Linux Bash

Bash vs Zsh: A Beginner's Guide

Mishel Shaji
Mishel Shaji

In the world of Unix-like operating systems, the shell is the bridge between the human and the machine. It is the command-line interpreter that turns your keystrokes into system actions. While there are dozens of shells available, two giants dominate the landscape: Bash (the Bourne Again SHell) and Zsh (the Z Shell).

Whether you are a seasoned sysadmin or a developer setting up a new MacBook, understanding the nuances between these two is essential. This guide explores their origins, features, and why you might choose one over the other.


1. What is Bash?

Bash, short for the Bourne Again SHell, is an sh-compatible command-line interpreter. Released in 1989 by Brian Fox for the GNU Project, it was designed as a free software replacement for the original Bourne shell (sh).

For decades, Bash has been the industry standard. It is the default login shell for most Linux distributions and was the default for macOS for years. It is known for its stability, predictability, and massive presence in the world of server automation and scripting.


2. What is Zsh?

Zsh, or the Z Shell, is a powerful shell designed for both interactive use and scripting. Created by Paul Falstad in 1990 while he was a student at Princeton University, Zsh was built to be an improvement over Bash, ksh, and tcsh.

Think of Zsh as Bash’s "cool, customizable younger sibling." It incorporates many of the features found in other shells while adding a massive layer of user-centric improvements like sophisticated tab completion, spelling correction, and theme support through frameworks like Oh My Zsh. In 2019, Apple officially replaced Bash with Zsh as the default shell in macOS Catalina.


3. The Origins: Why Were They Developed?

Why Bash was Developed

The creation of Bash was a political and technical necessity. In the 1980s, the original Bourne Shell (sh) was proprietary software owned by AT&T. Richard Stallman and the Free Software Foundation (FSF) needed a completely free version of the shell to complete the GNU operating system. Bash was built to be that "Free" shell, providing backwards compatibility with sh while adding features like command-line editing and history.

Why Zsh was Developed

Paul Falstad didn't set out to replace the world's scripts; he wanted to create a shell that felt better to use. While Bash focused on being a reliable standard, Zsh focused on the user experience. Falstad integrated the best features of the Korn shell (ksh) and the C shell (csh) into one package, focusing on automation, better navigation, and customization that simply didn't exist in the more conservative Bash environment.


4. Operating Systems: Who Uses What?

Historically, Bash won the "Desktop and Server" war, but Zsh has recently claimed the "Developer Laptop" crown.

OS / Distribution Default Shell Notes
Ubuntu / Debian Bash Uses dash for non-interactive scripts for speed, but Bash is the user default.
CentOS / RHEL Bash The enterprise standard for stability.
macOS (Catalina & later) Zsh Apple switched due to licensing (Bash 4.0+ is GPLv3, Zsh is MIT-like).
Kali Linux Zsh Switched in 2020 for better aesthetics and usability.
Windows (WSL) Bash Most WSL installs default to Ubuntu's Bash.

5. Feature Comparison: Head-to-Head

To understand the real-world difference, we have to look under the hood at the features that impact your daily workflow.

Customization and Themes

  • Bash: Customization is manual. You edit your .bashrc or .bash_profile. While you can change the prompt color, it’s a tedious process involving complex escape codes.
  • Zsh: Supports frameworks like Oh My Zsh, Prezto, and Antigen. With a single line of config, you can add themes that show your Git branch, current Python virtual environment, and execution time of the last command.

Tab Completion

  • Bash: Basic. It completes file names and paths. You usually have to hit Tab twice to see options.
  • Zsh: Advanced. It is "case-insensitive" by default (if configured). It allows you to use arrow keys to navigate a menu of options right in the terminal.

Path Expansion

In Zsh, you can type cd /u/lo/b and hit Tab, and it will automatically expand to cd /usr/local/bin. Bash requires you to type each directory level specifically.


6. Pros and Cons

Bash

Pros:

  • Ubiquity: It is on almost every Linux server on the planet.
  • Standardization: If you write a script in Bash, it will likely work everywhere without modification.
  • Stability: Bash changes slowly, meaning it rarely breaks legacy workflows.

Cons:

  • Outdated Default on Mac: Due to licensing, macOS ships with an ancient version of Bash (3.2).
  • Less "User-Friendly": Lacks the modern bells and whistles of Zsh (like auto-suggestions).

Zsh

Pros:

  • Speed of Use: Features like autocd (just type the folder name to enter it) save thousands of keystrokes.
  • Spelling Correction: If you type sl instead of ls, Zsh asks if you meant ls.
  • Plugin Ecosystem: Thousands of plugins for Docker, Git, AWS, and more.

Cons:

  • Bloat: If you use too many plugins, Zsh can become noticeably slower to start up.
  • Complexity: Can be overwhelming for beginners to configure correctly.

7. Compatibility

Generally speaking, Zsh is highly compatible with Bash. Most Bash scripts will run in Zsh without issue because Zsh incorporates most Bourne shell features.

However, there is a catch: Zsh is not a literal clone.

  • Arrays: In Bash, arrays start at index 0. In Zsh, they start at index 1 (unless you enable a specific compatibility option).
  • Word Splitting: Bash automatically splits variables by spaces; Zsh does not.
Pro Tip: Always use the "Shebang" line (#!/bin/bash or #!/bin/zsh) at the top of your scripts to ensure they run in the correct interpreter, regardless of the user's default shell.

8. Sample Commands and Syntax Differences

While basic commands like ls, cd, and mkdir are identical (as they are external binaries), the "built-in" behavior differs.

Shared Commands

Both shells handle basic piping and redirection the same way:

Bash

ls -la | grep "config" > output.txt

The cd Shortcut (Zsh Only)

In Zsh, you can enable autocd. You don't even need the cd command.

Bash

# Zsh behavior
/etc/nginx  # Simply typing the path takes you there

Floating Point Math

  • Bash: Only supports integers. To do decimals, you must use an external tool like bc.
  • Zsh: Supports floating-point math natively.

Floating Point Math

  • Bash: Only supports integers. To do decimals, you must use an external tool like bc.
  • Zsh: Supports floating-point math natively.

9. Detailed Feature Comparison Table

Feature Bash Zsh
Licensing GPL v3 MIT-like
Startup Files .bash_profile, .bashrc .zshrc, .zprofile
Auto-Correction No Yes (Spelling)
Shared History Manual config required Built-in (across all windows)
Theming Minimal (Manual) Extensive (via Oh My Zsh)
Plug-ins Limited Massive Library
Recursive Globbing Requires shopt Native (ls **/*.js)

10. Redirection Differences: Bash vs. Zsh

While tee is an external binary available to both, Zsh has built-in features that often make tee unnecessary for simple tasks.

Multi-Redirects (Zsh "Multios")

In Bash, if you try to redirect output to two different files, only the last one usually works, or it creates confusion:

Bash

# Bash: This won't work as you'd expect for two files
ls > file1.txt > file2.txt 

In Zsh, a feature called MULTIOS is enabled by default. You can pipe or redirect to multiple destinations without using tee at all:

Bash

# Zsh: Automatically "tees" the output to both files
ls > file1.txt > file2.txt

Appending with tee

By default, tee overwrites the file. If you want to append data (like the >> operator), both shells use the -a flag:

Bash

echo "New log entry" | tee -a logfile.txt

Final Technical Verdict: Bash or Zsh?

If your goal is to write scripts that are portable and "just work" on a Raspberry Pi, an AWS server, or an old Red Hat box, stick to Bash. It is the gold standard for reliability.

If your goal is interactive productivity—meaning you spend hours a day typing commands, navigating folders, and managing Git branches—Zsh is the superior choice. Its ability to handle multi-redirections natively and its advanced completion system simply makes the command line feel like a modern tool rather than a relic of the 80s.