by Malcolm Rowe

Stupid UNIX (shell) tricks

I was looking at the (now ancient, by internet standards) history meme a while ago. Here’s my results, at work:

100 (build)
87 p4
47 grep
41 cd
33 vim
20 ls
18 kill
16 (starting up a webserver)
15 rm
14 less

and at home:

88 ls
61 cd
35 less
31 curl
18 rm
17 svn
16 ./configure
12 su
12 make
12 cat

One thing I noticed when browsing through my shell history (yeah, yeah, I’m that sad) is that I make use of a load of little tricks that I didn’t know about only a year ago (when I wasn’t using the shell on such a regular basis). Here’s a couple:

Globs are great. In particular, brace expansion rocks:

diff -u some/long/tab/completed/path/file.{old,new}
cp another/long/path/to/file{,.bak}
ls src/java{,tests}/com/example/something

Piping is fun too. I run foo | less all the time, but I also do foo | cat occasionally. This is useful because it prevents foo from seeing stdout as a terminal, which makes some programs behave differently; for example, ps -f will trim command lines to the terminal width, while ps -f | cat will show the whole command.

The shell is a great calculator. Well, within limits: it’s great as long as everything you want to do will fit into a 64-bit signed int (so no floating point, and I can’t try out my favourite equation either). But it’s easy to use:

echo $((1 + 1))
echo $((0x41))
echo $((1 << 48))

Finally, here’s one I only started using recently: you probably know that you can use cd - to return from the directory you came from, but did you know that ~- expands to that old directory? I’ve using it when flicking between directories to do things like less ~-/somefile.