From 06aeca6abe91d156762701badf1efe857b0472b5 Mon Sep 17 00:00:00 2001 From: Jan Madzik Date: Tue, 30 Jun 2009 08:06:24 +0200 Subject: [PATCH] Avoid AIX 6.1 ksh88 ECHO_C command substitution bug. * lib/m4sugar/m4sh.m4 (_AS_ECHO_N_PREPARE): Ensure more than one character is output with `\c'; reset echo output state if buggy ksh was detected, and set ECHO_T instead of ECHO_C. * doc/autoconf.texi (Limitations of Builtins): Document it. * tests/m4sh.at (ECHO_C): New test. * THANKS: Update. Signed-off-by: Ralf Wildenhues --- ChangeLog | 11 +++++++++++ THANKS | 1 + doc/autoconf.texi | 5 ++++- lib/m4sugar/m4sh.m4 | 13 +++++++++---- tests/m4sh.at | 20 ++++++++++++++++++++ 5 files changed, 45 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5f89c1b2..8f0b5ae0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2009-06-30 Jan Madzik (tiny change) + Ralf Wildenhues + + Avoid AIX 6.1 ksh88 ECHO_C command substitution bug. + * lib/m4sugar/m4sh.m4 (_AS_ECHO_N_PREPARE): Ensure more than + one character is output with `\c'; reset echo output state + if buggy ksh was detected, and set ECHO_T instead of ECHO_C. + * doc/autoconf.texi (Limitations of Builtins): Document it. + * tests/m4sh.at (ECHO_C): New test. + * THANKS: Update. + 2009-06-27 William Pursell (tiny change) Fix grammaro in documenation. diff --git a/THANKS b/THANKS index eab63f2c..30f1b2d3 100644 --- a/THANKS +++ b/THANKS @@ -160,6 +160,7 @@ Iohannes m zmoelnig zmoelnig@iem.at J C Fitzgerald v7022@wave.co.nz Jaap Haitsma jaap@haitsma.org James A. Lupo lupoja@feynman.ml.wpafb.af.mil +Jan Madzik jmadzik@gmail.com Jason Molenda jsm@cygnus.com Jeff Garzik jgarzik@pobox.com Jeff Painter ? diff --git a/doc/autoconf.texi b/doc/autoconf.texi index 455d1c41..5908bbb5 100644 --- a/doc/autoconf.texi +++ b/doc/autoconf.texi @@ -15733,7 +15733,10 @@ their handling. For @samp{echo '\n' | wc -l}, the @command{sh} of Solaris outputs 2, but Bash and Zsh (in @command{sh} emulation mode) output 1. The problem is truly @command{echo}: all the shells understand @samp{'\n'} as the string composed of a backslash and an -@samp{n}. +@samp{n}. Within a command substitution, @samp{echo 'string\c'} will +mess up the internal state of ksh88 on AIX 6.1 so that it will print +the first character @samp{s} only, followed by a newline, and then +entirely drop the output of the next echo in a command substitution. Because of these problems, do not pass a string containing arbitrary characters to @command{echo}. For example, @samp{echo "$foo"} is safe diff --git a/lib/m4sugar/m4sh.m4 b/lib/m4sugar/m4sh.m4 index c7b0bffc..b2cabd79 100644 --- a/lib/m4sugar/m4sh.m4 +++ b/lib/m4sugar/m4sh.m4 @@ -780,14 +780,19 @@ m4_defun_init([_AS_ECHO_LOG], # display the checking message. In addition, caching something used once # has little interest. # Idea borrowed from dist 3.0. Use `*c*,', not `*c,' because if `\c' -# failed there is also a newline to match. +# failed there is also a newline to match. Use `xy' because `\c' echoed +# in a command substitution prints only the first character of the output +# with ksh version M-11/16/88f on AIX 6.1; it needs to be reset by another +# backquoted echo. m4_defun([_AS_ECHO_N_PREPARE], [ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in @%:@(((( +case `echo -n x` in @%:@((((( -n*) - case `echo 'x\c'` in + case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. - *) ECHO_C='\c';; + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; esac;; *) ECHO_N='-n';; diff --git a/tests/m4sh.at b/tests/m4sh.at index 065a9dda..f936a7cd 100644 --- a/tests/m4sh.at +++ b/tests/m4sh.at @@ -1412,3 +1412,23 @@ AT_CHECK_M4SH AT_CHECK([./script]) AT_CLEANUP + + +## -------- ## +## ECHO_C. ## +## -------- ## + +AT_SETUP([ECHO_C]) + +AT_DATA_M4SH([script.as], [[dnl +AS_INIT +_AS_PREPARE +foo=`echo foobar` +echo "$foo" +]]) + +AT_CHECK_M4SH +AT_CHECK([./script], [], [foobar +]) + +AT_CLEANUP