在shell脚本中,蜂鸣声无法正常工作吗?

我想在一个shell脚本中使用一个蜂鸣声。不幸的是,我在谷歌上找到的所有方法都对我无效。
我尝试过
echo -e '\a'

echo -ne '\007'

安装了apt之后,我执行了命令beep,但是没有任何反应。可能是什么原因呢?

请查看此错误报告:https://bugs.launchpad.net/ubuntu/+source/unity/+bug/769314 - Flimm
请点击以下链接获取相关信息:http://superuser.com/questions/47564/remotely-make-the-computer-beep-on-built-in-speaker || http://unix.stackexchange.com/questions/1974/how-do-i-make-my-pc-speaker-beep || http://stackoverflow.com/questions/10313939/how-to-emit-a-beep-on-my-computer-while-running-a-script-on-a-remote-machine - Ciro Santilli OurBigBook.com

在Xubuntu中获得一个漂亮的PulseAudio铃声

参见:https://askubuntu.com/questions/1310345/how-to-fix-gnome-terminal-bell-in-xubuntu-20-04
- Steve Holmes
如果您的终端是terminator,请查看我在这里的问答以获取答案:https://askubuntu.com/questions/1253799/terminator-terminal-wont-play-bell-sound/1253800#1253800。 - Gabriel Staples
17个回答

不喜欢pcspkr的蜂鸣声,我使用安装了pulseaudio服务器的paplay命令来播放系统声音中的一个蜂鸣声。
首先找到你喜欢的声音(例如,你可以浏览/usr/share/sounds以查找一些可用的声音),并创建一个对它的引用。
export BEEP=/usr/share/sounds/ubuntu/ringtones/Harmonics.ogg

然后作为命令可用。
alias beep='paplay $BEEP'

现在只需在需要时运行beep。例如,在命令完成时提醒您:
find . | grep treasure ; beep

2当有人运行echo -e '\a'时,你能让它播放这个声音吗? - Flimm
你可能需要在while循环中使用一些 read 命令或者其他可以监控按键的库。 - yuvilio
7这真是个绝妙的解决方案!现在我可以运行run-my-long-test-suite.sh; beep,然后在系统准备好之前读一下 Stack Overflow。 - jamesc
4不错!我现在使用export BEEP=/usr/share/sounds/ubuntu/stereo/dialog-information.oggalias beep='paplay $BEEP --volume=32768',这对我来说效果很好。(请注意,你可以通过beep别名来覆盖音量,例如beep --volume=15000以-12dB的音量播放。) - leftaroundabout
5播放这些OGG文件可能导致延迟比内置PC扬声器的哔声大几个数量级。不仅如此,延迟似乎高度可变。我承认大多数人并不在意,但当你需要实时或接近实时的响应能力时,PC扬声器可能是提供可听反馈的最佳选择。 - H2ONaCl
这完全没有回答问题。 - phil294
如果你喜欢这个,你可能也会喜欢 spd-say "分析完成" - Jonathan Hartley
很不幸,如果我想在SSH会话中触发蜂鸣声(即从远程服务器的命令),这种方法是行不通的。然而,如果我能让echo命令起作用,那么就有可能实现:https://serverfault.com/questions/500839/let-the-local-machine-beep-when-some-event-happen-on-remote - Silveri

首先执行sudo modprobe pcspkr,然后beep应该可以工作。

之所以无法工作是因为默认情况下,Ubuntu不再加载产生蜂鸣声的硬件驱动程序。

如果这对您有效,则要永久启用pcspkr的加载,请编辑/etc/modprobe.d/blacklist.conf文件(可能使用gksudo gedit),并将注释掉说blacklist pcspkr的行,使其看起来像这样:

# 令人讨厌的巨响声,影响每个人的神经;这应该由一个
# 漂亮的 pulseaudio bing 完成(Ubuntu:#77010)
# blacklist pcspkr

