63

I am executing every now and then some python scripts which take quite long to execute.

I execute them like this: $ time python MyScript.py

How can I play a sound as soon as the execution of the script is done?

I use Ubuntu 10.10 (Gnome desktop).

3
  • Are you using bash or zsh? There are actually some ways of making this happen automatically, but they're quite involved and depend on which shell you are using.
    – Mikel
    Mar 4, 2011 at 23:06
  • $ echo $SHELL returns "/bin/bash" Mar 5, 2011 at 20:39
  • Same question: askubuntu.com/questions/277215/… Feb 28, 2020 at 1:24

7 Answers 7

58

Append any command that plays a sound; this could be as simple as

$ time mycommand; printf '\7'

or as complex as

$ time mycommand && paplay itworked.ogg || paplay bombed.ogg

(Commands assume pulseaudio is installed; substitute your sound player, which will depend on your desktop environment.)

6
  • 11
    +1 paplay is probably the best command to use to play a sound on a "modern" Linux system.
    – Mikel
    Mar 4, 2011 at 23:21
  • 6
    printf '\7' doesn't work for me, but this command worked as I wanted it time python MyScript.py -n 40 && paplay /usr/share/sounds/ubuntu/stereo/desktop-login.ogg || paplay /usr/share/sounds/ubuntu/stereo/phone-outgoing-busy.ogg Mar 5, 2011 at 20:43
  • printf '\7' works for me (paplay doesn't; (git shell)) but it's just a very small bip. Are there more codes that make other sounds? I tried \6, \8 but they are some characters. Sep 17, 2014 at 23:20
  • 2
    @laggingreflex No, \7 (BEL) is usually the only character that possibly triggers a sound (see the Wikipedia article Control character); note that it may not always make a sound, either.
    – musiphil
    Nov 20, 2014 at 18:31
  • 5
    @laggingreflex You probably don't need this any more but just for laughs ;) for i in {1..30}; do for j in {1..3}; do printf '\7'; sleep 0.12; done; sleep 0.4; done
    – cprn
    Aug 24, 2015 at 20:49
33

spd-say

sleep 2; spd-say 'get back to work'

Infinite loop with -w if you need extra motivation:

sleep 2; while true; do spd-say -w 'get back to work'; done

or if you prefer the carrot:

sleep 2; while true; do spd-say -t female1 -w "I'm done, come back to me, darling"; done

Pre-installed on 14.04 via package speech-dispatcher: http://releases.ubuntu.com/trusty/ubuntu-14.04.4-desktop-amd64.manifest for blind people I suppose?

Also add a popup

This combo is a life saver (b stands for beep):

b() ( spd-say 'done'; zenity --info --text "$(date);$(pwd)" & )

and then:

super-slow-command;b

If I'm somewhere in the room, I'll hear it and know that the long job is done.

Otherwise, I'll see the popup when I get back to my computer.

Related: https://stackoverflow.com/questions/7035/how-to-show-a-gui-message-box-from-a-bash-script-in-linux

2
  • To get the spd-say tool associated with speech-dispatcher, you may need to install a subpackage like speech-dispatcher-utils (Fedora 24).
    – dfarrell07
    Dec 13, 2016 at 18:27
  • 1
    Brilliant! I used to use beep but it became so complicated to configure, spd-say it's a super cool readily available alternative!
    – Antonio
    Feb 9, 2022 at 16:36
9

Just pick a sound on your hard drive, and put a command to play it right after the command you're waiting on; they'll happen sequentially:

$ time python MyScript.py; mplayer ~/ScriptDone.wav

(You can use any player, naturally). I have a script called alertdone that plays a tone and shows an libnotify alert when run; I use it for exactly this occasion:

$ time python MyScript.py; alertdone "Done timing"

It's really simple, so if you want to make your own you can base it on this (mine requires notify-more, mplayer, and ~/tones/alert_1.wav though):

#!/bin/bash
message=${1:-"Finished working"}
notify-more -t 10000 -i /usr/share/icons/gnome/32x32/actions/insert-object.png "Process Finished" "$message"
mplayer ~/tones/alert_1.wav
3
  • 2
    notify-more or notify-send could indeed be useful alternatives to playing a sound.
    – Mikel
    Mar 4, 2011 at 23:19
  • @Mikel I'm completely addicted to libnotify; everything on my system pops up notifications Mar 4, 2011 at 23:31
  • Arch Linux has a list of “any player”: Multimedia#Audio players. My favorite is mpv. Jun 26 at 5:27
8
time python MyScript.py; play /path/so/sound.ogg

play is a very basic (no UI) sound player from the sox Install sox http://bit.ly/software-small package. You can replace it by any other command-line-driven sound player.

2
  • Yep, play, aplay, or paplay. (My Ubuntu system has aplay and paplay by default.)
    – Mikel
    Mar 4, 2011 at 23:20
  • 1
    time python MyScript.py -n 40; paplay /usr/share/sounds/ubuntu/stereo/desktop-login.ogg worked, thanks. Mar 5, 2011 at 20:46
6

Personally, I use my-script && notify-send "done". This sends a desktop notification, which on Linux Mint(Cinnamon) looks like this:

enter image description here

3

You can also make this happen automatically.

I will show you how in zsh, then add info about bash.

The essence looks like this:

preexec()
{
    starttime=$SECONDS
}

precmd()
{
    if ((SECONDS - starttime >= 5)); then
        aplay "sound.wav"
        # or printf "\b", or notify-send, or whatever
    fi
}

You can also make it only do it if the program was Python, e.g.

preexec()
{
    starttime=$SECONDS
    case $3 in python*)
        command_is_python=true;;
    *)
        command_is_python=false;;
    esac
}

precmd()
{
    if $command_is_python && ((SECONDS - starttime >= 5)); then
        aplay "sound.wav"
        # or printf "\b", or notify-send, or whatever
    fi
}

In bash, the best way is to download preexec.bash.txt and source it (e.g. . ~/preexec.bash.txt at the top of your ~/.bashrc, then the above (or something close to it) should work. (Not sure about the $3 bit to check if the command is Python.)

If you're using GNOME Terminal, I would also point you to Flashing GNOME Terminal. It's a patch I wrote that makes the terminal blink when a command is done, so you can Alt-Tab to something else, then it lets you know when it's done.

1

You don't need to add a command to everything, you can actually use a script, that does this automatically for you. It is called undistract-me and it is available on Github.

example

sudo apt install undistract-me    #installs the script (on Debian)
echo 'source /etc/profile.d/undistract-me.sh' >> ~/.bashrc #adds auto-enable to your console
echo 'export LONG_RUNNING_COMMAND_TIMEOUT=XXX' >> ~/.bashrc #where XXX is number of seconds when the command is long enough to alert you
echo 'export UDM_PLAY_SOUND=1' >> ~/.bashrc #to enable sound alert

now start new bash and you are set. Sound and alert can be changed by modifying the script.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .