From: Bruno Haible Date: Sat, 23 Jun 2007 11:20:11 +0000 (+0000) Subject: Make use of ksh's 'print' built-in. X-Git-Tag: cvs-readonly~210 X-Git-Url: http://erislabs.org.uk/gitweb/?a=commitdiff_plain;h=a02ec12def5c41c49a325312e050a9969c2b3e93;p=gnulib.git Make use of ksh's 'print' built-in. --- diff --git a/ChangeLog b/ChangeLog index b869adcdd..8055b38a8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 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. * tests/test-echo.sh: Likewise. diff --git a/gnulib-tool b/gnulib-tool index ba865ee03..8823abd19 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 b1e40472f..f4c62d14e 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.