Announced June 4, 2019, the switch from Bash to Zsh as macOS's default shell traced back to a licensing constraint, not a technical judgment about which shell was better — Apple was stuck on an old, GPLv2 Bash version indefinitely.
Born August 28, 2009 as a way to get his own team using Zsh, Oh My Zsh grew into the most widely used Zsh configuration framework — with its original robbyrussell theme still recognizable to millions of terminal users today.
Ubuntu 6.10 switched its default /bin/sh from Bash to the much stricter Dash in October 2006, purely for faster boot-time script execution — and immediately surfaced years of accumulated non-portable shell scripts across the ecosystem.
Posted to the alt.sources Usenet newsgroup by a Princeton student in 1990, Zsh combined the strongest interactive features of several existing shells — and, decades later, would become the default shell on macOS.
They all accept most of the same basic commands, which is exactly what makes their real differences easy to miss until a script written for one breaks silently on another.
That colorful prompt showing your git branch, exit code, and current directory isn't a separate program running alongside your shell — it's a string your shell re-evaluates before every single command.
An unquoted variable works fine in testing, then silently breaks in production the first time it holds a value with a space in it. This is the single most common category of real-world shell scripting bug.
'Terminal' and 'shell' get used interchangeably constantly, but they're genuinely separate programs with separate jobs — one draws characters on screen and manages input, the other interprets commands.
Full-screen terminal applications like htop and vim don't just print text — they take over the entire screen, redraw parts of it selectively, and read your keystrokes one at a time. Here's the layer that makes that possible.
By the time a command you typed actually runs, the shell has already rewritten it — expanding variables, substituting command output, and turning wildcard patterns into real filenames. Here's the exact order that happens in.