As a Linux user, I've always just used bash because it was the default on every distro I used. People using other Unix systems such as BSD seem to use other shells far more frequently. In the interests of learning a bit more, I've decided to try out zsh.

As a bash user:

  • What features will I miss?
  • And what ones should I look out for?
up vote 45 down vote accepted

There's already been quite a bit of activity on the topic on other Stack Exchange sites. My experience of switching from bash to zsh, as far as can remember (it was years ago²), is that I didn't miss a single thing. I gained a lot; here are what I think are the simple zsh-specific features that I use most:

  • The zsh feature I most miss when I occasionally use bash is autocd: in zsh, executing a directory means changing to it, provided you turn on the autocd option.⁴

  • Another very useful feature is the fancy globbing. The hieroglyphscharacters are a bit hard to remember but extremely convenient (as in, it's often faster to look them up than to write the equivalent find command). A few of the simpler examples:
        foo*~*.bak = all matches for foo* except those matching *.bak
        foo*(.) = only regular files matching foo*
        foo*(/) = only directories matching foo*
        foo*(-@) = only dangling symbolic links matching foo*
        foo*(om[1,10]) = the 10 most recent files matching foo*
        foo*(Lm+1) = only files of size > 1MB
        dir/**/foo* = foo* in the directory dir and all its subdirectories, recursively⁴

  • For fancy renames, the zmv builtin can be handy. For example, to copy every file to file.bak: zmv -C '(*)(#q.)' '$1.bak'

  • Both bash and zsh have a decent completion system that needs to be turned on explicitly (. /etc/bash_completion or autoload -U compinit; compinit). Zsh's is much more configurable and generally fancier.

If you run zsh without a .zshrc, it starts an interactive menu that lets you choose configuration options. (Some distributions may disable this; in that case, run autoload zsh-newuser-install; zsh-newuser-install.) I recommend enabling the recommended history options, turning on (“new-style”) completion, and turning on the “common shell options” except beep. Later, configure more options as you discover them.

²At the time programmable completion was zsh's killer feature, but bash acquired it soon after.
Features that bash acquired only in version 4 (so are still not available on many systems) are in smaller type.

  • 5
    Bash 4.0 now supports the autocd feature you discuss above. Enable the feature using the command shopt -s autocd. Then the feature works as you've described. – Philluminati Dec 17 '12 at 1:28
  • zsh also has the built-in where command, not to be confused with the which command. – Sildoreth Apr 17 '15 at 18:14

Also the default tab completion is better than bash... for example...

~/.e.dTAB will expand to ~/.emacs.d/ in zsh, bash will just beep.

  • it didn't. what non-default setopt option do you use for that (if any) ? – w17t May 22 at 18:44

zsh lets you edit a multi-line command (see zsh line editor), bash doesn't. If you try the same trick (Ctrl-p), bash fetches the last command.

  • 2
    Bash does this, at least as of version 4.2.37; it replaces newlines by semicolons and gives you a single line to edit. – Keith Thompson Jan 24 '14 at 23:57
  • 1
    Still not as nice. (: – SilverWolf Jan 23 at 19:56

Bash has the feature of being able to open ports using

/dev/tcp/host/port

or

/dev/udp/host/port

However, it is disabled in Debian as it is seen as a hindrance (if the path actually exists) and outside the scope of what a shell should do. More information [debian mailing list]

  • 5
    zsh has the ztcp builtin though which has more capabilities than bash's /dev/tcp, doesn't have /dev/udp. I would rather use socat though. – Stéphane Chazelas Sep 10 '12 at 13:43

Which - enhanced in zsh

The which command in bash only reveals the location of a command.

In Zsh which will reveal the definition of an alias, the source for a function and the location of a command.

Let's say we had a shell alias:

alias gg='git log'

In Bash if we asked: which gg the result would be void

In Zsh: which gg will give us...

gg: aliased to git log

Let's say we had a shell function:

hello() {
    echo "Hello World"
}

In Bash if we asked: which hello the result would be void.

In Zsh: which hello will give us...

hello() {
    echo "Hello World"
}

zsh - a complete shell

there are many, reading through zshcontrib(1) one can detect two versions of autoload-able tetris games (the other with ncurses) in zsh in competition with emacs, for completeness (as described).

=

i'd like to mention the = keyword, which can cause irritation with curl (URL's usually have ?var=val in them; but it is unsetopt-able, I think):

  • q file =less (gentoo) resolves to q file $(which less)

= expands to the full path of the command in question.

other goodies

other things, out of the mind, are the right prompt RPS1=%d (to display $PWD in style), Alt + H (run-help ie. man), Alt + ? (which-command), vared, and zed (autoload function), Emacs' minibuffer-like Alt + X to execute widgets without binding them, global and suffix aliases, extended history tracking command completion duration, -m and -regex matchers, shell emulation (eg. csh, ksh with emulate) and autoload run-help with file snippets for the built-ins.

lamentations

i think most, if not all, of the features were implemented a long time ago, and reading through changelogs, there is no major changes and new feature additions, which is very sad (nothing to explore and discover anymore).

bash seem to be more distributed in readline (as opposed to zle) and gnu history in the linux spirit; e.g readline functions and keybindings can be applied globally (as kept in ~/.inputrc and /etc/inputrc) if not overriden by bash-specific bind.

conclusion

i personally think emacs (esp. from the prospect of (the current?) emacs-nox flavor) being the inspiration for the exceptional software like zsh and tmux did a very good job in being an example in such an implementation; for the people appreciating its worth (to the level of not needing/depending on X server). Unix shell is powerful enough, and its continuity and consistency is sufficient for a proper workflow and productivity (in overall computing).

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.