Add an f_eval_catch() function for debugging individual commands in a
series of commands. Accepts the `-d' flag as a first argument to skip displaying messages in a dialog box. The command is logged as it appears to the shell prior to the first pass of parameter expansion to allow copy/pasting into a real shell (opposed to simply echo'ing the command which would produce debug output that has undergone at least one pass of parameter expansion, thus no-longer copacetic for copy/paste). Takes printf(1) style syntax and a utility identifier for error messages.
This commit is contained in:
parent
209f30e060
commit
ddc2ccec80
@ -777,6 +777,88 @@ f_mounted()
|
||||
mount | grep -Eq " on $dir \([^)]+\)$"
|
||||
}
|
||||
|
||||
# f_eval_catch [-d] $funcname $utility $format [$arguments ...]
|
||||
#
|
||||
# Silently evaluate a command in a sub-shell and test for error. If debugging
|
||||
# is enabled a copy of the command and its output is sent to debug (either
|
||||
# stdout or file depending on environment). If an error occurs, output of the
|
||||
# command is displayed in a dialog(1) msgbox using the [above] f_show_err()
|
||||
# function (unless optional `-d' flag is the first argument, then no dialog).
|
||||
# The $funcname argument is sent to debugging while the $utility argument is
|
||||
# used in the title of the dialog box. The command that is sent to debugging
|
||||
# along with $funcname is the product of the printf(1) syntax produced by
|
||||
# $format with optional $arguments.
|
||||
#
|
||||
# Example 1:
|
||||
#
|
||||
# debug=1
|
||||
# f_eval_catch myfunc cat 'contents=$( cat "%s" )' /some/file
|
||||
# # Error displayed ``cat: /some/file: No such file or directory''
|
||||
#
|
||||
# Produces the following debug output:
|
||||
#
|
||||
# DEBUG: myfunc: cat "/some/file"
|
||||
# DEBUG: myfunc: retval=1 <output below>
|
||||
# cat: /some/file: No such file or directory
|
||||
#
|
||||
# Example 2:
|
||||
#
|
||||
# debug=1
|
||||
# f_eval_catch myfunc echo 'echo "%s"' "Hello, World!"
|
||||
# # No error displayed
|
||||
#
|
||||
# Produces the following debug output:
|
||||
#
|
||||
# DEBUG: myfunc: echo "Hello, World!"
|
||||
# DEBUG: myfunc: retval=0 <output below>
|
||||
# Hello, World!
|
||||
#
|
||||
# Example 3:
|
||||
#
|
||||
# debug=1
|
||||
# echo 123 | f_eval_catch myfunc rev rev
|
||||
# # No error displayed
|
||||
#
|
||||
# Produces the following debug output:
|
||||
#
|
||||
# DEBUG: myfunc: rev
|
||||
# DEBUG: myfunc: retval=0 <output below>
|
||||
# 321
|
||||
#
|
||||
# Example 4:
|
||||
#
|
||||
# debug=1
|
||||
# f_eval_catch myfunc true true
|
||||
# # No error displayed
|
||||
#
|
||||
# Produces the following debug output:
|
||||
#
|
||||
# DEBUG: myfunc: true
|
||||
# DEBUG: myfunc: retval=0 <no output>
|
||||
#
|
||||
f_eval_catch()
|
||||
{
|
||||
local no_dialog=
|
||||
[ "$1" = "-d" ] && no_dialog=1 && shift 1
|
||||
local funcname="$1" utility="$2"; shift 2
|
||||
local cmd output retval
|
||||
cmd=$( printf -- "$@" )
|
||||
f_dprintf "%s: %s" "$funcname" "$cmd" # Log command *before* eval
|
||||
output=$( exec 2>&1; eval "$cmd" )
|
||||
retval=$?
|
||||
if [ "$output" ]; then
|
||||
f_dprintf "%s: retval=%i <output below>\n%s" "$funcname" \
|
||||
$retval "$output"
|
||||
else
|
||||
f_dprintf "%s: retval=%i <no output>" "$funcname" $retval
|
||||
fi
|
||||
! [ "$no_dialog" -o "$nonInteractive" -o $retval -eq $SUCCESS ] &&
|
||||
msg_error="${msg_error:-Error}${utility:+: $utility}" \
|
||||
f_show_err "%s" "$output"
|
||||
# NB: f_show_err will handle NULL output appropriately
|
||||
return $retval
|
||||
}
|
||||
|
||||
############################################################ MAIN
|
||||
|
||||
#
|
||||
|
Loading…
Reference in New Issue
Block a user