MacOS - Trigger Notification Center when long-running commands finishes



Aug 3rd 2016 in code explication

As a developer, I often run commands that take a while to finish:

  • git pull
  • composer install
  • npm install

Considering that I am not a very patient person, I get really bored waiting for these commands to finish, so during that time I usually switch to some other occupation such as:

  • Checking Twitter/Tech/Hacking websites,
  • Making & (sometimes) drinking coffee,
  • Playing T-Rex Runner - The hidden endless running game of Chrome.

15 minutes later, I finally come back to my terminal with a cold coffee and I discover that I forgot to cd in the correct folder. Repeat for another 15 minutes.

Isn't there a better way?

Work is hard. Distractions are plentiful. And time is short.
— Adam Hochschild, American author, journalist, and lecturer

Solution N°0 - The Junior Professor

Waiting by watching some Gifs right on the terminal with Gifi. One of my favourite solutions but not enough "cool" for some people.

Solution N°1 - The Middle-Earth Paradigm

Making all tools faster and developers more patient. That would work in a parallel universe where magic exists, maybe.

Solution N°2 - The Luminous Fish Effect

Use a short script that uses terminal-notifier & append it to each command such as

git pull | notify-me

That's pretty cool and do the job but ... I'm lazy and I don't want to append anything to my commands or predict if my command is a long-running command or not before even running it.

Solution N°3 - The Friendship Algorithm

What about trying another approach ? Instead of trying to detect long-running commands, we could simply send a notification when the CLI is not in the foreground. Mmmh, sounds good but is that possible ? With iTerm & OSX 10.9+, you can do this !!

1) Create a new command named notify:

touch /usr/local/bin/notify && chmod +x /usr/local/bin/notify
vim /usr/local/bin/notify

2) Copy and paste this system script inside:

3) Add a custom function named f_notifyme and expose it to iTerm using PS1

vim ~/.zshrc

4) Copy and paste the function

5) We did it ! Finally, reload the source file of your terminal source ~/.zshrc and enjoy !

We did it !