Describe a Solaris /bin/sh bug w.r.t. for loops.

* doc/autoconf.texi (Limitations of Shell Builtins) <for>:
Document a bug of the 'for' builtin in Solaris /bin/sh, w.r.t.
tokens seeming variable assignment in the list of arguments.

Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Stefano Lattarini 2010-07-02 18:14:52 +02:00 committed by Eric Blake
parent 7eccc094e8
commit a20b49a348
2 changed files with 48 additions and 0 deletions

View File

@ -1,3 +1,13 @@
2010-07-02 Stefano Lattarini <stefano.lattarini@gmail.com>
Eric Blake <eblake@redhat.com>
Describe a Solaris /bin/sh bug w.r.t. for loops.
* doc/autoconf.texi (Limitations of Shell Builtins) <for>:
Document a bug of the 'for' builtin in Solaris /bin/sh, w.r.t.
tokens seeming variable assignment in the list of arguments.
Report and final patch by Stefano Lattarini, useful suggestions
by Eric Blake.
2010-06-23 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
Improve VPATH handling in config.status for non-Automake projects.

View File

@ -16703,6 +16703,44 @@ But keep in mind that Zsh, even in Bourne shell emulation mode, performs
word splitting on @samp{$@{1+"$@@"@}}; see @ref{Shell Substitutions},
item @samp{$@@}, for more.
In Solaris @command{/bin/sh}, when the list of arguments of a
@command{for} loop starts with @emph{unquoted} tokens looking like
variable assignments, the loop is not executed on that tokens:
@example
$ @kbd{/bin/sh -c 'for v in a=b; do echo "$v"; done'}
$ @kbd{/bin/sh -c 'for v in a=b d=c; do echo "$v"; done'}
$ @kbd{/bin/sh -c 'for v in a=b x; do echo "$v"; done'}
x
@end example
@noindent
Quoting the "assignment-like" tokens, or preceding them with "normal"
tokens, solves the problem:
@example
$ @kbd{/bin/sh -c 'for v in "a=b"; do echo "$v"; done'}
a=b
$ @kbd{/bin/sh -c 'for v in x a=b; do echo "$v"; done'}
x
a=b
$ @kbd{/bin/sh -c 'for v in x a=b d=c; do echo "$v"; done'}
x
a=b
c=d
@end example
@noindent
Luckily enough, the bug is not triggered if the "assignment-like"
tokens are the results of a variable expansion (even unquoted):
@example
$ @kbd{/bin/sh -c 'x="a=b"; for v in $x; do echo "$v"; done'}
a=b
@end example
@noindent
So, at least, the bug should be easy to grep for and to avoid.
@anchor{if}
@item @command{if}