To make a script model simpler, we assume that the unavailability of a program at the time of its execution is a fatal error. So if we need to execute a program and the executable is not there, the script must be aborted on the spot.
Functions are provided to test the availability of a program, so we can try to locate an alternative or terminate the process under the script control. On a system where executables may vanish from one moment to another, no matter how we test a program’s existence, there’s always the possibility that the program is not “there” when we invoke it.
The vanishing of a program is a rare event: if it’s there when we look for it, probably it will be there also a few moments later when we invoke it. For this reason, MBFL proposes a set of functions with which we can declare the intention of a script to use a set of programs.
A command line option is predefined to let the user test the availability of all the declared programs before invoking the script; Predefined options.
Register PROGRAM as the name of a program required by the script; mbfl_program_find() is
used to locate the program on the system. Checking programs existence.
If PROGRAM is a file name with no directory part (examples: sed, grep) the
selected program is the full pathname of the file in one of the directories of PATH.
If PROGRAM is a relative pathname (examples: ../bin/sed, ./grep): the selected
program is the full pathname of the file normalised by this function with respect to the current
working directory (with a call to mbfl_file_normalise()).
If PROGRAM is an absolute pathname (examples: /bin/sed, /bin/grep): the selected program is the full pathname itself.
The return value is always zero.
Validate the existence of all the declared programs. The return value is 0 if all the
programs are found, 1 otherwise.
This function is invoked by mbfl_getopts_parse() when the --validate-programs option
is used on the command line.
It may be a good idea to invoke this function at the beginning of a script, just before starting to do stuff, example:
mbfl_program_validate_declared || exit_because_program_not_found
If verbose messages are enabled: a brief summary is echoed to stderr.
Print the pathname of the previously declared PROGRAM. Return zero if the program was found,
otherwise print an error message and return by invoking return_because_program_not_found().
function program_wrapper () {
mbfl_mandatory_parameter(PATHNAME, 1, argument)
shift
local PROGNAME FLAGS
PROGNAME=$(mbfl_program_found myprog) || exit_because_program_not_found
mbfl_option_verbose_program && FLAGS+=' --verbose'
mbfl_program_exec "$PROGNAME" $FLAGS "$@" '--' "$PATHNAME"
}
Remember that we cannot use:
local PROGNAME=$(mbfl_program_found 'myprog') || exit_because_program_not_found
because local has exit status zero even if mbfl_program_found() fails, so the error will
not be reported.
The function variant _var will store the result in _RV rather than printing it.
function program_wrapper () {
mbfl_mandatory_parameter(PATHNAME, 1, argument)
shift
mbfl_declare_varref(PROGNAME)
local FLAGS
mbfl_program_found_var mbfl_datavar(PROGNAME) myprog || exit_because_program_not_found
mbfl_option_verbose_program && FLAGS+=' --verbose'
mbfl_program_exec "$PROGNAME" $FLAGS "$@" '--' "$PATHNAME"
}
This document describes version 3.0.0-devel.9 of Marcos Bash Functions Library.