Skip to content
daniel@MacBookPro:~
Shell & TerminalHistory August 26, 2026 3 min read

The History of the Unix Shell: From Thompson Shell to Bash and Zsh

Every shell in daily use today — Bash, Zsh, tcsh, fish — descends from a lineage that started with a genuinely minimal 1971 command interpreter, branching twice into distinct, still-visible family trees.

Every shell in everyday use today — Bash, Zsh, tcsh, fish — traces back to a single, genuinely minimal starting point in 1971, branching over the following decade into two distinct family trees whose differences are still visible in how these shells behave today.

The starting point: the Thompson shell

The Thompson shell, written by Ken Thompson, shipped with the very first version of Unix in 1971. It introduced foundational concepts nearly every later shell kept — piping commands together, basic control structures, and filename globbing — but it was a simple command interpreter, not designed for serious scripting.

The first major branch: Bourne vs. C shell

Two shells emerged to address the Thompson shell’s scripting limitations, taking genuinely different approaches. Stephen Bourne, at Bell Labs, began work in 1976 on what became the Bourne shell, distributed with Unix Version 7 in 1979 — adding proper variables, control structures, and command substitution, with syntax influenced by Bourne’s background with the ALGOL 68C compiler. Separately, Bill Joy at Berkeley created the C shell (csh), distributed starting with 2BSD in 1979, deliberately designed to read more like the C programming language and to prioritize interactive use, introducing command history and aliases along the way.

Why this branch still matters today

Bash and Zsh both descend from the Bourne shell lineage; tcsh descends from Bill Joy’s C shell — two family trees with genuinely different syntax and scripting philosophies that never fully converged, which is exactly why csh-family and sh-family scripts remain mutually unreadable to someone only familiar with the other lineage.

Bash: the GNU Project’s free alternative

Bash (Bourne Again Shell), written by Brian Fox and released in 1989, was created as a free software replacement for the Bourne shell and other proprietary Unix shells, as part of the GNU Project’s broader mission — adding features like command-line editing (via the GNU Readline library, developed alongside it) and job control while remaining broadly Bourne-shell-compatible.

Zsh: born from a student project at Princeton

Zsh, created by Paul Falstad in 1990 while a student at Princeton University, combined ideas from ksh, tcsh, and other existing shells, adding especially powerful globbing, completion, and prompt customization — capabilities that eventually made it popular enough to become macOS’s default shell in 2019.

The more recent branch: shells that break from POSIX conventions deliberately

Fish, first released in 2005 by Axel Liljencrantz, took a different approach entirely — deliberately breaking POSIX compatibility in favor of more consistent, more discoverable syntax and genuinely useful defaults (like syntax highlighting and autosuggestions) out of the box, without requiring extensive configuration the way Bash or Zsh typically do.

Why this history still shapes real, everyday scripting decisions

Understanding this lineage explains why “which shell” isn’t purely an aesthetic preference: a script written in Bourne-lineage syntax fails entirely under tcsh, POSIX sh and Bash overlap substantially but diverge in specific documented ways, and Zsh’s interactive strengths come from decades of accumulated features distinct from what Bash or a strict POSIX shell provides — decisions made by Thompson, Bourne, and Joy in the 1970s are still directly responsible for compatibility boundaries every shell script author runs into today.