zsh-workers
 help / color / mirror / code / Atom feed
From: Peter Stephenson <pws@csr.com>
To: Akim Demaille <akim@epita.fr>
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)
Date: Tue, 09 Apr 2002 11:35:43 +0100	[thread overview]
Message-ID: <28727.1018348543@csr.com> (raw)
In-Reply-To: "Akim Demaille"'s message of "09 Apr 2002 11:45:11 +0200." <mv4pu19xl20.fsf@nostromo.lrde.epita.fr>

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 <pws@csr.com>                  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.
**********************************************************************


  reply	other threads:[~2002-04-09 10:37 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <200204081534.g38FYlY0058635@epicenter.eas.purdue.edu>
2002-04-09  9:45 ` Akim Demaille
2002-04-09 10:35   ` Peter Stephenson [this message]
2002-04-09 10:51     ` Akim Demaille
2002-04-09 11:05       ` Peter Stephenson
2002-04-09 11:18       ` Bart Schaefer
2002-04-09 11:45       ` Oliver Kiddle
2002-04-09 11:59         ` Peter Stephenson
2002-04-10 15:52           ` Akim Demaille
2002-04-10 15:54             ` A Braunsdorf
2002-04-10 17:33               ` Akim Demaille
2002-04-10 20:41                 ` A Braunsdorf
2002-04-10 17:09             ` Paul Eggert
2002-04-10 17:32               ` Akim Demaille
2002-04-09 11:30     ` Peter Stephenson
2002-04-09 16:34       ` Bart Schaefer
2002-04-09 16:45         ` Peter Stephenson
2002-04-09 18:09           ` Bart Schaefer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=28727.1018348543@csr.com \
    --to=pws@csr.com \
    --cc=ab@purdue.edu \
    --cc=akim@epita.fr \
    --cc=bug-autoconf@gnu.org \
    --cc=zsh-workers@sunsite.dk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).