93

I'd like to use a beep sound in a shell script. Unfortunately none of the methods I found via Google work for me.

I tried

echo -e '\a'

echo -ne '\007'

and the command beep after I installed it via apt.

What could be the reason?

14 Answers 14

100

First run sudo modprobe pcspkr and then beep should work.

The reason this doesn't is because by default Ubuntu no longer loads the hardware driver that produce beeps.

If this works for you then to enable the loading of pcspkr permanently edit the /etc/modprobe.d/blacklist.conf file (using gksudo gedit perhaps) and comment out line that says blacklist pcspkr so it looks like this:

# ugly and loud noise, getting on everyone's nerves; this should be done by a
# nice pulseaudio bing (Ubuntu: #77010)
# blacklist pcspkr
| improve this answer | |
  • 3
    If I comment blacklist pcspkr I have to do modprobe -r pcspkr && modprobe pcspkr to get it to work. Also getting beep to work is not the same as getting the audible bell to work and thus askubuntu.com/questions/22168/how-do-i-enable-the-terminal-bell should still be open. – daithib8 Jul 28 '11 at 11:37
  • 4
    This doesn't work for me in Ubuntu 14. – Cerin Apr 4 '16 at 23:41
  • This will mostly likely never work on modern laptops, as they don't have a speaker device. Instead see my answer below on how to use paplay. (I wasted a bunch of time chasing down this, only to get silence.) – Elliptical view Apr 22 at 1:08
102

Not being a fan of the pcspkr beep, I use a beep from one of the system sounds with the installed pulseaudio server's paplay command.

First find a sound you like (you can browse /usr/share/sounds for some available ones for example) and create a reference to it

export BEEP=/usr/share/sounds/ubuntu/ringtones/Harmonics.ogg

Then have it available as a command

alias beep='paplay $BEEP'

Now just run beep whenever you need it. For example, to alert you when a command is finished:

find . | grep treasure ; beep
| improve this answer | |
  • 2
    Can you get it to play this sound when someone runs echo -e '\a' – Flimm Dec 2 '14 at 23:22
  • You might need some read command in a while loop or some other library that can monitore keystrokes. – yuvilio Dec 11 '14 at 1:12
  • 5
    This is a great solution! Now I can do run-my-long-test-suite.sh; beep and read stackoverflow until the system is ready. – jamesc Mar 30 '15 at 10:17
  • 3
    Nice! I use export BEEP=/usr/share/sounds/ubuntu/stereo/dialog-information.ogg and alias beep='paplay $BEEP --volume=32768' now, that works well for me. (Note that you can override the volume with the beep alias, e.g. beep --volume=15000 plays at volume of -12dB.) – leftaroundabout Dec 6 '15 at 12:57
  • 5
    Playing these ogg files can result in latency orders of magnitude greater than that of the internal PC speaker beep. Not only that the latency seems highly variable. I acknowledge that most people don't care but when you need real time or near real time responsiveness the PC speaker is probably the best option for audible feedback. – H2ONaCl Feb 21 '18 at 19:59
26

Since this is a very high rated question on google, I'll add the steps I did to re-enable beep in both console and X11:


For the Linux Console (CTRL+ALT+F1...F6):

Why it does not work by default

As already answered, the pcspkr kernel driver for the PC Speaker is blacklisted in Ubuntu.

Temporarily enable until reboot:

sudo modprobe pcspkr

Automatically enable on boot:

sudo nano /etc/modprobe.d/blacklist.conf

