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 <Ralf.Wildenhues@gmx.de>
This commit is contained in:
Jan Madzik 2009-06-30 08:06:24 +02:00 committed by Ralf Wildenhues
parent 6c358e8f6a
commit 06aeca6abe
5 changed files with 45 additions and 5 deletions

View File

@ -1,3 +1,14 @@
2009-06-30 Jan Madzik <jmadzik@gmail.com> (tiny change)
Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
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 <bill.pursell@gmail.com> (tiny change)
Fix grammaro in documenation.

1
THANKS
View File

@ -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 ?

View File

@ -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

View File

@ -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';;

View File

@ -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