From: Stefano Lattarini Date: Sun, 07 Aug 2011 13:04:59 GMT Subject: Re: test z$foo = zbar (and Re: [PATCH 1/3] bisect: relax requirement for a working tree.) 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: > 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