When you start typing a command, you can press the tab key and it will complete the command you started typing. If there are multiple potential commands, you can choose which one to run by simply pressing tab again.
If you spend a lot of time in the terminal, most likely you will have several terminal windows open. Zsh has great support for command line histories. The history is unique and shared through all the different instances.
Zsh will take you through a procedure which is roughly 30 minutes in length before during install. Through this procedure it asks you to set different options and customize the shell the way you want it to. Most of these settings are also found in other shells, but to customize them you have to go dig configuration files while zsh allows you to do it in the beginning.
While other shells require a lot of set up to act the way you want them to and to have some useful features, fish works perfectly out of the box. It has all the most widely used features baked in and are there out of the box without having the need to install plugins or tweak any configuration files.
Because it needs very little configuration to work properly, you can use Fish everywhere. If you are working on a system you don't usually work, installing Fish from the repository is easy and will give you the same experience as the installation on your own machine without having to drag a dotfile around.
Large test coverage, micro-second shell start, compatibility with plugins from other existing frameworks such as Tackle, Oh My Fish and Wahoo, cache system, offline index, the Fishery and other features.
This is a pro, not a con. The developers break with a lot of cruft, and while some may miss zsh-style familiarity, fish was the only shell you can consistently install across different computers (even a Mac).
Fish has no support for sudo !!, but you can use Oh My Fish shell framework and install bang-bang plugin to have this shortcut in Fish shell.
This can also be achieved by making this custom function:
if test "$argv" = !!
eval command sudo $history
command sudo $argv
Xonsh uses a syntax which is a superset of Python 3.4 plus some additional shell primitives. Because of the similarity to Python, which is famously an easy to understand programming language, the syntax of Xonsh is pretty easy to grasp too, even more so for Python programmers.
The Bourne shell has always been criticized (most notably by Bill Joy, author of csh) as being unfriendly for interactive use.
It has no tilde (~) expansion. Limited file test operators. Limited math operators.
TclVFS allows you access files inside ZIP archives or on remote HTTP and FTP servers like you would local files. If you put "package require vfs::urltype; vfs::urltype::Mount http"
in your ~/.eltclshrc you can do things like "file copy http://example.com/file /tmp/file" (HTTPS is currently not supported by TclVFS.)
Tcl is a saner scripting language built on the same principle as the Unix shell (everything is a string) with more than a hint of Lisp. eltclsh makes it possible to use Tcl interactively with tab completion for both language constructs and file paths. The result is that you can develop a snippet of Tcl code interactively and then paste it in your script.