(delete or comment pcspkr line by prepending it with #)


For X11 terminals (such as the default gnome-terminal)

Why it does not work by default

Under X, like when using Unity, KDE, Gnome Shell, the beep events are captured by PulseAudio thanks to module-x11-bell, which is loaded by default at /usr/bin/start-pulseaudio-x11. And the sound sample PulseAudio plays on beep, bell.ogg, is blank by default. Additionally, the bell volume may be muted.

To temporarily enable for current session,

xset b 100  # perhaps not needed, on my system it was 40 by default
pactl upload-sample /usr/share/sounds/ubuntu/stereo/bell.ogg bell.ogg

There are other suitable samples you can try at /usr/share/sounds, for example check the ones at /usr/share/sounds/gnome/default/alerts/

Note that the beep program is not really necessary. But if installed, it uses the PC Speaker. It was the only way I could find to enable the buzzer under X:

sudo apt-get install beep

To automatically enable on boot, just add the above lines in your ~/.profile, or system-wide at /etc/profile


To test it:

printf '\a'

Beep!

beep

Buzz!

| improve this answer | |
  • To automatically enable a pc speaker beep on boot you have to actually comment said line in /etc/modprobe.d/blacklist.conf not uncomment it (you want to disable blacklisting, not the other way around). – z33k Sep 16 '16 at 11:18
  • 1
    both solutions work on Ubuntu 16.04 Note: pcspkr and bell.ogg are independent approaches. beep tries to beep using various approaches e.g., ioctl(console_fd, KIOCSOUND, period) use pcspkr (the sound is coming from PC speaker on the motherboard) while printf '\a' -based method may work without it using only bell.ogg (the sound is from ordinary speakers). The second method might not work until pulseaudio service is started and/or xset b on is run – jfs Oct 13 '16 at 0:43
  • The pactl upload-sample ... was golden for me. What's the way to permanently configure the sample loading again? – ulidtko Nov 29 '16 at 22:15
  • @ulidtko: Just add those lines lines in your ~/.profile, or system-wide at /etc/profile – MestreLion Feb 6 '17 at 15:40
  • @MestreLion wrong. load-sample bell.ogg /usr/share/sounds/ubuntu/stereo/bell.ogg in /etc/pulseaudio/default.pa. – ulidtko Feb 7 '17 at 10:19
22

To fix this problem persistently:

  • Run gconf-editor and if the desktop | gnome | peripherals | keyboard | bell_mode setting is present then change it from off to on
  • Run dconf-editor and if the org | gnome | settings-daemon | peripherals | keyboard | bell-mode setting is present then change it from off to on
  • Add pactl upload-sample /usr/share/sounds/gnome/default/alerts/glass.ogg bell.ogg to the file ~/.xprofile (you need gnome-control-center-data for glass.ogg)
  • Add [ "$DISPLAY" ] && xset b 100 to the file ~/.bashrc

The simplest way to activate this solution is to reboot.

Further, to implement this solution immediately for a terminal window that is already open, run the pactl command and run the xset command in the terminal window in question.

| improve this answer | |
  • I put the pactl upload-sample command in a shell script, but your method is more organized. Thanks! – JoBu1324 Dec 12 '12 at 16:54
  • If you put the pactl command in ~/.xprofile it gets executed at the start of the GUI session. – jdthood Dec 12 '12 at 18:32
  • The dconf-editor version of the bell-mode setting seems to be org.gnome.settings-daemon.peripherals.keyboard. – lgarzo Jun 21 '13 at 8:59
  • @lgarzo: Thanks for the tip. I will update the answer. – jdthood Jun 21 '13 at 9:22
  • 1
    @Hibou57: Make sure you have the package containing glass.ogg installed – Janus Troelsen Nov 16 '14 at 13:44
17

I've encountered this problem before. From what I remember, the problem is that the terminal bell tries to ring an internal computer speaker (as in an old-school desktop) but laptops and some newer computers are missing such a thing.

The only solution I found at the time was to sudo apt-get install sox and

play -n synth <duration in seconds> sine <freq in Hz> vol <volume (0-1)>

e.g.

 play -n synth 0.1 sine 880 vol 0.5
| improve this answer | |
  • try my solution - I'd love to know if it works for you! – JoBu1324 Dec 11 '12 at 23:10
  • you may use speaker-test for this too – Janus Troelsen Jun 11 '14 at 9:05
  • 1
    You can also have a nice guitar pluck tone: play -q -n synth 2 pluck C5. C5 is the note. – Pablo Bianchi Jul 1 '18 at 5:40
3

I finally found a solution, which doesn't require alsamixer to have a PC Beep option. I think I remember all my changes:

uncomment the following in /etc/pulse/default.pa:

load-sample-lazy x11-bell /usr/share/sounds/ubuntu/stereo/bell.ogg
load-module module-x11-bell sample=bell-windowing-system

per this bug, run pactl upload-sample /usr/share/sounds/ubuntu/stereo/bell.ogg bell.ogg

| improve this answer | |
  • Tried this, pactl gave me Connection failure: Connection refused pa_context_connect() failed: Connection refused. – YodaDaCoda Dec 11 '12 at 23:33
  • Maybe this thread will help - if you've ever run pulseaudio as root. – JoBu1324 Dec 11 '12 at 23:49
  • I'm having a different problem, actually. Pulseaudio throws Failed to open module "module-esound-protocol-unix": file not found. Probably not worth discussing here since I'm running 13.04, though I would love to be able to verify your solution. – YodaDaCoda Dec 12 '12 at 0:05
  • Nice, just slightly different lines for 15.04. – VRR Sep 12 '15 at 11:09
3

"Beep can only work if your PC has a traditional old style "speaker", and probably most if not all laptops and small devices don't have one.

However what they often have instead is a sound chip and one or more speaker(s) that can be used to make any sound you want.

So the outdated advise to install the beep command and/or the kernel module pcspkr will silently never work when you don't have the old style speaker hardware.

INSTEAD: Try playing a sound like this when you want a beep:

paplay /usr/share/sounds/sound-icons/capital

Note this uses the paplay (Pulse Audio Play) command which mixes better with other user level (user app) sounds on your system, and not the older aplay (ALSA Play) command which generally can only play one sound at the same time. But note however, that PulseAudio calls ALSA to actually play the sound.

My previous suggestion to use play might still work, but running SoX of which play is from, is overkill.


Works for me when all else failed. Thanks to: tredegar & hk_centos and others.

| improve this answer | |
2

If you have actual speakers connected to the computer and you're not getting a beep it's likely because you are using compiz. Compiz is relying on pulseaudio catching the beeps and playing them while metacity bypasses the usual setup and uses libcanberra to play a beep sound. If it works with metacity and not compiz that is your problem, otherwise the answer htorque gave is corrent.

| improve this answer | |
2

As far as I can tell, this is a bug: System beep broken in Karmic despite heroic efforts to fix it.

| improve this answer | |
  • 3
    "Not enabled by default" does not mean broken, and no "heroic effort" is needed: just modprobe pcsprk (in console) or pactl upload-sample ... in X11 and the annoying beep is back :) – MestreLion Feb 19 '15 at 11:03
