Make a Beep Sound When Console Outputs Certain Text
Updated: May 3, 2021
Originally this was a question posed on the hugo discussion forums.
When running hugo server
, the user wanted to be notified with a beep of any error messages that were output by the console.
This isn’t a use case for me personally but I thought it was a fun problem to solve.
My original solution for Mac:
hugo server 2>&1 | tee /dev/tty | while read line ; do echo $line | say --rate=500 ; done
Explained:
hugo server 2>&1
– Redirect stderr
to stdout
, then pipe stdout
tee /dev/tty
– Pipe stdout
while still showing it in the console
while read line ; do echo $line
– Echo each line, then pipe it
say --rate=500
– Use the Mac say
command to read from stdin
at a rate of 500 words per minute
The user then mentioned he was on Windows, so I tweaked it and gave him additional instructions:
hugo server 2>&1 | tee /dev/tty | while read line ; do echo $line | if [[ $line = *"ERROR"* ]] ; then voice.exe --rate=10 ; fi ; done
Explained:
if [[ $line = *"ERROR"* ]] ; then voice.exe --rate=10 ; fi
– This time, only speak the line if it contains the text ERROR
. And since it’s Windows, use voice.exe
at its fasted rate of speech, 10
Finally, after more research, I came up with this solution to address the original question:
hugo server 2>&1 | tee /dev/tty | while read line ; do echo $line | if [[ $line = *"ERROR"* ]] ; then rundll32 user32.dll,MessageBeep ; fi ; done
Explained:
rundll32 user32.dll,MessageBeep
– Instead of speaking the line, actually make a “beep” sound by using the Windows MessageBeep function
See Windows Rundll and Rundll32 interface for more info.