
Zsh is your friend. - mgrouchy
http://mikegrouchy.com/blog/zsh-is-your-friend.html
======
LeafStorm
While from what I have read about it zsh is a nice shell, it doesn't deal with
what I find to be the biggest problem with bash, sh, and just about every
shell that isn't fish: the horribly ugly and inconsistent syntax. And I think
it's rather sad that on what is supposedly the most advanced shell of our
generation, you still have to deal with a thousand ridiculous redirections and
quoting styles, different delimiter keywords for every control structure
("fi?" "done?" "esac?" Why not just freaking "end?"), and rules for expanding
variables that come back to bite you in the rear whenever you have spaces,
quote characters, or anything besides a run of letters, numbers, and a select
few punctuation marks in your filenames or other variables.

~~~
ramLlama
I have been using fish for several years now. It's community is a fraction of
zsh, bash, and others, and I've tried to go back to them, mostly out of
misplaced "everyone else is doing it" mindset

Fish is a great shell. It's a modern shell, that uses colors, UTF, and
processing power that didn't exist when the others were designed. I feel the
best thing about it is the sane defaults and large number of prebuilt
completions. For any other shell, I have to dive into bashrc's and esoteric
commands to get what I want. Fish just does what I want. It's made me far more
productive, and for that, it gets my best shell award.

Its scripting support is good, very similar to other shells. Yes, the syntax
is non-compatible, and not even POSIX. But, it makes more sense. Besides, for
anything except the simplest of scripts, I use lua. I doubt you'd want to use
bash to do something very complicated.

Some people want their shell scripts to be compatible and do a lot of cool
things. I feel that the days of a shell being used for scripting are past. For
me, a shell is a way of interacting with the system. Fish does this really
well. Scripting is a slight afterthought, as it should be.

~~~
rhizome
_I feel that the days of a shell being used for scripting are past._

I've noticed this attitude among those who tend to use sysadmin-minimizing
features of the internet, such as cloud hosting. There's still a whole world
of real server out there, though.

~~~
ramLlama
That is true. I do minimal system administration, so that is not a concern for
me.

I tend to use a shell for system interaction more than scripting. In that
regard, I give more importance to interactivity enhancements. On the other
hand, I have found myself using bash to automate simple things in our company
testbed. As soon as I need a datastructure more than an array, or recursive
functions, I jump to lua.

If your primary job is to be a sysadmin, then Bash is Required Reading.

~~~
ralph
I disagree. As a programmer I can represent inputs and outputs as text and
write code to do intended transformations. As a quick ad hoc test I can easily
knock up a shell pipeline to give confidence in those results, even if it
would be too slow for production. There's many occasions when powerful shell
usage is quicker to write than Python, etc.

