The "-a" and "-o" binary logical operators are no exception, even if documented by the Debian Policy Manual.
One feature of writing something like the following code, is that upon success of the first command, the second won't be executed: it will be short-circuited.
[ -e /dev/urandom ] || [ -e /dev/random ]
Now, using the "-a" or "-o" bashisms even in shell interpreters that support them can result in unexpected behaviour: some interpreters will short-circuit the second test, others won't.
For example, bash doesn't short-circuit:
$ strace bash -c '[ -e /dev/urandom -o -e /dev/random ]' 2>&1|grep /dev stat64("/dev/urandom", ...) = 0 stat64("/dev/random", ...) = 0Neither does dash:
$ strace dash -c '[ -e /dev/urandom -o -e /dev/random ]' 2>&1|grep /dev stat64("/dev/urandom", ...) = 0 stat64("/dev/random", ...) = 0But posh does:
$ strace posh -c '[ -e /dev/urandom -o -e /dev/random ]' 2>&1|grep /dev stat64("/dev/urandom", ...) = 0And so does pdksh:
$ strace pdksh -c '[ -e /dev/urandom -o -e /dev/random ]' 2>&1|grep /dev stat64("/dev/urandom", ...) = 0
output of strace redacted for brevity
So even in Debian, where the feature can be expected to be implemented, its semantics are not very well defined. So much for using this bashism... better avoid it.
Remember, if you rely on any non-standard behaviour or feature make sure you document it and, if feasible, check for it at run-time.
I don't understand this... So basically you're saying to avoid using "-a" and "-o" in tests or avoid using ||/&&? I always use "-a" and "-o" and not had any problem until now (of course, I used only bash...).
ReplyDelete-a and -o should be avoided
Delete