How do you make your terminal play a sound or offer a notification when it has finished executing its command? [duplicate]
I do sudo apt-get update
from time to time, and find it frustrating to have to check when it is done doing its thing. Is there anyway I can get it to offer a notification popup or play a sound when it has finished executing, so I can get on with my work?
Sound I can't help you with. However, if you append something like
&& notify-send "Task complete."
after your command, you should see a notification pop up in the upper right corner. If the required package is not installed by default, sudo apt-get install libnotify-bin
should get it for you. The &&
will execute a second command if the first completes successfully.
What you want is sudo apt-get update; alert
. What follows is explanation and rationale.
- From the terminal, you can list many commands to be run in sequence. So what you want is first the command which takes a long time, and second a notification command.
- To run commands in sequence, you separate them with either
&&
or;
. These have two distinct meanings:command-a && command-b
means that command-a will run first, and then, if it was successful, command-b will run;command-a; command-b
means that command-a will run first and then command-b will run, whether or not command-a was successful. You probably want the semi-colon: you want to be notified when the update or upgrade has stopped running, whether or not it has exited successfully. - Other answerers have given you suggested audio and on-screen alerts. My own preference is for
notify-send
, which takes two parameters: a title and content:sudo apt-get update; notify-send update finished
(if either parameter contains spaces, enclose them in quotation marks). -
Much quicker and easier to type than
notify-send title content
isalert
. This alias is built into bash by default in at least some versions of Ubuntu, and is easy enough to add if it’s missing from yours (usetype alert
to check whether it’s present). You should get the response,alert is aliased to `notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e 's/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//')"'
This means that it will simply pull out the last command and send it to
notify-send
, and that the accompanying icon will be an image of a terminal (for a successful command) or an error image (for a failed command).Life has now become even simpler:
command; alert
is very quick and easy to type. It will alert whether or not the command was successful, and the alert will contain an indication of whether or not the command was successful.
Incidentally, it has occasionally annoyed me that I am unable to pipe output to notify-send
, so I wrote a little function to do it for me:
notify ()
{
while read input; do
notify-send -i $(ls /usr/share/icons/gnome/32x32/emotes | sed 's/\(.*\)\..*/\1/' | shuf -n1) "message" "$input";
done
}
This allows me to type command | notify
. The icon in this case is random, however. Also, you get a notification for each line of output, which is probably not a good choice for apt-get update
.
For aplay compatible files
To play a custom sound through the speakers, you can run
aplay <path_to_sound_file>
*<path_to_sound_file> = path to the sound file
to play the chosen sound file; then you can add a playsound
alias to ~/.bashrc
:
alias playsound='aplay <path_to_sound_file>'
*<path_to_sound_file> = path to the sound file
This way you can run sudo apt-get update && playsound
to play the chosen sound when sudo apt-get update
has finished running.
For non aplay compatible files (e.g. .ogg files) (system sounds)
To play a custom sound through the speakers, you can run
pacmd list-sinks | grep -E 'index|device.product.name'
to list all pulseaudio
's available sinks' indexes along with their corresponding device; then you can run
pacmd play-file /usr/share/sounds/ubuntu/stereo/bell.ogg <sink_index> > /dev/null
*<sink_index> = pulseaudio
's sink's index
to play /usr/share/sounds/ubuntu/stereo/bell.ogg
through the chosen sink. (Of course you can play any sound you want); then you can add a playsound
alias to ~/.bashrc
:
alias playsound='pacmd play-file /usr/share/sounds/ubuntu/stereo/bell.ogg <sink_index> > /dev/null'
*<sink_index> = pulseaudio
's sink's index
This way you can run sudo apt-get update && playsound
to play the chosen sound when sudo apt-get update
has finished running.
I wrote a little scripts to make it. Script is located in github.
Here is installation guide:
Installation
Download or just clone repo
$ git clone [email protected]:c0rp-aubakirov/notify_after_command_executed.git
Then add sourcing of script postexec_notify
to your .bashrc
.
Here is git clone
example of installation:
$ cd ~
$ git clone [email protected]:c0rp-aubakirov/notify_after_command_executed.git
$ cd ~/notify_after_command_executed
$ echo "source $(pwd)/postexec_notify" >> ~/.bashrc
Now restart your terminal. After restart you should see this messages:
preexec.sh is not exist
Trying to download it from github
Now try to test if notification appear:
$ sleep 6
Please let me know if something is unclear or you have any issues.