Get zsh today. Give it a spin.
Get zsh today. Give it a spin.
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
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)...Re number 2: That works in plain old Bash too:
ls DSC{100..200}.jpg > 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.That's technically true for zsh in cases, but it's far easier to port or add compatibility for zsh than fish.
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.