From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1335 invoked from network); 9 Apr 2002 10:37:05 -0000 Received: from sunsite.dk (130.225.247.90) by ns1.primenet.com.au with SMTP; 9 Apr 2002 10:37:05 -0000 Received: (qmail 2498 invoked by alias); 9 Apr 2002 10:36:56 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 16945 Received: (qmail 2487 invoked from network); 9 Apr 2002 10:36:55 -0000 To: Akim Demaille cc: zsh-workers@sunsite.dk, ab@purdue.edu, bug-autoconf@gnu.org Subject: Re: Zsh 3 and ${1+"$@"} (Was: [GNU Autoconf 2.53] testsuite.log: 126 failures) In-reply-to: "Akim Demaille"'s message of "09 Apr 2002 11:45:11 +0200." Date: Tue, 09 Apr 2002 11:35:43 +0100 Message-ID: <28727.1018348543@csr.com> From: Peter Stephenson Akim Demaille wrote: > Hi! > > We (Autoconf) have a big problem with Zsh 3.0.8. You know it is > shipped on Darwin as /bin/sh. But this version does not understand > ${1+"$@"} properly. We use this instead of "$@" to work around a bug > which still exists today in many many constructors' /bin/sh, so we > can't departure from it. I think the problem you are running across is that with the option SH_WORD_SPLIT set (as it is for sh compatibility), you get this behaviour: % set 'one two' % for arg in ${1+"$@"}; do echo $arg; done one two whereas you expect `one two' on the same line. This problem is still in zsh 4 --- inside another substitution, either it's splitting all words on spaces, or it's splitting none. This sort of mess is why zsh doesn't have SH_WORD_SPLIT on by default, but that doesn't help you... If you want to work around this you have two basic choices: 1. Unset shwordsplit: [ x$ZSH_VERSION != x ] && unsetopt shwordsplit This will have a knock on effect on all unquoted shell parameter substitutions, however. If you are relying on these producing multiple command arguments --- e.g. for building up arguments for `for' loops in a single parameter --- you are stuck unless you can find some way of turning shwordsplit off and on before using ${1+"$@"}. (Writers of configure scripts --- not autoconf itself --- often incorrectly assume something like `test x$foo != x' will always produce the same number of words, but that's a separate problem from the one you face.) 2. Rework the substitution. In zsh, you would get away with ${==1+"$@"}, since the doubled `=' is a flag to turn off SH_WORD_SPLIT for that substitution. Obviously, getting this in for zsh and not for other shells is a bit of a nightmare. Indeed, rather than do that, it would presumably be easier to use "$@" for zsh instead of ${1+"$@"} (this handles zero arguments correctly), which is exactly what you're trying to avoid. Neither of these looks very promising. "${1+"$@"}" also works in zsh, but this confuses other variants of sh --- it works in bash, but sh on SunOS 5.8 tripped over it. I haven't looked for any cleverer substitutions which will always work. Given that ${1+"$@"} is already a despairing workaround, it seems unlikely there's anything more complicated which will fool everyone at once. -- Peter Stephenson Software Engineer CSR Ltd., Science Park, Milton Road, Cambridge, CB4 0WH, UK Tel: +44 (0)1223 392070 ********************************************************************** The information transmitted is intended only for the person or entity to which it is addressed and may contain confidential and/or privileged material. Any review, retransmission, dissemination or other use of, or taking of any action in reliance upon, this information by persons or entities other than the intended recipient is prohibited. If you received this in error, please contact the sender and delete the material from any computer. **********************************************************************