[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Bash true/false builtings undocumented? "false" not working?



-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On Fri, Aug 17, 2018 at 08:23:51AM -0400, Greg Wooledge wrote:
> On Fri, Aug 17, 2018 at 06:46:54PM +1000, Zenaan Harkness wrote:
> > $ test $? && echo ok || echo error $?
> 
> Others have already pointed out that  test $?  is not what you think it
> is.  When the test command is given 1 argument, it tests that argument's
> string length.  If the string length is 0, then it's false.  If the
> string length is non-zero, then it's true.
> 
> The string length of $? is always non-zero, so  test $?  is always true.

Exactly.

> But what I really wanted to point out is that the  x && y || z  construct
> is BROKEN and WRONG.  See <https://mywiki.wooledge.org/BashPitfalls#pf22>
> for the verbose explanation.

All generalizations suck :)

[...]

> Or, if you only care about one of the two cases, you may use EITHER
> the && or the || operator.  Just never, ever use both of them in the
> same compound command.
> 
> mycommand arg1 arg2 || die "whoopsie"

The construction

  foo && echo "bar" || echo "baz"

does probably work, because echo's exit status is (always?) 0 (the bash
builtin's documentation mumbles something about "write error"). And then,
the order matters -- first && then ||. I think such idiomatic constructions
are OK as long as you know what you're doing. As soon as the branches
contain more complex stuff, I agree you shouldn't do it: even if you've
convinced yourself that it works, the code becomes obscure and difficult
to understand/change by someone else (which might be yourself two years
down).

Cheers
- -- tomás
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.12 (GNU/Linux)

iEYEARECAAYFAlt20R4ACgkQBcgs9XrR2kY8CgCfYfHXfeDyqQ/ebWZrs24BPHIE
7NUAniyfZd2F/A/f27P1YVuuFP4nYnGi
=hE0n
-----END PGP SIGNATURE-----


Reply to: