Oh My zsh
github.com
github.com
It also has a huge library of built-ins (even an FTP client).
People could call it bloated, but I see no difference in performance from Bash, so for me personally, that argument is moot.
What really made ZSH gain a spot in my heart though, is the user-friendly user's guide at
http://zsh.sourceforge.net/Guide/
This is how I learned to use the Unix shell back in 2000. It's not just a brilliant introduction into ZSH itself, it also contains a lot of information about the Unix shell in general and all written in a way that a non-Unix user can easily understand it and very quickly learn all that's needed to be productive on the command line.
Using that guide and ZSH, I learned the Unix shell, so I never bothered to go back to Bash.
Besides, being able to do
scp fi<tab> servern<tab>:/so<tab>
to have it completed to
scp file servername.example.com:/somepath
is just brilliant.
Same goes for contents of tar.(g|b)z(ip|2) archives. Or git commands. Or svn commands.
It's wonderful.
Sorry. Being a fanboy here.
It's a shame since I'd like the up-to-date git completions, but because I can't compile zsh I'm stuck with release versions :(
In particular, their recipe for zsh compilation might help you even if you don't want to install brew itself: http://github.com/mxcl/homebrew/blob/master/Library/Formula/...
pilif@celes ~ % which zsh
/opt/local/bin/zsh
pilif@celes ~ % echo $ZSH_VERSION
4.3.10
pilif@celes ~ %
building the port went flawlesslyZSH is the shell I learned Unix with. ZSH is the shell I know best and thus can do the most awesome stuff with. Hence I'm using ZSH.
Others might have the same feelings towards bash. I totally accept that und usually don't try to "convert" people. But I'm also immune against their efforts in converting me.
But why would you switch back to bash? Even if you don't use some of the advanced zsh features?
No, it isn't. Here's the Unix spec (http://www.opengroup.org/onlinepubs/007908799/), search it for bash and you won't get anything. That's a Linuxism (http://www.google.com/#q=linuxism), but it's not even on every kind of Linux.
The only standard shell on Unix is the bourne shell, and having things break because someone ignorantly hardcoded bash without using any bash-specific extensions is really annoying.
I agree it's worth the time to find a shell you like and customize it, but that's not a good reason to pick bash.
BusyBox combines a bunch of Linux userland utilities into one executable, to save overhead on embedded systems. It uses ash, not bash.
I think people are better off coding to a standard shell (as necessary), and otherwise using whatever shell makes them happy for day-to-day use. bash isn't actually the former, though, and it has strong competition for the latter, so it's probably a bad compromise.
I've also done porting for OpenBSD, and the whole bash thing is a pet peeve of mine. It's not just me, though - look at the situation with Debian and eglibc due to bugs like these (http://sources.redhat.com/bugzilla/show_bug.cgi?id=3266 http://sources.redhat.com/bugzilla/show_bug.cgi?id=9901).
* I mean, how many other problems in software are due to people prematurely overgeneralizing?
Sure. I'm just saying that, in my own case, switching from zsh to bash has meant that instead of worrying about making sure that zsh is installed and up to date on all my systems and that all the various addons and plugins I used to need for zsh are available, I just have to make sure my .bashrc is available. And even if it isn't I don't lose much. So I get a functional, familiar environment in all the cases that matter to me with no extra hassles.
http://bitbucket.org/tednaleid/shared-zshrc
I put together a blog post on how to use it along with some descriptions of specific aliases/functions that I find really useful:
http://naleid.com/blog/2009/05/13/shared-zshrc-file/
Global aliases are one of the things I love about zshrc. In addition to that, the file globbing is a huge productivity benefit. Being able to use "/foo.txt", rather than "find . -name foo.txt" is nice.
I think that everyone should also learn the cursor movement keybindings (which default to the emacs ones instead of vi ones). I think these might be the same in bash (where C is control and M is meta, likely alt/option or escape):
* C-r - search backwards through history
* C-a - beginning of line
* M-b - move back one word
* C-b - move back one letter
* C-f - move forward one letter
* M-f - move forward one word
* C-e - end of line
* C-s - search forwards through history