From: Eric Blake Date: Tue, 3 Aug 2010 21:56:07 +0000 (-0600) Subject: docs: mention bash bug with word splitting X-Git-Tag: v2.68~70 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5adc15b7b64622cf6f7f76e8b6f5cbde4be82851;p=thirdparty%2Fautoconf.git docs: mention bash bug with word splitting * doc/autoconf.texi (Shell Substitutions): Document bash bug, and zsh default behavior difference. Reported by Ralf Wildenhues. --- diff --git a/ChangeLog b/ChangeLog index 3d3ace6b..7184742e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2010-08-03 Eric Blake + docs: mention bash bug with word splitting + * doc/autoconf.texi (Shell Substitutions): Document bash bug, and + zsh default behavior difference. + Reported by Ralf Wildenhues. + docs: mention ksh bug with function syntax * doc/autoconf.texi (Shell Functions): Document ksh93 limitation. diff --git a/doc/autoconf.texi b/doc/autoconf.texi index e292062d..b7e2c197 100644 --- a/doc/autoconf.texi +++ b/doc/autoconf.texi @@ -15283,6 +15283,32 @@ $ @kbd{echo "`echo \"hello\"`"} There is just no portable way to use double-quoted strings inside double-quoted back-quoted expressions (pfew!). +Bash 4.1 has a bug where quoted empty strings adjacent to unquoted +parameter expansions are elided during word splitting. Meanwhile, zsh +does not perform word splitting except when in Bourne compatibility +mode. In the example below, the correct behavior is to have five +arguments to the function, and exactly two spaces on either side of the +middle @samp{-}, since word splitting collapses multiple spaces in +@samp{$f} but leaves empty arguments intact. + +@example +$ @kbd{bash -c 'n() @{ echo "$#$@@"; @}; f=" - "; n - ""$f"" -'} +3- - - +$ @kbd{ksh -c 'n() @{ echo "$#$@@"; @}; f=" - "; n - ""$f"" -'} +5- - - +$ @kbd{zsh -c 'n() @{ echo "$#$@@"; @}; f=" - "; n - ""$f"" -'} +3- - - +$ @kbd{zsh -c 'emulate sh;} +> @kbd{n() @{ echo "$#$@@"; @}; f=" - "; n - ""$f"" -'} +5- - - +@end example + +@noindent +You can work around this by doing manual word splitting, such as using +@samp{"$str" $list} rather than @samp{"$str"$list}. + +There are also portability pitfalls with particular expansions: + @table @code @item $@@ @cindex @samp{"$@@"}