autoconf-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[SCM] GNU Autoconf source repository branch, master, updated. v2.67-34-g


From: Eric Blake
Subject: [SCM] GNU Autoconf source repository branch, master, updated. v2.67-34-gb292f28
Date: Thu, 26 Aug 2010 17:29:49 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU Autoconf source repository".

http://git.sv.gnu.org/gitweb/?p=autoconf.git;a=commitdiff;h=b292f282e2aefc4977c522af66a4e9c75584f9d4

The branch, master has been updated
       via  b292f282e2aefc4977c522af66a4e9c75584f9d4 (commit)
      from  65d740da996b3284f0e18fe845d51dbb4373e751 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit b292f282e2aefc4977c522af66a4e9c75584f9d4
Author: Eric Blake <address@hidden>
Date:   Wed Aug 25 22:05:45 2010 -0600

    docs: mention another issue with variable expansion
    
    In particular, see http://austingroupbugs.net/view.php?id=221
    and http://austingroupbugs.net/view.php?id=255.
    
    * doc/autoconf.texi (Shell Substitutions) <${var+value}>: New
    subsection.
    <${var=literal}>: Tweak wording.  Add mention of an ambiguity
    allowed by POSIX.
    * tests/torture.at (Substitute and define special characters):
    Make test more robust; here, the outer "" is in a here-doc, and
    does not violate the quoting rules of thumb just documented.
    
    Signed-off-by: Eric Blake <address@hidden>

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog         |   13 +++++
 doc/autoconf.texi |  148 +++++++++++++++++++++++++++++++++++++++++++++--------
 tests/torture.at  |    4 +-
 3 files changed, 142 insertions(+), 23 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index fa252b3..8097db5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2010-08-26  Eric Blake  <address@hidden>
+
+       docs: mention another issue with variable expansion
+       In particular, see http://austingroupbugs.net/view.php?id=221
+       and http://austingroupbugs.net/view.php?id=255.
+       * doc/autoconf.texi (Shell Substitutions) <${var+value}>: New
+       subsection.
+       <${var=literal}>: Tweak wording.  Add mention of an ambiguity
+       allowed by POSIX.
+       * tests/torture.at (Substitute and define special characters):
+       Make test more robust; here, the outer "" is in a here-doc, and
+       does not violate the quoting rules of thumb just documented.
+
 2010-08-25  Eric Blake  <address@hidden>
 
        m4sh: revert incorrect mix of "${a='b'}"
diff --git a/doc/autoconf.texi b/doc/autoconf.texi
index 28637c5..98dafa9 100644
--- a/doc/autoconf.texi
+++ b/doc/autoconf.texi
@@ -15392,52 +15392,157 @@ bad substitution
 @ifnotinfo
 @cindex address@hidden@var{var}:address@hidden@}
 @end ifnotinfo
address@hidden address@hidden@address@hidden@}
 Old BSD shells, including the Ultrix @code{sh}, don't accept the
 colon for any shell substitution, and complain and die.
 Similarly for address@hidden@var{var}:address@hidden@}, 
address@hidden@var{var}:address@hidden@}, etc.
 
