tests: use printf, not echo in init.sh's warn_ function
authorJim Meyering <meyering@redhat.com>
Mon, 19 Sep 2011 17:27:53 +0000 (19:27 +0200)
committerJim Meyering <meyering@redhat.com>
Mon, 19 Sep 2011 17:29:55 +0000 (19:29 +0200)
* tests/init.sh (warn_): Use printf, not echo.  The latter would
misbehave when given strings containing a backslash or starting
with e.g., -n.  James Youngman suggested setting IFS.

ChangeLog
tests/init.sh

index 32f3723..5271f66 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2011-09-19  Jim Meyering  <meyering@redhat.com>
+
+       tests: use printf, not echo in init.sh's warn_ function
+       * tests/init.sh (warn_): Use printf, not echo.  The latter would
+       misbehave when given strings containing a backslash or starting
+       with e.g., -n.  James Youngman suggested setting IFS.
+
 2011-09-19  Eric Blake  <eblake@redhat.com>
 
        futimens: enhance test
index e6f5f1c..373d9d4 100644 (file)
@@ -74,7 +74,20 @@ Exit () { set +e; (exit $1); exit $1; }
 # the reason for skip/failure to console, rather than to the .log files.
 : ${stderr_fileno_=2}
 
-warn_ () { echo "$@" 1>&$stderr_fileno_; }
+# Note that correct expansion of "$*" depends on IFS starting with ' '.
+# Always write the full diagnostic to stderr.
+# When stderr_fileno_ is not 2, also emit the first line of the
+# diagnostic to that file descriptor.
+warn_ ()
+{
+  # If IFS does not start with ' ', set it and emit the warning in a subshell.
+  case $IFS in
+    ' '*) printf '%s\n' "$*" >&2
+          test $stderr_fileno_ = 2 \
+            || { printf '%s\n' "$*" | sed 1q >&$stderr_fileno_ ; } ;;
+    *) (IFS=' '; warn_ "$@");;
+  esac
+}
 fail_ () { warn_ "$ME_: failed test: $@"; Exit 1; }
 skip_ () { warn_ "$ME_: skipped test: $@"; Exit 77; }
 fatal_ () { warn_ "$ME_: hard error: $@"; Exit 99; }