tests: avoid extra forks in the testsuite
authorStefano Lattarini <stefano.lattarini@gmail.com>
Sat, 18 Jun 2011 15:57:53 +0000 (17:57 +0200)
committerJim Meyering <meyering@redhat.com>
Sun, 19 Jun 2011 19:57:43 +0000 (21:57 +0200)
* tests/shell-or-perl: Prefer the `read' builtin over `grep' to
look at the shebang line of test scripts.  Since `read' is a
special builtin, it might abort the whole program upon failures,
so add extra sanity checks, verifying that the test script exists
and is readable, before trying to read from it.

tests/shell-or-perl

index 08604eb..accb37a 100644 (file)
@@ -84,12 +84,19 @@ test -z "$test_name" && test_name=$test_script
 #  Run the test script  #
 # --------------------- #
 
-if grep '^#!/usr/bin/perl' "$test_script" >/dev/null; then
+test -f "$test_script" && test -r "$test_script" \
+  || error_ "test script '$test_script' does not exist, or isn't readable"
+
+read shebang_line < "$test_script" \
+  || error_ "cannot read from the test script '$test_script'"
+
+case $shebang_line in
+'#!/usr/bin/perl'*)
   # The test is a perl script.
   if $cu_PERL -e 'use warnings' > /dev/null 2>&1; then
     # Perl is available, see if we must run the test with taint
     # mode on or not.
-    grep '^#!/usr/bin/perl -T' "$test_script" >/dev/null && T_=T || T_=
+    case $shebang_line in *\ -T*) T_=T;; *) T_=;; esac
     # Now run it.
     exec $cu_PERL -w$T_ -I"$srcdir" -MCoreutils -MCuSkip \
                   -M"CuTmpdir qw($test_name)" \
@@ -99,10 +106,11 @@ if grep '^#!/usr/bin/perl' "$test_script" >/dev/null; then
     echo "$test_name: skip: no usable version of Perl found"
     exit 77
   fi
-else
+  ;;
+*)
   # Assume the test is a shell script.
   exec $cu_SHELL "$test_script" ${1+"$@"}
-fi
+esac
 
 # ------------- #
 #  Not reached  #