使用bash,如何使PC扬声器发出蜂鸣声?

echo 'beepsound' > /dev/pcspkr这样的东西会很好。

评论

superuser.com/questions/47564/…

superuser.com/questions/47564/…|| askubuntu.com/questions/19906/beep-in-shell-script-not-working || stackoverflow.com/questions/10313939/…

几年前,我到处搜索,并尝试了所有可以尝试的方法,最后使它放弃播放声音文件。但是必须修复一个错误。因为现在当我打开GNOME ALSA Mixer时,我看到了一个带有静音复选框的“蜂鸣”新滑块。启用后,我会发出哔哔声!也许太多的哔哔声,大声笑,但我可爱的Debian Buster终于发出哔哔声。它甚至在TTY模式下发出哔声(通过Ctl-Alt F1)。经过测试,类似echo -e“ \ a”。

#1 楼

我通常会在许多系统上使用安装的小工具beep
此命令将尝试使用不同的方法来创建系统声音。 br />


在shell脚本中产生蜂鸣声的传统方法是通过诸如
beep(ASCII BEL)字符写入标准输出。 >
echo -ne 'q4312078q7'


仅当当前调用外壳程序的标准输出定向到某种终端设备时,此方法才有效。否则,哔哔声将不会发出声音,甚至可能在输出所指向的任何文件中引起不必要的损坏。一种更可靠的方法是打开/dev/tty7并将您的BEL字符发送到那里。这对于I / O重定向是可靠的,但是在希望生成提示音的shell脚本没有控制终端的情况下仍然失败,例如,因为它是从X窗口管理器运行的。
第三种方法是连接到X显示器并向其发送铃声命令。这不依赖Unix终端设备,但是(当然)需要X显示器。

beep只会尝试这三种方法。

评论


beep命令的主页是:johnath.com/beep在Ubuntu / Debian上,您可以使用apt-get install beep安装它。

–里卡多·穆里(Riccardo Murri)
2010-09-13 11:48

在Linux上,有第四个badass方法来发出提示音:卸载pcspkr模块,加载snd-pcsp,现在您有了一个alsa声卡,该声卡使用老式的技巧将数字声音实际馈送到内部扬声器。压电内置扬声器的效果令人results舌,但在传统内置扬声器上,其质量相当不错。这样,您的哔哔声就可以变得更有创意;)

–BatchyX
2013年1月19日15:18



@isomorphismes:pcspkr和snd-pcsp是模块,而不是软件包。使用modprobe / modprobe -r / lsmod来操作它们。对于您的信息,它们位于linux-image-something软件包中,希望该软件包已安装(否则您将没有linux内核)。

–BatchyX
13年8月24日在16:17

哔声通常可以解决debian的问题,但是我需要加载模块才能在ubuntu上工作

– mchid
15年6月28日在23:06

正如mchid所说,在添加模块:modprobe snd-pcsp之后,蜂鸣器现在可以工作了!

–lepe
2015年9月1日在1:19



#2 楼

注意:此解决方案从扬声器发出蜂鸣声,而不是从主板发出蜂鸣声。 />,请参阅此arch linux论坛线程。此函数:
$ speaker-test -t sine -f 1000 -l 1

,它使用频率和持续时间参数被调用:
$ ( speaker-test -t sine -f 1000 )& pid=$! ; sleep 0.1s ; kill -9 $pid

考虑到这一点,可以使用speaker-test制作简单的音乐。请参阅此shell脚本。

评论


单线功能(与Ctrl-C兼容):超时$ {2}扬声器测试-频率$ {1}-测试正弦

–user569825
17-10-23在22:13

没有真正的需要保存pid,只需扬声器测试-t正弦-f 1000 -l 1&睡眠.2 &&杀死-9 $!做同样的事情。无论如何,@ user569825的方法更好。

– m3nda
18年7月8日在18:43

哎呀,好痛。

– shadi
19-10-16在12:11

在我的系统(ubuntu 16.04)上,超时需要将-s设置为某些信号,因为扬声器测试不遵守信号术语。

– TadM。
20-6-5在12:56



@RyneEverett您的alarm.sh可能现在在这里?警报

– SL5net
20-10-7在9:23

#3 楼

只需对\a进行回显就可以为我工作。我只在RHEL上测试过,所以是YMMV。正如Warren在评论中指出的那样,当通过SSH远程登录时,这可能无法正常工作。一种快速的解决方法是将输出重定向到任何TTY设备(最好是未使用的设备)。例如:

$ echo -e "\a"


评论


如果您使用X终端或将ssh插入机器,则可能会导致终端闪烁,因为许多xterm / vt100类型的程序都配置为对BEL字符执行此操作。

–沃伦·杨(Warren Young)
2010-09-13 10:52

这很有道理,但在Ubuntu 12.04上对我不起作用。

–同构
13年8月24日在16:12

@isomorphismes:用于控制台,而不是X11终端。对于X下的蜂鸣声,您可以尝试以下操作:askubuntu.com/a/587311/11015

–MestreLion
15年2月19日在12:21

@isomorphismes:我也使用Ubuntu 12.04,对于我来说,sudo modprobe pcspkr足以通过printf“ \ a”或beep实用程序在VT下启用蜂鸣。

–MestreLion
2015年2月20日,下午1:28

这些方法都不适合我。 Ubuntu 16.04.1 LTS