1

An alternative approach - set your xterm / console to "Visual Bell" so that when it would beep, the window simply inverts its colours for a short time.

I have a bash function called beep to get my attention once a command is finished.

beep ()  { while true; do  echo -en '\a'; sleep 1; done }

And it is used this way

longrun-command ; beep
| improve this answer | |
1

I added this little function to my .bashrc as a replacement for beep:

beep () {
    if [ "$1" = --list ]
    then
        find /usr/share/sounds -type f -exec basename {} \; | sort -n | tr '\n' ' '; echo
    else
        paplay $(find /usr/share/sounds -type f -iname "${1:-bell}*" | head -1)
    fi
}

It searches for a file in /usr/share/sounds starting with supplied argument or "bell" and plays it. beep --list returns list of files in /usr/share/sounds.

# Examples
beep
beep bark
beep trump
| improve this answer | |
0

It might be to late BUT, for the guy in the future looking for this:

printf '\x07'
| improve this answer | |
0
paplay /usr/share/sounds/purple/alert.wav
| improve this answer | |
0

Today, June 2020, in Ubuntu 18.04, the whole sudo modprobe pcspkr and commenting out of the blacklist pcspkr part of the /etc/modprobe.d/blacklist.conf file, as described here, doesn't seem to be necessary.

Mine is still blacklisted, yet my bell character sound works just fine!

$cat /etc/modprobe.d/blacklist.conf 
.
.
.
# ugly and loud noise, getting on everyone's nerves; this should be done by a
# nice pulseaudio bing (Ubuntu: #77010)
blacklist pcspkr

Instead, just make sure the Terminal bell sound is turned ON in your gnome-terminal settings:

Right-click on the screen in gnome-terminal --> Preferences --> check the box for "Terminal bell" under the "Sound" section, as shown below:

enter image description here

Now run this, and hear the dull "thud" sound of the bell character sound:

echo -e "\a"

This also works over remote ssh sessions, which is super handy when building on a remote machine, for instance, so that it will play the bell sound when the build is done, to alert you:

time bazel build //...; echo -e "\a"

Note that also pressing Backspace when there's nothing to delete will also play this sound in gnome-terminal.

Related:

  1. `terminator` terminal won't play bell sound
  2. Update: Also see @jvriesem's response to my question in the comments under this question here: How do I enable the terminal bell?. I seem to be answering a slightly different question.
| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.