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
hurr durr