trigger an audible notification when a command in unix completes, using the bash exit code

first a few methods which might or might not work:

[code language=”bash”]your_command_here; beep[/code]
which doesn’t work on all systems

[code language=”bash”]your_command_here; tput bel[/code]
which doesn’t work from inside an attached screen

[code language=”bash”]your_command_here; spd-say "command completed"[/code]
which simply sounds awful

there is a possibility to make a notification with speaker-test.
a simple shell script could look like this:
[code language=”bash”]
#!/bin/sh
( speaker-test -t sine -f 440 )& pid=$!
sleep 0.4s
kill -9 $pid[/code]
but it’s somewhat unreliable.

i decided to buy a voice pack and write my own function.
this sci-fi computer voice pack from the envato marketplace sounds great

i stored all the sound files in /usr/local/scifi-computer-voice-pack-2/

content of the actual functions file /usr/local/functions.sh:
[code language=”bash”]
#created by ned 01.2017
#its purpose is to audibly notify the user about the exit code of the last executed command.

#it is sourced in /etc/bash.bashrc

#aplay condition and soundfile link script
#sound files in
#/usr/local/scifi-computer-voice-pack-2/

talk(){

retval=$?

if [ $retval -eq 0 ]; then
#echo "affirmative"
tell=0
else
#echo "negative"
tell=1
fi

if [ $# -eq 1 ]; then
if [ "$1" = "0" ]; then
#echo "affirmative"
tell=0
fi
if [ "$1" = "1" ]; then
#echo "negative"
tell=1
fi
fi
if [ $# -eq 2 ]; then
if [ "$2" = "0" ]; then
#echo ok
tell=0
fi
if [ "$2" = "1" ]; then
#echo nok
tell=1
fi
fi

#echo "$retval"

case "$1" in
"-h"|"–help")
printf "talk uses sound files stored in \n\t/usr/local/scifi-computer-voice-pack-2/\n\n"
printf "usage: talk <argument1> <argument2>\n"
printf "valid <argument1>:\n"
printf — "-h|–help\t\tprints this help message\n"
printf — "–boot\t\t\t(quiet) boot message\n-p|–processing\t\tprocessing..\n-y|–yellow\t\tyellow alert\n"
printf "<no argument1>\t\tuses <exit code>\n"
printf — "-t|–transfer\t\tuses <exit code> and transfer*.wav\n"
printf — "-a|–access\t\tuses <exit code> and access*.wav\n"
printf "\na second <argument2> can be passed to\n<no argument1>\n-t|–transfer\n-a|–access\n"
printf "valid <argument2>:\n0 or 1\t\t\tforce response\n"
printf "\nexamples:\ntalk\t\t\tresponds using <exit code>\ntalk -a 1\t\tresponds negatively\nrsync *; talk -t\tuses rsync exit code\n"

;;
"–fail")
return 1
;;
"–boot")
#boot
aplay -q /usr/local/scifi-computer-voice-pack-2/self\ destruct\ initiated.wav
;;
"-a"|"–access")
if [ $tell -eq 0 ]; then
echo "access granted"
aplay -q /usr/local/scifi-computer-voice-pack-2/access\ granted.wav
else
echo "access denied"
aplay -q /usr/local/scifi-computer-voice-pack-2/access\ denied.wav
return 1
fi
;;
"-p"|"–processing")
echo "processing.."
aplay -q /usr/local/scifi-computer-voice-pack-2/processing.wav
;;
"-t"|"–transfer")
if [ $tell -eq 0 ]; then
echo "transfer complete"
aplay -q /usr/local/scifi-computer-voice-pack-2/transfer\ complete.wav
else
echo "transfer incomplete"
aplay -q /usr/local/scifi-computer-voice-pack-2/transfer\ incomplete.wav
return 1
fi
;;
"-y"|"–yellow")
#echo "yellow alert!"
aplay -q /usr/local/scifi-computer-voice-pack-2/yellow\ alert.wav
;;
""|"0"|"1")
#general purpose
if [ $tell -eq 0 ]; then
echo "affirmative"
aplay -q /usr/local/scifi-computer-voice-pack-2/affirmative.wav
else
echo "negative"
aplay -q /usr/local/scifi-computer-voice-pack-2/negative.wav
return 1
fi
;;
*)
echo "invalid arguments"
echo "see ‘talk –help’"
aplay -q /usr/local/scifi-computer-voice-pack-2/rephrase\ your\ query.wav
return 1
;;
esac
return 0
}
[/code]

sourcing /usr/local/functions.sh in /etc/bash.bashrc:
[code language=”bash”]
#manually added functions added by ned. check for functions.sh file and source it
if [ -f /usr/local/functions.sh ]; then
. /usr/local/functions.sh
fi[/code]

a logout & login are required for the changes to take effect when changing a bashrc file or a shell function.

commands in bash terminate with an exit code, stored in variable $?
my function notifies depending on the exit code of the last run command.

examples:
[code language=”bash”]my_command_here; talk[/code]
this will either say “affirmative” or “negative” depending on the exit code of “my_command_here”.

[code language=”bash”]scp *; talk -t[/code]
if the scp command fails, talk -t will say “transfer incomplete”, or “transfer complete” if it succeeds.

[code language=”bash”]my_command_here; talk -a[/code]
will say “access granted” or “access denied”

some other arguments, which do not consider the bash exit code are also available:
[code language=”bash”]talk -p; my_command_here[/code]
talk will say “processing..” and then execute “my_command_here”.

more information can be found with:
[code language=”bash”]talk –help[/code]

the bash exit code can’t be accessed with shell scripts or bash commands, because they run in an isolated environment. that’s why a shell function is necessary.

more information on command notifications:
askubuntu
superuser

Posted in IT

One Reply to “trigger an audible notification when a command in unix completes, using the bash exit code”

Comments are closed.