From a02ec12def5c41c49a325312e050a9969c2b3e93 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sat, 23 Jun 2007 11:20:11 +0000 Subject: [PATCH] Make use of ksh's 'print' built-in. --- ChangeLog | 5 +++++ gnulib-tool | 24 ++++++++++++++++++++++-- tests/test-echo.sh | 22 +++++++++++++++++++++- 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index b869adcdd3..8055b38a89 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2007-06-23 Bruno Haible + + * gnulib-tool (echo): Add a speedier workaround for ksh. + * tests/test-echo.sh: Likewise. + 2007-06-23 Bruno Haible * gnulib-tool (echo): Add workarounds also for bash versions < 2.04. diff --git a/gnulib-tool b/gnulib-tool index ba865ee03a..8823abd197 100755 --- a/gnulib-tool +++ b/gnulib-tool @@ -22,7 +22,7 @@ progname=$0 package=gnulib -cvsdatestamp='$Date: 2007-06-23 10:14:04 $' +cvsdatestamp='$Date: 2007-06-23 11:20:11 $' last_checkin_date=`echo "$cvsdatestamp" | sed -e 's,^\$[D]ate: ,,'` version=`echo "$last_checkin_date" | sed -e 's/ .*$//' -e 's,/,-,g'` nl=' @@ -431,8 +431,10 @@ func_ln_if_changed () # - for bash >= 2.0: define echo to a function that uses the printf built-in. # - for bash < 2.0: define echo to a function that uses cat of a here document. # - for zsh: turn sh-emulation on. +# - for ksh: alias echo to 'print -r'. # - for ksh: alias echo to a function that uses cat of a here document. -# - for Solaris /bin/sh: respawn using /bin/ksh and rely on the ksh workaround. +# - for Solaris /bin/sh and OSF/1 /bin/sh: respawn using /bin/ksh and rely on +# the ksh workaround. # - otherwise: respawn using /bin/sh and rely on the workarounds. # When respawning, we pass --no-reexec as first argument, so as to avoid # turning this script into a fork bomb in unlucky situations. @@ -487,6 +489,24 @@ if test -z "$have_echo" \ && (emulate sh) >/dev/null 2>&1; then emulate sh fi +# For ksh: alias echo to 'print -r'. +if test -z "$have_echo" \ + && (type print) >/dev/null 2>&1; then + # A 'print' command exists. + if type print 2>/dev/null | grep / > /dev/null; then + : + else + # 'print' is a shell built-in. + if (print -r '\told' | grep told > /dev/null) 2>/dev/null; then + # 'print' is the ksh shell built-in. + alias echo='print -r' + fi + fi +fi +if test -z "$have_echo" \ + && echo '\t' | grep t > /dev/null; then + have_echo=yes +fi # For ksh: alias echo to a function that uses cat of a here document. # The ksh manual page says: # "Aliasing is performed when scripts are read, not while they are executed. diff --git a/tests/test-echo.sh b/tests/test-echo.sh index b1e40472f5..f4c62d14e7 100755 --- a/tests/test-echo.sh +++ b/tests/test-echo.sh @@ -36,8 +36,10 @@ func_fatal_error () # - for bash >= 2.0: define echo to a function that uses the printf built-in. # - for bash < 2.0: define echo to a function that uses cat of a here document. # - for zsh: turn sh-emulation on. +# - for ksh: alias echo to 'print -r'. # - for ksh: alias echo to a function that uses cat of a here document. -# - for Solaris /bin/sh: respawn using /bin/ksh and rely on the ksh workaround. +# - for Solaris /bin/sh and OSF/1 /bin/sh: respawn using /bin/ksh and rely on +# the ksh workaround. # - otherwise: respawn using /bin/sh and rely on the workarounds. # When respawning, we pass --no-reexec as first argument, so as to avoid # turning this script into a fork bomb in unlucky situations. @@ -92,6 +94,24 @@ if test -z "$have_echo" \ && (emulate sh) >/dev/null 2>&1; then emulate sh fi +# For ksh: alias echo to 'print -r'. +if test -z "$have_echo" \ + && (type print) >/dev/null 2>&1; then + # A 'print' command exists. + if type print 2>/dev/null | grep / > /dev/null; then + : + else + # 'print' is a shell built-in. + if (print -r '\told' | grep told > /dev/null) 2>/dev/null; then + # 'print' is the ksh shell built-in. + alias echo='print -r' + fi + fi +fi +if test -z "$have_echo" \ + && echo '\t' | grep t > /dev/null; then + have_echo=yes +fi # For ksh: alias echo to a function that uses cat of a here document. # The ksh manual page says: # "Aliasing is performed when scripts are read, not while they are executed. -- 2.30.2