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