Why Zsh is Cooler than Your Shell

Uploaded on

By Brendon Rapp …

By Brendon Rapp
Jaguar Design Studio
January 2013 Cave Lunch

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
  • At slide 9: I bet that today it can be accomplished with less lines using awk.

    At slide 24: :)

    At slide 25: It reminds me the prompter of Cisco's iOS, but replacing TAB with '?'

    At slide 28: The last paragraph is a fallacy, is like I use a distro with bash with steroids and say that because of that, bash is better that zsh. Just playing devil's advocate here.

    At Slide 37: It is supposed to work? as I can see it, it is a merit of zsh, not necessarily a weakness of bash. I'll take it as a joke.

    At slide 39: have to try it to comment.

    At slide 41: Same as slide 37. This comes to my mind: http://lh6.ggpht.com/-hPr86L8DlWQ/T9owGOYPI7I/AAAAAAAAJJc/WDcNzMb-YOM/2525D.jpg

    At slide 48: In the future might cause trouble to the careless, it would be good a option like '[nyae]' of spelling correction.

    The rest, EXCELENT! enough to motivate me to install it and give it a chance, I just can say that I like what I saw in the distro GRML.

    Thanks for sharing.
    Are you sure you want to
    Your message goes here
  • @Kevin Rowe
    This will simply give the last line
    And yes I know I can do:
    shell$ cat `locate .blah blah |tail blah`
    But that just is too much typing
    What I'm talking about is zsh loading the output lines in variable that I can just call with a few keystrokes
    Are you sure you want to
    Your message goes here
  • @rumcho locate file.abc /a/b/c/file.abc|tail -n 1

    BTW, this is not zsh specific. It should work anywhere.
    Are you sure you want to
    Your message goes here
  • Question for all the zshell gurus:
    Let's say I do:
    shell$ locate file.abc
    Now that I got the prompt back, I'd like to 'cat' the last found file '/x/y/z/cde/file.abc' but I don't want to lift my hand off the keyboard, reach for the mouse, highlight the desired file and copy/paste it at the prompt. I just want to do something like:
    shell$ cat ${???magic???}
    where ${???magic???} would store the last output line of the last command I executed (i.e. the last line of the 'locate file.abc' command)
    Is there such a thing in zshell?
    Are you sure you want to
    Your message goes here
  • @martinknesl94 $winIsFail = Gee.ICant.Understand.Why.Noobs.Cant.Understand.This()
    Are you sure you want to
    Your message goes here
No Downloads


Total Views
On Slideshare
From Embeds
Number of Embeds



Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

    No notes for slide


  • 1. whyZ shell (zsh)is coolerthanyour shell Brendon Rapp - Cave Lunch #1
  • 2. whyZ shell (zsh)is coolerthanyour shell(unless your shell is zsh) Brendon Rapp - Cave Lunch #1
  • 3. (alternate title)she sellsZ shellsby thesea shore
  • 4. Donald KnuthProfessor Emeritus ofComputer Science atStanfordAuthor of The Art ofComputer Programming"Father of algorithmicanalysis"Creator of TeX
  • 5. In 1986, Knuth was asked to write a guestfeature for the "Programming Pearls" column inthe Communications of the ACM journal.The task was to write a program that would:read a file of text, determine the n mostfrequently used words, and print out a sortedlist of those words along with their frequencies.
  • 6. Knuth produced a solution in Pascal that, whenprinted, was about 10 pages in length. It waswell designed, thoroughly commented, andused a novel data structure for managing theword count list.
  • 7. In response, Doug McIlroy wrote a shell scriptthat produced the same output.
  • 8. In response, Doug McIlroy wrote a shell scriptthat produced the same output.McIlroys script was six lines long.
  • 9. Doug McIlroys Shell Scripttr -cs A-Za-z n |tr A-Z a-z |sort |uniq -c |sort -rn |sed ${1}q
  • 10. A brief history of shells1971: Thompson shell ● Ken Thompson, Bell Labs, first Unix shell ● interactive interpreter, not scripting environment1977: 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 history of shells1978: 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.21983: 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 history of shells1989: 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 syntax1990: Z shell ● most closely resembles Korn shell ● /bin/bash compatibility, drop-in replacement for Bash ● "new" (despite being over 20 years old) ● awesome stuff Ill talk about next
  • 13. Why use zsh?
  • 14. First, a reason thats kind of lame...
  • 15. If youre using Mac OS X...
  • 16. ... your Bash is old!(OS X 10.8.2... and many earlier OS X versions too)
  • 17. OS X: GPL Wasteland● 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. Examples of Actual Zsh Awesomeness
  • 19. zsh: cd completion
  • 20. zsh: cd completion
  • 21. zsh: cd completion
  • 22. bash: cd completion
  • 23. bash: cd completion
  • 24. bash: cd completion
  • 25. zsh: git completion
  • 26. zsh: git completion
  • 27. bash: git completion
  • 28. bash: git completionIts possible to get completion for git (and many other commands) in Bashby installing bash-completion package, but the completion is stillrudimentary 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-placeThere may be ways to improve that situation and bring it more in line withzsh, but with zsh, you get it basically out-of-the-box, with a single commandin your .zshrc to enable completions.
  • 29. zsh: path expansion (hit TAB, and then...)
  • 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 isnt only one distinct match for the pattern...)
  • 32. zsh: path expansion(... the first TAB will expand up until it hits an ambiguity... )
  • 33. zsh: path expansion (... the next TAB lists the possible matches... )
  • 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. bash: path expansion? (hit TAB ... nothing)
  • 38. zsh: path replacement (Whoops. I meant /usr/local/share)
  • 39. zsh: path replacement
  • 40. zsh: path replacement (no more "cd ../../../")
  • 41. bash: path replacement?
  • 42. zsh: right promptPROMPT (or PS1): left prompt (like bash)RPROMPT (or RPS1): right prompt!
  • 43. zsh: right prompt
  • 44. zsh: spelling correction
  • 45. zsh: spelling correction
  • 46. zsh: spelling correction
  • 47. zsh: aliasesNormal aliases:alias ls=ls --color=auto
  • 48. zsh: aliasesGlobal aliases - appear anywhere in commandstringalias -g gp=| grep -i% ps ax gp ruby=> ps ax | grep -i ruby
  • 49. zsh: aliasesSuffix aliases - "Open With..."alias -s rb=vimalias -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. zsh: extended globbingNormal globbed search
  • 51. zsh: extended globbingExtended globbed search: **/ = recursive
  • 52. zsh: environment variable editing
  • 53. zsh: programmable file renaming
  • 54. zsh-history-substring-searchDown arrow = cycle through command history
  • 55. zsh-history-substring-searchType part of command and hit up arrow, cycle through onlycommands that begin with that string
  • 56. zsh-syntax-highlightingHighlights valid commands in green, invalid commands inredSupports shell commands as well as executables in $PATH
  • 57. oh-my-zsh
  • 58. Other zsh bullet points● Simple configuration style● Shared history ○ simple & fast, requires some monkeying to replicate in bash● Lots of additions for shell scripting● Output redirection to multiple destinationsAnd, apparently, plenty of other stuff deeper than Ivegotten so far.
  • 59. The End Go 49ers