I\'m trying to write a script notify-finish
that can be prepended to any command. When done, it will run the command given by the arguments following, then emai
Put double-quotes around your variable substitutions to keep them from being parsed (note that this applies to all variables: $@
, $1
, and $PROG
). Also: don't put a $ before a variable name when assigning to it; use #
for comments; and, on the last line, the single-quotes will prevent variables from being substituted at all.
PROG="$1"
shift
# Run program below
"$PROG" "$@"
ECODE=$? # note: this will always be a number, so it doesn't have to be protected with double-quotes
echo -e "Subject: $(hostname): $PROG finished\r\nTo: <$USER>\r\n\r\nExited with $ECODE\r\n' | sendmail "$USER"
Use "$@"
with quotes:
prog="$1"
"$@"
ecode="$?"
echo "$prog exited with $ecode"
This will pass each argument exactly as it was received. If you don't include the quotes, each element will be split according to $IFS
:
"$@"
is like "$1" "$2" "$3" ...
, passing each element as a separate argument. "$*"
is like "$1 $2 $3 ..."
, passing all elements concatenated as a single argument$*
and $@
is like $1 $2 $3 ...
, breaking up each element on whitespace, expanding all globs, and passing each resulting word as a separate element ($IFS
). The same is true for arrays, such as "${array[@]}"
and "${array[*]}"