In terminals, the first command I run is "bash"; most of my work is in an emacs shell window, so my .emacs says
(setq shell-file-name "/bin/bash") -- actually there's an (if) in there to choose cygwin's bash if I happen to be on Windows. I do a lot of shell programming at the command line, and I simply can't live with csh-style programming.A few days ago I was working on my .cshrc file, and I noticed how dim-witted csh's if-else handling is. The classic anti-csh diatribe is Csh Programming Considered Harmful, which is an entertaining read, but there's some insanity that isn't even covered in that worthy rant. Let me start by presenting a correct csh script:
setenv FOO hello if ($FOO == hello) then echo hi else if ($FOO == goodbye) then echo see ya endif
Source that script, and the output is:
hi
Various typos can have effects on this script that range from annoying to silent but deadly. Here's an annoying one: put the second
if on a different line from the else. The output is:hi else: endif not found.
Well, at least you got an error message telling you something is up, although requiring two keywords to be on the same line is a level of stupidity worthy of Tcl. What if you do the opposite, and have too many
endifs? Well, the output is just "hi", with no error message. I suppose that doesn't bite too much, until later when you nest another if into the script, and it suddenly gets closed by one of your stealth extra endifs.But here's a bad one. Take the original script. Add an
else at the beginning, and an endif at the end. Seems like an else without an accompanying if should get a syntax error, but it doesn't. The extra endif -- which might have been there because we always had an extra one, but never got an error about it -- closes the weird else. And guess what? The script runs with no errors, and no output. The else is kind of a "if not true". How can this be a good thing? [Update 2013/11/21: Ha! Now this has actually happened to me, in almost the same way described here. I had to add some functionality to an existing script at work. It was a branch added near the top of an
if with several branches. I mistakenly added an endif at the end of my new branch. The new functionality (and the branch above it) tested fine, no error reported, so I checked it in. A few days later someone noticed that the later branches weren't running (this script gets launched from a cron job, so the problem wasn't something that would get immediately noticed). The later branches -- starting with an else for which there was no active if -- were silently skipped. Grrrr...]I did these experiments with
csh and tcsh on RedHat. Avoid csh. Long live bash!
No comments:
Post a Comment