From: Richard Hansen <rhan...@bbn.com>

  * add pecho(), a portable version of echo
  * use pecho() instead of echo for logging functions
  * add try() to make it easier to catch errors
  * have usage_fatal() send usage() output to stderr
---
 lib/util/shell_utils | 74 +++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 56 insertions(+), 18 deletions(-)

diff --git a/lib/util/shell_utils b/lib/util/shell_utils
index 8254a96..54a2f66 100644
--- a/lib/util/shell_utils
+++ b/lib/util/shell_utils
@@ -1,25 +1,63 @@
 # Utility functions for shell scripts
 
-warn () {
-    echo "WARNING:" "$@" >&2
-}
-
-error () {
-    echo "ERROR:" "$@" >&2
-}
-
-fatal () {
-    error "$@"
-    exit 1
-}
+# 'pecho': portable echo.  POSIX says echo might interpret backslashes
+# and a first argument that begins with '-', but printf is consistent.
+# This function assumes that IFS is either unset or the first
+# character of IFS is a space.
+pecho() { printf %s\\n "$*"; }
+
+log() { pecho "$@"; }
+warn() { log "WARNING: $@" >&2; }
+error() { log "ERROR: $@" >&2; }
+fatal() { error "$@"; exit 1; }
+
+# 'try': function to make it easier to catch errors
+#
+# 'set -e' is not clearly specified by POSIX, and different shells do
+# very different things.  Thus, it's not very useful for catching
+# errors.  'try' is intended to be easy to use; usually you can just
+# put it in front of a command, e.g.:
+#
+#     try some_command --arg
+#
+# and it will cause the script to exit non-zero if the command fails.
+#
+# Caveats:
+#
+#   * redirection errors aren't caught by 'try', so the following
+#     won't cause the script to exit:
+#
+#         try echo foo >/no/such/directory/file
+#
+#     you'll have to do this instead:
+#
+#         try echo foo >/no/such/directory/file || exit 1
+#
+#     or, to get an "ERROR: ..." message:
+#
+#         try eval 'try echo foo >/no/such/directory/file'
+#
+#   * the error message doesn't quote special characters in the
+#     arguments, which can lead to misleading error messages:
+#
+#         $ try false "spaces and a single quote '"
+#         ERROR: 'false spaces and a single quote '' failed
+#
+#   * the 'exit 1' in fatal() and try() only causes a subshell to
+#     exit, so if you're running something in a subshell you'll need
+#     to add '|| exit 1' after the subshell.  For example:
+#
+#         val=$(try some_command --arg) || exit 1
+#
+#     note that POSIX allows the final stage in a pipeline to be in a
+#     subshell, so you'll need '|| exit 1' after pipelines too:
+#
+#         pecho foo | try some_command --arg || exit 1
+#
+try() { "$@" || fatal "'$@' failed"; }
 
 # depends on the script defining a usage function that prints a help message
-usage_fatal () {
-    error "$@"
-    echo >&2
-    usage
-    exit 1
-}
+usage_fatal() { error "$@"; pecho "" >&2; usage >&2; exit 1; }
 
 
 # Try to lock a mutex pathname.
-- 
1.9.1


------------------------------------------------------------------------------
_______________________________________________
rpstir-devel mailing list
rpstir-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rpstir-devel

Reply via email to