Re: test z$foo = zbar (and Re: [PATCH 1/3] bisect: relax requirement for a working tree.)
- From
Stefano Lattarini <stefano.lattarini@gmail.com>
- Date
- Aug 7, 2011, 13:04 UTC
- Message-ID
- <201108071505.00762.stefano.lattarini@gmail.com>
- In-Reply-To
- <20110807124150.GA20046@elie.gateway.2wire.net>
On Sunday 07 August 2011, Jonathan Nieder wrote:
Show 27 quoted lines
> Am I the only one who finds this
>
> test "z$foo" = "zbar"
>
> style to be impossibly ugly? It means every time someone considers
> using the "test" utility, they decide "is this expression likely to
> looks like an operator" and each time someone reads a use of the
> "test" utility, there is a lingering question of whether that choice
> was made correctly. By contrast, if one follows the following simple
> rules, everything works fine with the shells git supports:
>
> - _Do_ use the "z$foo" trick when using expr.
> - Do not use test's '(', '),' -a and -o operators; use && and ||
> instead.
>
> The Autoconf manual says
>
> Posix also says that ‘test ! "string"’, ‘test -n "string"’ and
> ‘test -z "string"’ work with any string, but many shells (such
> as Solaris, AIX 3.2, UNICOS 10.0.0.6, Digital Unix 4, etc.)
> get confused if string looks like an operator:
>
> Notice that none of the mentioned shells is close enough to POSIX even
> to support $( / ). This is an area in which early POSIX work improved
> shells immensely (the "-e" primary was introduced around the same
> time).
>While this is true, some problems with the `test' builtin persists also with in more "posixy" shells. For example, with Solaris /bin/ksh and /usr/xpg4/bin/sh (the latter expected to be the default POSIX-compliant shell on the system, since as you've noticed /bin/sh is defintely not compliant there), one sees:
$ /usr/xpg4/bin/sh -c 'test -z ")"'; echo $? 0 $ /bin/ksh -c 'test -z ")"'; echo $? 0
This will be documented in the next version of the Autoconf manual BTW.
Regards, Stefano