address@hidden address@hidden@address@hidden@}
address@hidden address@hidden@address@hidden@}
address@hidden address@hidden@address@hidden@}
address@hidden address@hidden@address@hidden@}
+When using @address@hidden@address@hidden@}} or
address@hidden@address@hidden@address@hidden for providing alternate 
substitutions,
address@hidden must either be a single shell word or be quoted.  Solaris
address@hidden/bin/sh} complains otherwise.
+
address@hidden
+$ @kbd{/bin/sh -c 'echo address@hidden address@hidden'}
+/bin/sh: bad substitution
+$ @kbd{/bin/sh -c 'echo address@hidden'\''b c'\''@}'}
+b c
+$ @kbd{/bin/sh -c 'echo "address@hidden address@hidden"'}
+b c
address@hidden example
+
+According to Posix, if an expansion occurs inside double quotes, then
+the use of unquoted double quotes within @var{value} is unspecified, and
+any single quotes become literal characters; in that case, escaping must
+be done with backslash.
+
address@hidden
+$ @kbd{/bin/sh -c 'echo "address@hidden"b  c"@}"'}
+/bin/sh: bad substitution
+$ @kbd{ksh -c 'echo "address@hidden"b  c"@}"'}
+b c
+$ @kbd{bash -c 'echo "address@hidden"b  c"@}"'}
+b  c
+$ @kbd{/bin/sh -c 'a=; echo address@hidden'\''b  c'\''@}'}
+b  c
+$ @kbd{/bin/sh -c 'a=; echo "address@hidden'\''b  c'\''@}"'}
+'b  c'
+$ @kbd{/bin/sh -c 'a=; echo "address@hidden"b  c\"@}"'}
+"b  c"
+$ @kbd{/bin/sh -c 'a=; echo "address@hidden  address@hidden"'}
+b  c
address@hidden example
+
+Perhaps the easiest way to work around quoting issues in a manner
+portable to all shells is to place the results in a temporary variable,
+then use @samp{$tmp} as the @var{value}, rather than trying to inline
+the expression needing quoting.
+
address@hidden
+$ @kbd{/bin/sh -c 'tmp="a  b\"'\''@}\\"; echo "address@hidden@}"'}
+b  c"'@}\
+$ @kbd{ksh -c 'tmp="a  b\"'\''@}\\"; echo "address@hidden@}"'}
+b  c"'@}\
+$ @kbd{bash -c 'tmp="a  b\"'\''@}\\"; echo "address@hidden@}"'}
+b  c"'@}\
address@hidden example
+
address@hidden address@hidden@address@hidden@}
address@hidden address@hidden@address@hidden@}
 When using @address@hidden@address@hidden@}} to assign a default value
 to @var{var}, remember that even though the assignment to @var{var} does
 not undergo file name expansion, the result of the variable expansion
-does.  In particular, when using @command{:} followed by unquoted
-variable expansion for the side effect of setting a default value, if
-either @samp{value} or the prior contents of @samp{$var} contains
-globbing characters, the shell has to spend time performing file name
+does unless the expansion occurred within double quotes.  In particular,
+when using @command{:} followed by unquoted variable expansion for the
+side effect of setting a default value, if the final value of
address@hidden contains any globbing characters (either from @var{value} or
+from prior contents), the shell has to spend time performing file name
 expansion and field splitting even though those results will not be
-used.  Therefore, it is a good idea to use double quotes when performing
-default initialization.
+used.  Therefore, it is a good idea to consider double quotes when performing
+default initialization; while remembering how this impacts any quoting
+characters appearing in @var{value}.
 
 @example
