Unix & friends · a comparative survey

A Field Guide
to Shells $ % > ❯

Nine command interpreters, catalogued like the specimens they are: where each one came from, why it was built, and the niche it occupies in the ecosystem today. Written for someone fluent in bash who keeps meeting the others in the wild.

The family tree

Nearly everything traces back to Bell Labs. One branch (Bourne) prized scripting rigor and became the POSIX standard line; the other (C shell) prized interactive comfort and was eventually absorbed as features into the first branch. Two modern shells opted out of the tree entirely.

sh (1971) Thompson Bourne sh 1979 · Bell Labs csh 1978 · Berkeley ksh 1983 · Bell Labs bash 1989 · GNU zsh 1990 · Princeton tcsh 1983 ash → dash 1989 / 1997 fish 2005 · clean slate PowerShell 2006 · Microsoft Nushell 2019 · clean slate — independent origins —

The specimens

Each entry records the shell's default prompt character, provenance, and habitat, followed by the three questions that matter: why it was made, what it's used for, and the niche it holds.

Bourne shell

$

sh — the common ancestor

Appeared
1979, Version 7 Unix
Creator
Stephen Bourne, Bell Labs
Habitat
Effectively extinct as a living program; survives as the POSIX sh specification and as /bin/sh, which is nearly always another shell in disguise

Why it was made

Ken Thompson's original 1971 shell could run commands but barely program. Bourne rebuilt it as a real scripting language — variables, control flow, functions, here-documents — so Unix could automate itself.

Niche

The lingua franca. Its grammar became the POSIX shell standard, which is why bash, dash, ksh, and zsh can all run each other's plain scripts. When people say "write portable shell," they mean "write Bourne." You interact with its ghost every time a script begins #!/bin/sh.

bash

$

Bourne-Again SHell

Appeared
1989
Creator
Brian Fox, for the GNU Project
Habitat
Default login shell on most Linux distros and older macOS; ubiquitous on servers

Why it was made

The GNU Project needed a free-software replacement for the proprietary Bourne shell. Fox wrote one that was Bourne-compatible but folded in the interactive comforts of csh (history, job control) and ksh (functions, arithmetic).

What it's used for

Everything: login sessions, system scripts, CI pipelines, the glue of the internet.

Niche

The default. Not the fastest, not the most elegant, but the shell most likely to exist on any machine you SSH into — which makes bash knowledge (yours) the most transferable skill in this guide.

dash

$

Debian Almquist SHell

Appeared
1997 (port of ash, 1989)
Creator
Herbert Xu, from Kenneth Almquist's ash
Habitat
/bin/sh on Debian and Ubuntu; ash lives on in BusyBox and Alpine

Why it was made

Almquist wrote ash as a small, license-clean Bourne clone for BSD. Debian adopted a Linux port because bash had grown big and slow for the hundreds of tiny scripts that run at boot.

What it's used for

Executing #!/bin/sh scripts — boot sequences, package maintainer scripts, embedded systems. Nobody uses dash interactively; it has no tab completion or history to speak of.

Niche

The minimalist workhorse. Strictly POSIX, tiny footprint, roughly 4× faster to start than bash. It's also the reason "bashisms" break on Ubuntu: sh script.sh there runs dash, not bash.

ksh

$

KornShell

Appeared
1983 (ksh88), 1993 (ksh93)
Creator
David Korn, Bell Labs
Habitat
Default on AIX; long-standing presence on commercial Unix and in banking/telecom scripts

Why it was made

Bell Labs users wanted csh's interactive features without abandoning Bourne's scripting language. Korn unified them, then pushed further: associative arrays, floating-point arithmetic, real scripting power years before bash had it.

What it's used for

Legacy enterprise scripting. Vast bodies of ksh code still run inside financial institutions and on AIX/Solaris systems.

Niche

The distinguished elder. Much of what feels "modern" in bash — $(...), [[ ]], arrays — was ksh first. POSIX's shell standard is largely ksh88 codified.

csh / tcsh

%

C shell · TENEX C shell

Appeared
1978 / 1983
Creator
Bill Joy, Berkeley / Ken Greer
Habitat
Historically default on BSD; pockets remain in EDA (chip design) tooling and old academic environments

Why it was made

Joy wanted a shell with C-like syntax and, above all, better interactive life: csh invented history (!!), aliases, and job control. tcsh added filename completion and command-line editing.

What it's used for

Mostly maintaining old csh scripts and EDA tool flows that standardized on it decades ago.

Niche

The influential dead end. Its interactive inventions were absorbed by every later shell, but its scripting language is famously broken — the essay "Csh Programming Considered Harmful" is a classic. Learn from it; don't script in it.

