From: Jim Meyering Date: Sun, 16 May 2010 16:34:08 +0000 (+0200) Subject: init.sh: avoid unnecessary shell re-exec X-Git-Tag: v0.1~4143 X-Git-Url: http://erislabs.org.uk/gitweb/?a=commitdiff_plain;h=cfa7f85bf1b1b1dcb51b27dc615f85e62710c056;p=gnulib.git init.sh: avoid unnecessary shell re-exec * tests/init.sh: Improve the re-exec-required check to first test the current shell. If it passes the test, do not search for a shell that does pass, and do not re-exec. This test is particularly contorted to avoid triggering misbehavior in Solaris 10's /bin/sh whereby any use of $(...) evokes a syntax error and causes immediate shell exit with status 2. Bruno Haible reported that the re-exec made it impossible to single-step through any init.sh-using script. --- diff --git a/ChangeLog b/ChangeLog index c36599454..ea50e39e4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2010-05-16 Jim Meyering + + init.sh: avoid unnecessary shell re-exec + * tests/init.sh: Improve the re-exec-required check to first test the + current shell. If it passes the test, do not search for a shell that + does pass, and do not re-exec. This test is particularly contorted to + avoid triggering misbehavior in Solaris 10's /bin/sh whereby any use + of $(...) evokes a syntax error and causes immediate shell exit with + status 2. Bruno Haible reported that the re-exec made it impossible + to single-step through any init.sh-using script. + 2010-05-16 Bruno Haible Fix collision between gnulib's and libintl's printf replacements. diff --git a/tests/init.sh b/tests/init.sh index 05a983a45..2ad385f2f 100644 --- a/tests/init.sh +++ b/tests/init.sh @@ -63,33 +63,46 @@ # - hyphen-containing alias names # - we prefer to use ${var#...} substitution, rather than having # to work around lack of support for that feature. -# The following code attempts to find a shell with support for these features -# and re-exec's it. If not, it skips the current test. +# The following code attempts to find a shell with support for these features. +# If the current shell passes the test, we're done. Otherwise, test other +# shells until we find one that passes. If one is found, re-exec it. +# If no acceptable shell is found, skip the current test. +# +# Use "9" to indicate success (rather than 0), in case some shell acts +# like Solaris 10's /bin/sh but exits successfully instead of with status 2. gl_shell_test_script_=' test $(echo y) = y || exit 1 -test -z "$EXEEXT" && exit 0 +test -z "$EXEEXT" && exit 9 shopt -s expand_aliases alias a-b="echo zoo" v=abx test ${v%x} = ab \ && test ${v#a} = bx \ - && test $(a-b) = zoo + && test $(a-b) = zoo \ + && exit 9 ' if test "x$1" = "x--no-reexec"; then shift else - for re_shell_ in "${CONFIG_SHELL:-no_shell}" /bin/sh bash dash zsh pdksh fail - do - test "$re_shell_" = no_shell && continue - test "$re_shell_" = fail && skip_ failed to find an adequate shell - if "$re_shell_" -c "$gl_shell_test_script_" 2>/dev/null; then - exec "$re_shell_" "$0" --no-reexec "$@" - echo "$ME_: exec failed" 1>&2 - exit 127 - fi - done + # 'eval'ing the above code makes Solaris 10's /bin/sh exit with $? set to 2. + # It does not evaluate any of the code after the "unexpected" `('. Thus, + # we must run it in a subshell. + ( eval "$gl_shell_test_script_" ) > /dev/null 2>&1 + if test $? != 9; then + for re_shell_ in "${CONFIG_SHELL:-no_shell}" /bin/sh bash dash zsh pdksh fail + do + test "$re_shell_" = no_shell && continue + test "$re_shell_" = fail && skip_ failed to find an adequate shell + "$re_shell_" -c "$gl_shell_test_script_" 2>/dev/null + if test $? = 2; then + exec "$re_shell_" "$0" --no-reexec "$@" + echo "$ME_: exec failed" 1>&2 + exit 127 + fi + done + fi fi test -n "$EXEEXT" && shopt -s expand_aliases