Why Zsh is Cooler than Your Shell

5 min read Original article ↗
  • 1.
  • 2.

    why Z shell (zsh) iscooler than your shell (unless your shell is zsh) Brendon Rapp - Cave Lunch #1

  • 3.
  • 4.

    Donald Knuth Professor Emeritusof Computer Science at Stanford Author of The Art of Computer Programming "Father of algorithmic analysis" Creator of TeX

  • 5.

    In 1986, Knuthwas asked to write a guest feature for the "Programming Pearls" column in the Communications of the ACM journal. The task was to write a program that would: read a file of text, determine the n most frequently used words, and print out a sorted list of those words along with their frequencies.

  • 6.

    Knuth produced asolution in Pascal that, when printed, was about 10 pages in length. It was well designed, thoroughly commented, and used a novel data structure for managing the word count list.

  • 7.

    In response, DougMcIlroy wrote a shell script that produced the same output.

  • 8.

    In response, DougMcIlroy wrote a shell script that produced the same output. McIlroy's script was six lines long.

  • 9.

    Doug McIlroy's ShellScript tr -cs A-Za-z 'n' | tr A-Z a-z | sort | uniq -c | sort -rn | sed ${1}q

  • 10.

    A brief historyof shells 1971: Thompson shell ● Ken Thompson, Bell Labs, first Unix shell ● interactive interpreter, not scripting environment 1977: Bourne shell ● scripting language ● Version 7 Unix, PDP-11 ● 1984: The UNIX Programming Environment, Kernighan & Pike ● The shell of commercial Unixes ○ System V, AIX, HP-UX, SCO, Solaris, SunOS ○ Still the default on some of these (that are still alive) ● /bin/sh ○ compatibility mode in modern shells ○ symlink or hard link to compatible shells in modern Unixes

  • 11.

    A brief historyof shells 1978: C shell ● BSD Unix ● More "C-like" scripting syntax (kinda) ● Command history ● Aliasing ● tcsh - newer C shell, default on FreeBSD, and OS X systems 10.0-10.2 1983: Korn shell ● Bell Labs (AT&T) ● Proprietary until 2000 ● vi and emacs editing modes ● Lots of C shell features ● "middle road" between Bourne and C shell ● pdksh - default on OpenBSD

  • 12.

    A brief historyof shells 1989: Bourne Again shell (bash) ● GNU, GPL ● first legitimate Free shell (/bin/sh compatible) ○ shells like ksh and csh became Free only much later on ● standard shell for Linux distros, Mac OS X 10.3+ ● TAB completion ● extended scripting syntax 1990: Z shell ● most closely resembles Korn shell ● /bin/bash compatibility, drop-in replacement for Bash ● "new" (despite being over 20 years old) ● awesome stuff I'll talk about next

  • 13.
  • 14.
  • 15.
  • 16.

    ... your Bashis old! (OS X 10.8.2... and many earlier OS X versions too)

  • 17.

    OS X: GPLWasteland ● no GPLv3 on OS X ● OS X bash: final version released as GPLv2 ● Homebrew has latest Bash (but many use situation as an excuse to try zsh instead)

  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.

    bash: git completion It'spossible to get completion for git (and many other commands) in Bash by installing bash-completion package, but the completion is still rudimentary compared to zsh: ● no cycling through options with repeated tabs ● no accompanying info with commands, just a list ● breaks to new prompt line on each tab instead of updating in-place There may be ways to improve that situation and bring it more in line with zsh, but with zsh, you get it basically out-of-the-box, with a single command in your .zshrc to enable completions.

  • 29.
  • 30.

    zsh: path expansion (... the path is expanded in place, provided there is only one path matching that pattern)

  • 31.

    zsh: path expansion (If there isn't only one distinct match for the pattern...)

  • 32.
  • 33.
  • 34.

    zsh: path expansion (... then TAB begins cycling through the possibilities... )

  • 35.

    zsh: path expansion (... until you get to the one you want, and hit the Right arrow to "select" it ... )

  • 36.

    zsh: path expansion (... and then TAB resumes matching through the rest of the path)

  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.

    zsh: aliases Global aliases- appear anywhere in command string alias -g gp='| grep -i' % ps ax gp ruby => ps ax | grep -i ruby

  • 49.

    zsh: aliases Suffix aliases- "Open With..." alias -s rb=vim alias -s log="less -MN" alias -s html=chromium % user.rb => vim user.rb % development.log => less -MN development.log % index.html => chromium index.html

  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 59.

    Other zsh bulletpoints ● Simple configuration style ● Shared history ○ simple & fast, requires some monkeying to replicate in bash ● Lots of additions for shell scripting ● Output redirection to multiple destinations And, apparently, plenty of other stuff deeper than I've gotten so far.

  • 60.