zsh

%

Z shell

Appeared
1990
Creator
Paul Falstad, Princeton student
Habitat
Default on macOS since Catalina (2019); the power user's Linux shell

Why it was made

Falstad wanted one shell with the best of everything — ksh's scripting, csh's comforts — plus its own ideas: recursive globbing (**/*.c), spelling correction, and a completion system that can describe every flag of every command.

What it's used for

Daily interactive driving. Frameworks like Oh My Zsh and themes like Powerlevel10k made it the customization platform of choice.

Niche

The maximalist. Nearly bash-compatible for everyday use, so it's the lowest-friction upgrade for a bash user — your muscle memory transfers, then the extras accumulate.

fish

>

Friendly Interactive SHell

Appeared
2005
Creator
Axel Liljencrantz
Habitat
Developer laptops; anywhere someone chose their shell deliberately

Why it was made

A protest against configuration. Its motto — "configurability is the root of all evil" — meant building in what others make you set up: autosuggestions from history as you type, syntax highlighting, completions parsed automatically from man pages. All on by default.

What it's used for

Interactive use by people who want a great terminal experience out of the box.

Niche

The heretic. fish deliberately broke POSIX compatibility to get a cleaner language — so bash one-liners from Stack Overflow often won't paste in, and scripts still get written in bash. Its ideas (autosuggestions especially) have been copied everywhere.

PowerShell

PS>

pwsh — the object pipeline

Appeared
2006; cross-platform & open source since 2016
Creator
Jeffrey Snover, Microsoft
Habitat
Windows administration everywhere; Azure cloud tooling; available on Linux/macOS

Why it was made

Windows had no serious automation story — cmd.exe was a toy, and the OS's state lives in APIs and objects, not text files. Snover's insight: pipe .NET objects between commands instead of text.

What it's used for

Windows and Azure administration, Active Directory, enterprise fleet management.

Niche

The other paradigm. Where Unix pipes text and every tool re-parses it, Get-Process | Where-Object CPU -gt 100 passes structured objects — no awk, no cut. Verbose (Verb-Noun everywhere) but self-documenting. Since you know it: it's the shell that took Unix's pipeline and asked "what if the data had types?"

Nushell

nu — honorable mention, the new wave

Appeared
2019
Creator
Jonathan Turner & Andrés Robalino
Habitat
Early adopters' terminals; still pre-1.0-era in spirit

Why it was made & its niche

Nushell asks: what if PowerShell's structured-data idea got a Unix-native, Rust-flavored redesign? Everything is a typed table — ls | where size > 1mb | sort-by modified just works, and it reads JSON, CSV, and TOML natively. It's the clearest sign that the structured-pipeline idea is the direction shells are evolving, even if bash's inertia means the text pipeline isn't going anywhere soon.

Side by side

"POSIX" here means the shell aims to run standard sh scripts unmodified. Startup speed matters for scripts launched thousands of times; interactive polish matters for the one shell you live in.

ShellPOSIX-compatibleScripting strengthInteractive polish (stock)Startup weightBest at
bashYes (superset)StrongModestMediumBeing everywhere
dashYes (strict)Deliberately minimalNoneFeatherweightFast, portable /bin/sh scripts
kshYes (superset)StrongDatedLightLegacy enterprise Unix
zshMostly (in sh mode)StrongGood → superb with pluginsMediumCustomizable daily driver
fishNo, by designClean but nicheSuperb out of the boxMediumZero-config interactive use
tcshNo (C-like syntax)Weak (avoid)HistoricLightMaintaining old csh flows
PowerShellNo (own paradigm)Strong, typed objectsGoodHeavyWindows & cloud automation
NushellNo (own paradigm)Strong, typed tablesGoodMediumStructured data wrangling

What this means for a bash user

The tree explains the compatibility rules you'll hit in practice. Everything on the Bourne branch — dash, ksh, bash, zsh — shares a core language, which is why your bash knowledge mostly transfers among them and why POSIX sh is worth learning as the portable subset. Everything off that branch — fish, PowerShell, Nushell — traded compatibility for a better language, and demands relearning.

A reasonable division of labor, and roughly what experienced users converge on: script in POSIX sh or bash (maximum portability — and you now know firsthand that #!/bin/sh may summon dash), live interactively in zsh or fish if you want more than stock bash offers, and reach for PowerShell or Nushell when the job is really about structured data or Windows machines rather than files and text.

And the deepest divide in the whole guide is the one PowerShell and Nushell sit across from everyone else: whether a pipeline carries text that each tool re-parses, or typed objects that carry their own structure. Every shell here is an answer to that question — Unix bet on text in 1971, and the newcomers are still arguing.