–ar2015
16-10-26在15:52



#4 楼

tput bel


因为terminfo将bel定义为

           Variable                       Cap-               TCap                  Description
            String                        name               Code

   bell                                   bel                bl                audible signal
                                                                               (bell) (P)


#5 楼

如果安装了sox,而没有安装PC扬声器,则使用声卡:

$ play -q -n synth 0.1 sin 880 || echo -e "\a"


sox适用于大多数发行版。

评论


+1我不知道该游戏具有此功能。我最终在监视内的then块中使用了此命令,以便在满足特定条件时通知我。甚至让我戴上耳机。这对我非常有用。

– andyortlieb
17年5月12日14:24



从bash sh播放可能需要sudo -u USER播放...

–intika
18-10-2在3:08



在我的系统上,播放作为用户使用pulseaudio。我猜这取决于系统配置。

–亚历山大
'18 -10-2在10:02

这是一个很好的解决方案。它不仅可以工作而不必在任何终端中加载任何模块,而且它还是非常可变的。您可能很容易使脚本具有不同的通知声音。更改0.1会改变声音的长度,有很多可能性! (如果使用pulseaudio,请确保以运行pulseaudio的用户身份运行此脚本。如果您使用或不使用,则有两种解决方法。一种是在整个PA系统上运行(不建议),一种以允许其他用户访问PA。)

–五彩纸屑
19/12/21在13:34

#6 楼

一些发行版具有命令行实用程序来实现此目的。也许您可以告诉我们您正在使用的发行版或进行搜索(例如gentoo中的emerge -s beep)。

除了“可用”的utils,您还可以制作一个发出哔哔声的Perl脚本,您需要做的只是: />如果确实收到“哔哔声”,请尝试以下方法:

<SomeCodeBefore>
print "
#! /bin/sh 

beep -f 500 -l 700 
beep -f 480 -l 400 
beep -f 470 -l 250 
beep -f 530 -l 300 -D 100 
beep -f 500 -l 300 -D 100 
beep -f 500 -l 300 
beep -f 400 -l 600 
beep -f 300 -l 500 
beep -f 350 -l 700 
beep -f 250 -l 600
7"; <SomeCodeAfter>


评论


我希望我的问题与发行版无关,在bash中回显-e“ \ 007”而不是在perl中打印“ \ 007”?

– Stefan
2010-09-13 10:35



@Stefan-哔哔声几乎是“通用的”。但是,可以通过使用'echo -e“ \ a”'或'echo -e“ \ 07”'来保持不可知论。干杯!

–蠕虫入侵
2010-09-13 19:13

使用printf'\ 007'代替echo会更方便。

–丹尼斯·威廉姆森
2010-09-14 21:58

#7 楼

“只有当您的PC具有传统的老式“扬声器”时,蜂鸣器才能工作,并且可能(如果不是全部)大多数笔记本电脑和小型设备都没有笔记本电脑。芯片和一个或多个扬声器,可用来发出您想要的任何声音。没有旧的扬声器硬件。

INSTEAD:想要发出哔声时尝试播放以下声音:

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


注意它使用beep(脉冲音频播放)命令与系统上其他用户级别(用户应用)的声音混合得更好,而不是较旧的pcspkr(ALSA播放)命令,后者通常只能同时播放一种声音。但是,PulseAudio会调用ALSA来实际播放声音。

我以前使用paplay的建议可能仍然有效,但是运行播放源的SoX是verkill。


当其他所有方法都失败时,请为我工作。感谢:tredegar和hk_centos等。

#8 楼

请尝试

echo -n Ctrl+V Ctrl+G


缺点是,仅当输出设备是终端时,此方法才起作用,因此,例如在cron作业中可能不起作用。 (但是,如果您是root用户,则可以重定向到/dev/console立即发出蜂鸣声。)

#9 楼

在Linux上,诸如beep之类的工具可以在控制台设备上使用ioctl发出给定的声音。更具体地说,beep将使用KIOCSOUND ioctl,但是还有一个KDMKTONE ioctl可用于产生声音。

据我所知,前者会发出声音,直到被明确取消为止,而后者会发出预定持续时间的蜂鸣声。有关详细信息,请参见console_ioctl(4)手册页。

因此,如果您对beep的功能不满意,则可以编写几行代码直接访问这些ioctl。假设您具有对/dev/console的完全访问权限,这可能需要root特权。

评论


仅在有内置扬声器的情况下可用

– FrancescoPotortì
20年6月30日在11:12

#10 楼

在终端中,按Ctrl + G,然后按Enter

评论


在我的终端(gnome-terminal)中,无需输入即可使用。就像对PC扬声器的测试一样,这对我来说很好。但是,在脚本中它完全没有用。

– Palec
2015年8月27日在16:28



令人惊讶的投票。这确实可以在某些PC上使用,但可能无法全部使用。

– Zzzach ...
17年7月7日在22:14

它在rxvt,urxvt,xterm,lxterm或lxterminal上不起作用,如果有可视铃声,我的终端至少应该不会闪烁吗?

–威廉
17年11月14日在13:44

它确实在xterm上工作

–克里斯
19年5月29日下午3:55

#11 楼

唯一对我有用的解决方案(感谢上面的@alexander)
alias beep='play -q -n synth 0.1 sin 880 >& /dev/null'