4如果我评论blacklist pcspkr,我必须执行modprobe -r pcspkr && modprobe pcspkr才能使其正常工作。此外,让蜂鸣器发出声音与让可听到的铃声发出声音是不同的,因此http://askubuntu.com/questions/22168/how-do-i-enable-the-terminal-bell仍然应该保持开放状态。 - daithib8
5这在我的Ubuntu 14上不起作用。 - Cerin
这在现代笔记本电脑上很可能永远不会起作用,因为它们没有扬声器设备。请参考下面我关于如何使用paplay的答案。(我浪费了很多时间追寻这个问题,最终却是一片寂静。) - Elliptical view

由于这是谷歌上非常受欢迎的问题,我将列出我在控制台和X11中重新启用蜂鸣声的步骤。

对于Linux控制台(CTRL+ALT+F1...F6):

为什么默认情况下不起作用

正如已经回答的那样,在Ubuntu中,PC Speaker的pcspkr内核驱动程序被列入黑名单。

临时启用直到重新启动:

sudo modprobe pcspkr

自动启用开机时:
sudo nano /etc/modprobe.d/blacklist.conf

(通过在#前添加注释或删除pcspkr行)


对于X11终端(例如默认的gnome-terminal

为什么默认情况下不起作用

在X环境下,比如使用Unity、KDE、Gnome Shell时,蜂鸣事件会被PulseAudio捕获,这要归功于默认加载在/usr/bin/start-pulseaudio-x11module-x11-bell。而PulseAudio在蜂鸣时播放的声音样本bell.ogg默认为空白。此外,蜂鸣音量可能被静音。

要临时启用当前会话,请执行以下操作:

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

你可以在/usr/share/sounds中尝试其他适合的示例,例如检查/usr/share/sounds/gnome/default/alerts/中的示例。

请注意,beep程序并不是必需的。但如果安装了它,它将使用PC扬声器。这是我找到的唯一启用X下蜂鸣器的方法:

sudo apt-get install beep

要在启动时自动启用,只需将上述行添加到您的~/.profile中,或者系统范围内的/etc/profile中。
测试一下:
printf '\a'

嘟嘟声!

beep

嗡嗡嗡!


要在启动时自动启用PC扬声器蜂鸣声,您实际上需要注释掉位于_/etc/modprobe.d/blacklist.conf_文件中的那行(您想禁用黑名单,而不是相反)。 - z33k
1两种解决方案都适用于Ubuntu 16.04。注意:pcspkrbell.ogg是独立的方法。beep尝试使用不同的方法进行蜂鸣,例如ioctl(console_fd, KIOCSOUND, period)使用pcspkr(声音来自主板上的PC扬声器),而基于printf '\a'的方法可能在没有它的情况下仅使用bell.ogg也能工作(声音来自普通扬声器)。第二种方法可能在pulseaudio服务启动和/或运行xset b on之前无法正常工作。 - jfs
pactl upload-sample ... 对我来说是一个绝妙的发现。有什么方法能永久地重新配置样本加载呢? - ulidtko
@ulidtko:只需将这些行添加到您的~/.profile文件中,或者系统范围内的/etc/profile文件中。 - MestreLion
@MestreLion 错了。在“/etc/pulseaudio/default.pa”中加入“load-sample bell.ogg /usr/share/sounds/ubuntu/stereo/bell.ogg”。 - ulidtko

我以前遇到过这个问题。据我记得,问题是终端提示音尝试发出内部计算机扬声器的声音(就像旧式台式机),但是笔记本电脑和一些新款电脑缺少这样的设备。

当时我找到的唯一解决方案是

sudo apt-get install sox

并且

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

例如

 play -n synth 0.1 sine 880 vol 0.5

试试我的解决方案 - 我很想知道它对你是否有效! - JoBu1324
你可以使用speaker-test来进行测试。 - Janus Troelsen
2你也可以有一个漂亮的吉他弹奏音色: play -q -n synth 2 pluck C5。C5是音符。 - Pablo Bianchi

要持久解决此问题,请执行以下操作:
  • 运行 gconf-editor,如果存在 desktop | gnome | peripherals | keyboard | bell_mode 设置,则将其从 off 更改为 on
  • 运行 dconf-editor,如果存在 org | gnome | settings-daemon | peripherals | keyboard | bell-mode 设置,则将其从 off 更改为 on
  • pactl upload-sample /usr/share/sounds/gnome/default/alerts/glass.ogg bell.ogg 添加到文件 ~/.xprofile(您需要 gnome-control-center-data 来获取 glass.ogg
  • [ "$DISPLAY" ] && xset b 100 添加到文件 ~/.bashrc

启动解决方案的最简单方法是重新启动计算机。

此外,要立即在已打开的终端窗口中实施此解决方案,请运行 pactl 命令并在相关终端窗口中运行 xset 命令。


我把pactl upload-sample命令放在一个shell脚本中,但是你的方法更有组织性。谢谢! - JoBu1324
如果你将pactl命令放在~/.xprofile文件中,它会在GUI会话开始时被执行。 - jdthood
dconf-editor 版本的 bell-mode 设置似乎是 org.gnome.settings-daemon.peripherals.keyboard - lgarzo
@lgarzo:谢谢你的建议。我会更新答案。 - jdthood
不适用于Ubuntu 12.04。 - Hibou57
1@Hibou57: 确保你已经安装了包含 glass.ogg 的软件包。 - Janus Troelsen

"只有在您的电脑上有传统老式的“扬声器”时,Beep 才能正常工作,而且很可能大多数笔记本电脑和小型设备都没有这种设备。

然而,它们通常会配备一个声音芯片和一个或多个扬声器,可以用来播放任何您想要的声音。

因此,当您没有老式扬声器硬件时,安装 beep 命令和/或内核模块 pcspkr 的过时建议将无效。

相反地: 当您需要发出蜂鸣声时,请尝试播放类似以下的声音:

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

请注意,这里使用的是paplayPulse Audio Play)命令,它在您的系统上与其他用户级别(用户应用程序)的声音混合效果更好,而不是较旧的aplayALSA Play)命令,后者通常只能同时播放一个声音。但请注意,PulseAudio实际上调用ALSA来播放声音。

我之前建议使用play的方法可能仍然有效,但运行play所属的SoX会有点过头。


在一切都失败时,这个对我有效。感谢:tredegarhk_centos 以及其他人。


我终于找到了一个解决方案,它不需要在alsamixer中启用PC Beep选项。我记得自己做出了以下更改: 在/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

根据this bug,运行

pactl upload-sample /usr/share/sounds/ubuntu/stereo/bell.ogg bell.ogg


尝试过了,pactl 给出了“连接失败:连接被拒绝。pa_context_connect() 失败:连接被拒绝。” - YodaDaCoda
也许这个帖子能帮到你——如果你曾经以root身份运行过pulseaudio。 - JoBu1324
我实际上遇到了一个不同的问题。Pulseaudio 抛出了“无法打开模块"module-esound-protocol-unix":文件未找到”的错误。可能没必要在这里讨论,因为我正在运行13.04版本,但我很想能够验证您的解决方案。 - YodaDaCoda
15.04的款式稍微有些不同,但还是很不错的。 - VRR


3“Not enabled by default”并不意味着出现故障,也不需要什么“英勇的努力”:只需在控制台中输入modprobe pcsprk或在X11中输入pactl upload-sample ...,烦人的蜂鸣声就会恢复 :) - MestreLion

如果您的计算机连接了实际的扬声器,但没有发出蜂鸣声,很可能是因为您正在使用compiz。Compiz依赖于pulseaudio捕捉蜂鸣声并播放,而metacity则绕过常规设置,使用libcanberra播放蜂鸣声。如果在metacity下可以工作而在compiz下无法工作,那就是您的问题,否则htorque给出的答案是正确的。

可能已经太晚了,但是对于未来寻找这个的人来说:
printf '\x07'