My comment in reply to [http://www.iheartchaos.com/post/16393143676/fun-with-
math-di...](http://www.iheartchaos.com/post/16393143676/fun-with-math-
dividing-one-by-998001-yields-a#comment-419334498) is one example.

------
bryanlarsen
\- I'm using bash on Ubuntu. When I type "kill <tab>" I get a list of process
numbers, not the list of files in my current directory as you imply.

\- shared history sounds like a bug, not a feature. I have long lived
terminals open, each dedicated to a specific purpose. Shared history would
intermingle them.

\- typing `gut` in bash gives me:

    
    
        No command 'gut' found, did you mean:
         Command 'cut' from package 'coreutils' (main)
         Command 'get' from package 'code-aster-run' (universe)
         Command 'gout' from package 'scotch' (universe)
         Command 'git' from package 'git' (main)
         Command 'gpt' from package 'gpt' (universe)
         Command 'gst' from package 'gnu-smalltalk' (universe)
    

You're batting 0/3. Certainly there must be some advantages to ZSH, but you
haven't listed any yet.

(Note that I didn't have to configure any of this. Ubuntu probably did, but I
didn't).

~~~
pmr_
He also doesn't hit the mark on editing modes. Emacs and Vi keybindings for
shells are usually provided by libreadline.

I was really looking for a different shell before. But if those are zsh
killler features, it certainly wont be my choice.

~~~
mgrouchy
Zsh use's zle(Z-Shell Line Editor), which is different then libreadline as its
part of the shell not a separate library. Zle's behavior is editable through
your .zshrc.

Maybe I dumbed the post down too much, was just listing a few features that I
use every day that IMO work better then the comparable Bash features.

~~~
samwilliams
I read and enjoyed the article and I am surprised it has recieved this level
of criticism here.

Perhaps you should update it and add a number of the other features that you
like about it (with a brief description..)?

(edit: spelling)

------
jgrahamc
I like zsh. Probably my favorite feature is that it will autocomplete
paths/filenames in an scp command on the remote end if authentication is done
with keys.

Also you can do stuff like /u/l/b and hit TAB.

~~~
riobard
_Probably my favorite feature is that it will autocomplete paths/filenames in
an scp command on the remote end if authentication is done with keys._

This is possible in Bash too with bash-completion.

------
Wilya
Funnily enough, I find that the autocorrection tends to get in my way more
often than not. Being prompted if I meant 'git' when I type 'gut' interrups my
thinking flow, while 'command not found' doesn't. And the autocorrect is very
bad for cp/mv ('mv test test1' will likely ask me if I meant 'test' instead of
'test1').

That being said, I'm a happy zsh user, for all it provides. Autocorrection is
just one of the only things that, in my opinion, don't work well, so it's
strange to market them.

~~~
sjs

        setopt correct              # try to correct spelling...
        setopt no_correctall        # ...only for commands, not filenames
    

[https://github.com/samsonjs/config/blob/master/zsh/zshrc#L11...](https://github.com/samsonjs/config/blob/master/zsh/zshrc#L111-112)

[...]

    
    
        alias cp='nocorrect cp'            # don't correct spelling for 'cp'
        alias mkdir='nocorrect mkdir'      # don't correct spelling for 'mkdir'
        alias mv='nocorrect mv'            # don't correct spelling for 'mv'
    

[https://github.com/samsonjs/config/blob/master/zsh/zshrc#L20...](https://github.com/samsonjs/config/blob/master/zsh/zshrc#L202-213)

------
babs474
Is anybody else addicted to shell mode within emacs?

I love having the shell as just another buffer right in the editor. Easy
history searchability, copy and paste between code and various repls or SQL
prompts, and all the other full editor features available at the prompt.

~~~
drothlis
I like the idea, but I'm too used to bash's autocompletion (the Emacs-provided
autocompletion is similar but not quite the same), the autocd option, CDPATH,
etc. And changing directories in the shell with anything other than cd (pushd,
or an alias or script) confuses Emacs's directory completion.

The last couple of days I've been trying terminal-mode rather than shell-mode,
and it works much better. Many standard Emacs keybindings get remapped though.

~~~
drothlis
Edit: I meant term-mode (M-x term), not terminal-mode (M-x terminal-emulator).
No idea why there are two different terminal emulators in Emacs, but 'M-x
term' seems the better of the two, or at least the keybindings make more sense
to me.

There is also 'M-x serial-term' should you ever need it.

~~~
prakashk
There are M-x shell and M-x eshell to run shells within emacs.

See [http://www.masteringemacs.org/articles/2010/11/01/running-
sh...](http://www.masteringemacs.org/articles/2010/11/01/running-shells-in-
emacs-overview/) for comparison.

~~~
drothlis
Yes. My original comment (the grandparent to your comment) attempted to
explain why I prefer term-mode over shell-mode.

------
jroes
I used to use oh-my-zsh but gave up on it after a few months because it took
almost 20 seconds to open up a Terminal tab. I switched back to bash with some
really basic git completion and was happy enough, enjoying < 2 second opening
times.

~~~
arghnoname
my tabs open up immediately but it does take a little while to log in, which
really is annoying. I think depending on how you configure things you can move
where and how often the wait occurs and by disabling certain things, how long
it is.

------
steder
+1 for actually giving me a couple reasons to try zsh. Of course I'd be
surprised if many of these features aren't already hacked into some bash
guru's dotfiles but, that said, more autocompletions without writing them
myself is always nice.

------
RyanMcGreal
The supremacy of bash over zsh &c. seems to be an excellent case study in the
"Worse is Better" hypothesis.

<http://www.jwz.org/doc/worse-is-better.html>

~~~
Symmetry
Not really, you're not seeing bash have many more features because its simpler
on the inside at the cost of sometimes breaking. Rather, it seems an example
of " the most dangerous enemy of a better solution is an existing codebase
that is just good enough"

~~~
justincormack
Not sure that is the real reason. Zsh was not free software in the Linux
formative years. It lost its chance, and mindshare, like so much commercial
Unix

~~~
recoil
Zsh was never part of a commercial Unix, so I suspect you are thinking of Ksh.
As far as I can tell, Zsh has always been free software: the earliest version
I could find used the GPL, but it now uses something more MIT-like.

Bash is probably more widely used because it was available earlier than Zsh,
and because it was the "official" shell of the GNU project (better marketing).

------
adavies42
my favorite zsh feature is advanced globbing--i'd far rather type

    
    
        ls -d ***/*(/)
    

than

    
    
        find . -follow -type d -exec ls -d {} \;

~~~
graywh
FYI, the (/) is called a glob qualifier.

------
heresy
I agree, though I'd probably suggest working from a simple zshrc for starters
("man zshall" is also your friend).

I just spent a bit of time yesterday tweaking information in my prompt just
so:

<http://imgur.com/OSEB3>

And it's made a huge quality of life difference to what I had before.

Worth spending a bit of time making your shell environment optimized for
yourself though, and not just copying someone else's setup, in my opinion.

You spend a _lot_ of time there, programming for UNIX, why not make it rock?

------
nickolai
I used to use a lot of zsh at work, and one thing that drove me nuts was
overzealous wildcard expansion.

    
    
      >scp server2:~/folder/* .

zsh: no matches found: server2:~/folder/*

nothing in current work dir matches 'server2:~/folder/ * ', so zsh helpfully
yells at me. yeah I know use single quotes to avoid expansion, and backslash
should work too. It makes total sense because * is a reserved character, but
still, _bash_ got it. surely _Zsh_ could've too ?

It probably got fixed since then, but this raw frustration is my most vivid
memory from zsh usage.

~~~
satiani
This behavior can be turned off by adding this to .zshrc:

    
    
      setopt no_nomatch # if there are no matches for globs, leave them alone and execute the command
    

zsh also tries to autocomplete directory names using variables in global
namespace that point to directories. I found that behavior maddening and can
be turned off with:

    
    
      setopt no_cdable_vars # don't use named directories in cd autocompletion

------
tux1968
This article inspired me to give zsh a spin. The pre configured setup of oh-
my-zsh is a nice starting point.

But am really missing the Bash "help" command, and the combined (easily
searchable) man page.

Thus far I have not been able to figure out which feature or config option to
disable to stop this annoyance:

$ grep vim

zsh: correct 'vim' to '.vim' [nyae]?

Please don't "help me", i typed exactly what I wanted.

~~~
skeletonjelly
Care to post your .zshrc?

Edit: I have setopt correctcall and I do not get this behaviour.

On an unrelated not, this is a classic example of complaining about why a
product doesn't work and having users jump at the chance to fix your issue to
prove it's worth.

But how to monitize this... :)

~~~
tux1968
lol, guilty.... where do I send my micro-payment ;o)

~~~
skeletonjelly
Woah. Micro? I'm playing the big numbers game with small amounts of customers
;)

------
xegroeg
Bash can also do shared history:

    
    
      export HISTCONTROL=ignoredups
      export HISTCONTROL=ignoreboth
      HISTSIZE=50000
      shopt -s histappend
      PROMPT_COMMAND='history -a'
      #history search inline
      #bind '"\e[A": history-search-backward'
      #bind '"\e[B": history-search-forward'

------
bsagert
Thanks mgrouchy for another site that breaks pgdn. The header that never moves
hides some lines on the next page. Reading becomes an annoying series of page
downs then scroll up a bit to read the hidden sentences. Does this annoy
anyone else?

~~~
mgrouchy
Hey, thanks for the feedback, I just recently changed the look of the blog
after about a year of neglect. Its actually just Twitter Bootstrap(1.4). I
never use page down or up so I completely missed the problem. I will see if I
can find a workaround. Thanks again!

------
tlvince
If you're looking for the "keyboard navigable completion list", this what you
want:

    
    
        zstyle ':completion:*' menu select

~~~
ilaksh
I tried that and about a million other things in Ubuntu. When I hit tab I see
options, but nothing I put in my .zshrc will allow me to use the arrow keys or
anything else to navigate the completion list.

I am using oh my zsh but I tried turning it off and it didn't seem to matter.

Maybe only Mac users use zsh?

~~~
gmartres
With the default oh-my-zsh config, you have to hit tab two times, for example
ls<space><tab><tab>

~~~
ilaksh
Wow! I would have never thought of that.. lol

Thanks a lot.. works.

------
skeletonjelly
I wish the author had put the settings used to get those effects. Unless they
are default? It's probably just formatting?

~~~
mgrouchy
some of them are the built in oh-my-zsh things, but I added some of the
settings in the posts comments for people who asked.

Is there something particular you are looking for?

~~~
skeletonjelly
I was wondering how you got this so pretty?
[http://mikegrouchy.com/media/images/2012/01/zshkillcompletio...](http://mikegrouchy.com/media/images/2012/01/zshkillcompletion.jpg)

I don't get the username either.

------
mobjedgar
This is incredible. I'm converted!

------
jfmercer
bash's spy equivalent in Jason Bourne. zsh can't compete with that.

------
dbbo
Due to the poor spelling and grammar, gross oversimplification of zsh's
advantages, and the inclusion of oh-my-zsh as a reason to switch, I found this
post insulting (as a long time zsh user). And I actually want more people to
use zsh, because that would mean more collaboration, more tips, and better
script compatibility.

~~~
bdunbar
_and the inclusion of oh-my-zsh as a reason to switch_

That's the reason why I switched. Perhaps I'm missing something: what's wrong
with 'oh-my-zsh'?

