How can we play sound alarm after command is done on Mac terminal?

sleep 30m; for i in {1..10}; do afplay /System/Library/Sounds/Purr.aiff -v 10; done

OP asked for an alarm. This code repeats the sound Purr.aiff 10 times at maximum volume to ensure you can hear it (like an alarm clock). Replace sleep30m with your desired command. If you want it longer, replace 10 in the for loop with 10000.

If you want an infinite alarm (press CTRL-C to exit), try:

sleep 30m; while :; do afplay /System/Library/Sounds/Purr.aiff -v 10; done

If you want other sounds, you may try replacing Purr.aiff with:

  • Basso.aiff
  • List item
  • Frog.aiff
  • Hero.aiff
  • Pop.aiff
  • Submarine.aiff
  • Blow.aiff
  • Funk.aiff
  • Morse.aiff
  • Tink.aiff
  • Bottle.aiff
  • Glass.aiff
  • Ping.aiff
  • Sosumi.aiff

Purr.aiff and Blow.aiff are my personal favorites.


I think you need

brew upgrade && afplay /System/Library/Sounds/Submarine.aiff -v 10

then the afplay will run if the brew completes successfully.

As a note of explanation, you are asking the shell to determine if both statements ("brew" and "afplay") are true - it is therefore obliged to evaluate the "brew" statement fully (i.e. wait for it to finish) before executing the "afplay" in order to determine whether both statements are true.


Thanks Mark. You gave me a great idea.

I haven't noticed &&, || can mean logical operators on shell also. It appears '&& afplay ..' works only when 'brew upgrade' returns 0 which happens most of the time, and '|| afplay ..' works only when 'brew upgrade' returns 1 (or any non-zero) meaning error. I decided to use semicolon ';' so afplay can play sound alarm whatever 'brew upgrade' reterns after job done.

brew upgrade ; afplay /System/Library/Sounds/Submarine.aiff -v 10

EDIT: Now I use the following code in .profile (or .bashrc), which utilizes the advanced notifier tool, terminal-notifier.

function brew { caffeinate -s brew $@; terminal-notifier -title 'Homebrew' -subtitle 'Finished' -message brew' '$1' '$2' '$3 -sound 'recv_mail' -contentImage '/Download/Any/Icon/beer_icon.png';}

Please note:

  1. There must be a whitespace after the left brace '{' for bash syntax.
  2. caffeinate is used to prevent Mac from falling into sleep mode while brew works for a long time. If you remove 'caffeinate -s', you should rename the function name also.
  3. You can install terminal-notifier with brew. -contentImage is optoinal of course.

brew upgrade && say brew upgrade done

leverage the say command and get a custom voice notification

general example:

YOUR_COMMAND && say YOUR_COMMAND done