-$ time bash -c ': "address@hidden/usr/bin/address@hidden"; echo "$a"'
+$ @kbd{time bash -c ': "address@hidden/usr/bin/address@hidden"; echo "$a"'}
 /usr/bin/*
 
 real   0m0.005s
 user   0m0.002s
 sys    0m0.003s
-$ time bash -c ': address@hidden/usr/bin/address@hidden; echo "$a"'
+$ @kbd{time bash -c ': address@hidden/usr/bin/address@hidden; echo "$a"'}
 /usr/bin/*
 
 real   0m0.039s
 user   0m0.026s
 sys    0m0.009s
+$ @kbd{time bash -c 'a=/usr/bin/*; : address@hidden@}; echo "$a"'}
+/usr/bin/*
+
+real   0m0.031s
+user   0m0.020s
+sys    0m0.010s
+
+$ @kbd{time bash -c 'a=/usr/bin/*; : "address@hidden@}"; echo "$a"'}
+/usr/bin/*
+
+real   0m0.006s
+user   0m0.002s
+sys    0m0.003s
 @end example
 
-Use quotes if @var{literal} contains more than one shell word:
+As with @samp{+} and @samp{-}, you must use quotes when using @samp{=}
+if the @var{value} contains more than one shell word; either single
+quotes for just the @var{value}, or double quotes around the entire
+expansion:
 
 @example
-: "address@hidden'Some words'@}"
+$ @kbd{: address@hidden'Some words'@}}
+$ @kbd{: "address@hidden address@hidden"}
+$ @kbd{echo $var1 $var2}
+Some words like this
 @end example
 
 @noindent
-otherwise some shells, such as on Digital Unix V 5.0, die because
-of a ``bad substitution''.
+otherwise some shells, such as Solaris @command{/bin/sh} or on Digital
+Unix V 5.0, die because of a ``bad substitution''.  Meanwhile, Posix
+requires that with @samp{=}, quote removal happens prior to the
+assignment, and the expansion be the final contents of @var{var} without
+quoting (and thus subject to field splitting), in contrast to the
+behavior with @samp{-} passing the quoting through to the final
+expansion.  However, @command{bash} 4.1 does not obey this rule.
 
address@hidden 1
address@hidden
+$ @kbd{ksh -c 'echo address@hidden \ address@hidden'}
+a  b
+$ @kbd{ksh -c 'echo address@hidden \ address@hidden'}
+a b
+$ @kbd{bash -c 'echo address@hidden \ address@hidden'}
+a  b
address@hidden example
 
-Solaris @command{/bin/sh} has a frightening bug in its interpretation
-of this.  Imagine you need set a variable to a string containing
+Finally, Posix states that when mixing @address@hidden@}} with regular
+commands, it is unspecified whether the assignments affect the parent
+shell environment.  It is best to perform assignments independently from
+commands, to avoid the problems demonstrated in this example:
+
address@hidden
+$ @kbd{bash -c 'x= address@hidden:address@hidden sh -c "echo +\$x+\$y+";echo 
-$x-'}
++b+b+
+-b-
+$ @kbd{/bin/sh -c 'x= address@hidden:address@hidden sh -c "echo 
+\$x+\$y+";echo -$x-'}
+++b+
+--
+$ @kbd{ksh -c 'x= address@hidden:address@hidden sh -c "echo +\$x+\$y+";echo 
-$x-'}
++b+b+
+--
address@hidden example
+
address@hidden address@hidden@address@hidden@}
address@hidden address@hidden@address@hidden@}
+Solaris @command{/bin/sh} has a frightening bug in its handling of
+literal assignments.  Imagine you need set a variable to a string containing
 @address@hidden  This @address@hidden character confuses Solaris 
@command{/bin/sh}
 when the affected variable was already set.  This bug can be exercised
 by running:
@@ -15458,7 +15563,8 @@ $ @kbd{echo $foo}
 
 It seems that @address@hidden is interpreted as matching @address@hidden, even
 though it is enclosed in single quotes.  The problem doesn't happen
-using double quotes.
+using double quotes, or when using a temporary variable holding the
+problematic string.
 
 @item address@hidden@address@hidden@}
 @cindex address@hidden@address@hidden@}
@@ -15467,7 +15573,7 @@ running
 
 @example
 default="yu,yaa"
-: "address@hidden"$default"@}"
+: address@hidden"$default"@}
 @end example
 
 @noindent
@@ -15493,7 +15599,7 @@ One classic incarnation of this bug is:
 
 @example
 default="a b c"
-: "address@hidden"$default"@}"
+: address@hidden"$default"@}
 for c in $list; do
   echo $c
 done
@@ -15755,7 +15861,7 @@ the variable being initialized is not intended to be 
IFS-split
 (i.e., it's not a list), then use:
 
 @example
-: "address@hidden"$default"@}"
+: address@hidden"$default"@}
 @end example
 
 @item
diff --git a/tests/torture.at b/tests/torture.at
index a8a2aa1..6855da4 100644
--- a/tests/torture.at
+++ b/tests/torture.at
@@ -909,7 +909,7 @@ AC_DEFINE_UNQUOTED([unq1], [$baz], [unquoted, test 1])
 AC_DEFINE_UNQUOTED([unq2], [\$baz], [unquoted, test 2])
 AC_DEFINE_UNQUOTED([unq3], ["$baz"], [unquoted, test 3])
 AC_DEFINE_UNQUOTED([unq4], [${baz+set}], [unquoted, test 4])
-AC_DEFINE_UNQUOTED([unq5], ["${baz+`echo "a b"`}"], [unquoted, test 5])
+AC_DEFINE_UNQUOTED([unq5], ["${baz+`echo "a "' b'`}"], [unquoted, test 5])
 AC_DEFINE_UNQUOTED([unq6], [`echo hi`], [unquoted, test 6])
 AC_DEFINE_UNQUOTED([unq7], ['\\"'], [unquoted, test 7])
 AC_PROG_AWK
@@ -943,7 +943,7 @@ address@hidden@
 #define unq2 $baz
 #define unq3 "bla"
 #define unq4 set
-#define unq5 "a b"
+#define unq5 "a  b"
 #define unq6 hi
 #define unq7 '\"'
 ]])


hooks/post-receive
-- 
GNU Autoconf source repository



reply via email to

[Prev in Thread] Current Thread [Next in Thread]