== Unix programs should avoid exiting non-zero for clever reasons Dan Astoorian's comment on [[yesterday's entry ../programming/BourneSetEGotcha]] reminded me of this general issue, which I will phrase this way: > Dear authors of Unix programs, please don't invent clever reasons > to have your programs exit with a non-zero status. Unless you have a really good reason, your program should only ever exit non-zero if it has actually failed. Trust me; shell programmers are perfectly competent to check for some property of your output ourselves if we really want to know. (Even if you think you have a really good reason and a really important non-error thing to communicate with your non-zero exit status, you will make shell programmers very happy if you provide a command line switch to turn this behavior off so that you really truly only exit non-zero for real errors. The only exception if pretty much all possible uses of your program will have to examine your exit code to determine what to do next.) The poster child for an overly clever non-zero exit status is _expr_, which will exit with status 1 if your expression evaluates to zero or to an empty string. This is not just silly, it is surplus; _test_ (aka _[_) gives shell script authors a perfectly good way of testing the result of our _expr_ expressions if we actually want this feature. I am sure that a few shell script authors in the world have found this convenient over the years, but I am equally sure that a lot more shell script authors have wound up grimly guarding _expr_ executions in various ways precisely because of this. Or with subtle bugs in their scripts because they were not guarding against the condition, because quick, who remembers that little _expr_ landmine? (Both have happened to us.)