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?
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It only takes a minute to sign up.
Sign up to join this communityNot 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
run-my-long-test-suite.sh; beep
and read stackoverflow until the system is ready.
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.)
Dec 6, 2015 at 12:57
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
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.
paplay
. (I wasted a bunch of time chasing down this, only to get silence.)
Apr 22, 2020 at 1:08
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:
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 #
)
gnome-terminal
)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!
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
pactl upload-sample ...
was golden for me. What's the way to permanently configure the sample loading again?
~/.profile
, or system-wide at /etc/profile
Feb 6, 2017 at 15:40
load-sample bell.ogg /usr/share/sounds/ubuntu/stereo/bell.ogg
in /etc/pulseaudio/default.pa
.
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
play -q -n synth 2 pluck C5
. C5 is the note.
Jul 1, 2018 at 5:40
To fix this problem persistently:
gconf-editor
and if the desktop | gnome | peripherals | keyboard | bell_mode
setting is present then change it from off
to on
dconf-editor
and if the org | gnome | settings-daemon | peripherals | keyboard | bell-mode
setting is present then change it from off
to on
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
)[ "$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.
pactl upload-sample
command in a shell script, but your method is more organized. Thanks!
pactl
command in ~/.xprofile
it gets executed at the start of the GUI session.
dconf-editor
version of the bell-mode
setting seems to be org.gnome.settings-daemon.peripherals.keyboard
.
glass.ogg
installed
Nov 16, 2014 at 13:44
"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.
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
Connection failure: Connection refused pa_context_connect() failed: Connection refused
.
Dec 11, 2012 at 23:33
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.
Dec 12, 2012 at 0:05
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.
As far as I can tell, this is a bug: System beep broken in Karmic despite heroic efforts to fix it.
modprobe pcsprk
(in console) or pactl upload-sample ...
in X11 and the annoying beep is back :)
Feb 19, 2015 at 11:03
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
It might be to late BUT, for the guy in the future looking for this:
printf '\x07'
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
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:
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"
Also note that pressing Backspace when there's nothing to delete will also play this sound in gnome-terminal
.
Some motherboards don't have a beep speaker. To get around this, I created a Python script that instead uses FFmpeg's aevalsrc
filter to generate beep noises.
Note: you will need to install FFmpeg using sudo apt install ffmpeg
#!/usr/bin/env python3
# This program runs FFPlay to generate beeps.
from argparse import ArgumentParser, ArgumentError, Action
import re
import subprocess
# Custom action for note
class NoteToFrequencyAction(Action):
_note = re.compile(r"([A-G])(bb|[bx#])?(\d+)")
_note_factors = {
"C": lambda x: x / (2 ** (9/12)),
"D": lambda x: x / (2 ** (7/12)),
"E": lambda x: x / (2 ** (5/12)),
"F": lambda x: x / (2 ** (4/12)),
"G": lambda x: x / (2 ** (2/12)),
"A": lambda x: x,
"B": lambda x: x * (2 ** (2/12)),
}
_accidental_factors = {
"x" : lambda x: x * (2 ** (2/12)),
"#" : lambda x: x * (2 ** (1/12)),
None: lambda x: x,
"b" : lambda x: x / (2 ** (1/12)),
"bb": lambda x: x / (2 ** (2/12))
}
def __call__(self, parser, namespace, values, option_string) -> None:
if not (isinstance(values, str)):
raise ArgumentError("Should not have multiple values")
parse = self._note.fullmatch(values);
parts = parse.groups()
freq = 440.0
freq *= 2 ** (int(parts[2]) - 4)
freq = self._note_factors[parts[0]](freq)
freq = self._accidental_factors[parts[1]](freq)
if not type(namespace.__dict__[self.dest]) == list:
namespace.__dict__[self.dest] = []
namespace.__dict__[self.dest].append(freq)
parser = ArgumentParser()
freq_group = parser.add_mutually_exclusive_group(required=True)
freq_group.add_argument("-f", "--frequency", type=float, action="append", dest="freqs",
help="Can be specified more than once, specifies frequencies in Hz of the beeped notes"
)
freq_group.add_argument("-n", "--note", action=NoteToFrequencyAction, dest="freqs",
help="Can be specified more than once, specifies notes (e.g. A4). You can use b, #, x, bb for accidentals."
)
parser.add_argument("-d", "--duration", type=float, default=1, dest="time",
help="The duration of the beep in seconds."
)
parser.add_argument("-v", "--volume", type=float, default=0.5,
help="The volume of the beep, defaults to 0.5"
)
args = parser.parse_args()
del parser, freq_group
aevalsrc_waves = [f"sgn(sin({repr(f)}*2*PI*t))" for f in args.freqs]
aevalsrc_expr = "+".join(aevalsrc_waves)
ffplay_filter = f"aevalsrc=({aevalsrc_expr})/{len(args.freqs)}*{args.volume}:d={args.time}"
print("aevalsrc filter:")
print(ffplay_filter)
subprocess.run([
"ffplay", "-f", "lavfi", "-i", ffplay_filter, "-autoexit", "-nodisp"
], stderr=subprocess.DEVNULL)
Simply paste into ~/bin/beep
and chmod +x beep
to make it available. It doesn't quite support the same options, but doing that would make this code a lot longer than it already is.
This answer works for me using Ubuntu Server with Cinnamon desktop environment installed. The terminal bell was not working by default.
My solution is similar to the answer by @jdthood: I was able to fix it by toggling /org/gnome/desktop/wm/preferences/audible-bell
to true
using dconf-editor
.
Some users experiencing the issue in question will only need to open up the Settings GUI, navigate to 'Sound', and under 'Volume Level' increase 'System Sounds' to a nonzero value ( and double-check that 'System Volume' is also nonzero ).
If anyone wants me to add a screenshot, let me know.
terminator
, see my Q&A here for the answer: askubuntu.com/questions/1253799/….