Hacker News new | past | comments | ask | show | jobs | submit login

Came here to say the exact same thing.

Get zsh today. Give it a spin.




I hear a lot about it -- could you give me your favorite 2-3 features that make you prefer it over bash?


Three things I use regularly, even in scripts:

1) Glob qualifiers:

  ls *(.)
will only match files, not directories, symlinks etc.

  ls **/*.jpg(.L-3000000on[1,5]) **/*.png(N)
will match .jpg files in the current and all subdirectories, which are:

  . files
  L-3000000 with "length" (size) under 3MB
  on ordering them numerically
  [1,5] and only the first five
plus any
.png files, if they exist (N = it won't fail if they don't).

I have some scripts with expressions this complicated, but day-to-day it's useful for finding empty files (L0) or excluding directories. "man zshexpn" and search "Glob Qualifiers".

2) Glob operators:

  ls DSC<100-200>.JPG
matches files with names between DSC100.JPG to DSC200.JPG.

  setopt extended_glob
  ls *.java~*Test*
matches all .java files, except those matching Test*. Same man page, search "Glob Operators".

3) Lazy for-loops (single command doesn't require do-done), and taking two variables:

  echo "A 1" > tempfile
  for i j in $(<tempfile); echo $i $j
4) Parameter expansion.

  > x=EXAMPLE.jpg
  > echo $x:r.png ${x:r:l}.png
  EXAMPLE.png example.png
Interactively, shell history seems to be nicer, I use a couple of global aliases (alias -g L='| less'), and the completion system completes everything you can possibly think of, like usernames, hostnames, remote filenames, HTTP URLs, processes (for kill)...


Great list - I didn't know about glob operators. That glob negation is going to be very handy.

Re number 2: That works in plain old Bash too:

    ls DSC{100..200}.jpg


That's not quite the same. Zsh's <X-Y> is file globbing, only files that exist are returned. {X-Y} is parameter expansion without regard to files:

  > touch 1 3
  > ls <1-3>
  1 3
  > ls {1..3}
  cannot access 2: no such file or directory
  1 3
Nevertheless, that's a useful and more powerful alternative to seq that I didn't know about.


I am using zsh + prezto. https://github.com/sorin-ionescu/prezto

Tab completion is extremely powerful. Even serious spelling mistakes are forgiven.

The prompt is Git-aware and this provides a lot of helpful information which saves me from having to query the git cli.

There are also plugins available for completion of other programs such as rake


Or fish, which is basically zsh with sane defaults.


And a completely incompatible non-POSIX syntax, which sounds great in theory but isn't nearly enough better to justify the departure IMHO.


Why does compatibility matter? If you have a script written for sh or bash it will just run using that interpreter.


There are http://www.commandlinefu.com and the like. I copy and paste stuff from the web into the shell occasionally, I'm sure everyone does. I do use fish, but it is annoying sometimes, it's missing the most basic stuff like backticks. So much so that I think I'm going to stop.


I'm sure you know this, but it's not missing that feature. It's just that the syntax is different.


For starters, any utilities based on sourcing won't work, such as nvm/rbenv/etc.

That's technically true for zsh in cases, but it's far easier to port or add compatibility for zsh than fish.


You can use bass which solves this problem without porting the script to fish: https://github.com/edc/bass


Or bash, since it will be installed everywhere, you don't have to get it, and most scripts you'll find online will work on it.


This is a non-issue. The `!#/bin/bash` at the top of scripts will tell the interpreter which shell to run. And any one liner I've found online for bash has also worked on zsh (for me), but even if it didn't: `bash -c ls`


Yes exactly.

Today I learned people actually write / use scripts without specifying the interpreter at the top of the script. This is like writing a Ruby script and expecting it to work when calling it with the Python interpreter.


Yeah, it's actually not installed everywhere (e.g. FreeBSD).


Anywhere that matters. Besides, still more places than fish or zsh.


Minus it being bash-compliant. Deal breaker for most.




Join us for AI Startup School this June 16-17 in San Francisco!

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: