使用bash,如何使PC扬声器发出蜂鸣声?
这样的东西echo 'beepsound' > /dev/pcspkr
会很好。
使用bash,如何使PC扬声器发出蜂鸣声?
这样的东西echo 'beepsound' > /dev/pcspkr
会很好。
Answers:
我通常会使用beep
安装在许多系统上的小实用程序。该命令将尝试其他方法来创建系统声音。
从手册beep
页创建声音的方法有3种:
在shell脚本中产生提示音的传统方法是通过shell命令(例如)将ASCII BEL
(\007
)字符写入标准输出。
echo -ne '\007'
仅当当前调用外壳程序的标准输出定向到某种终端设备时,此方法才有效。如果不是,则蜂鸣声将不会发出声音,甚至可能在输出定向到的任何文件中引起不必要的损坏。
还有其他方法可以引起蜂鸣声。一种更可靠的方法是在其中打开/dev/tty
并发送您的BEL字符。这对于I / O重定向是可靠的,但是在希望生成蜂鸣声的shell脚本没有控制终端的情况下仍然失败,例如,因为它是从X窗口管理器运行的。
第三种方法是连接到X显示器并向其发送铃声命令。这不依赖于Unix终端设备,但是(当然)需要X显示。
beep
只需尝试这3种方法。
pcspkr
模块,加载snd-pcsp
,现在您有了alsa声卡,该声卡使用老式的技巧将数字声音实际馈送到内部扬声器。压电内置扬声器的效果令人gives舌,但在传统内置扬声器上,其质量相当不错。这样,您的哔哔声就可以变得更有创意;)
pcspkr
和snd-pcsp
都是模块,而不是包装。使用modprobe
/ modprobe -r
/ lsmod
操纵它们。对于您的信息,它们位于linux-image-something
软件包中,希望已安装(否则您将没有linux内核)。
modprobe snd-pcsp
,哔声现在起作用了!
只是回声\a
或\07
为我工作。
$ echo -e "\a"
这可能需要pcspkr
加载内核模块。我只在RHEL上测试过,所以是YMMV。
正如沃伦在评论中指出的那样,当通过SSH远程登录时,这可能无法正常工作。一种快速的解决方法是将输出重定向到任何TTY设备(最好是未使用的设备)。例如:
$ echo -en "\a" > /dev/tty5
sudo modprobe pcspkr
足以通过printf "\a"
或beep
实用程序在VT下启用蜂鸣声。
Ubuntu 16.04.1 LTS
注意:此解决方案会从扬声器(而不是主板)发出蜂鸣声。
ALSA附带了Speaker-test,这是一个命令行扬声器测试音调生成器,可用于生成提示音:
$ speaker-test -t sine -f 1000 -l 1
但是,哔声持续时间将是任意的,但可以按以下方式控制:
$ ( speaker-test -t sine -f 1000 )& pid=$! ; sleep 0.1s ; kill -9 $pid
我们可以更进一步,并使用此功能输出提示音:
_alarm() {
( \speaker-test --frequency $1 --test sine )&
pid=$!
\sleep 0.${2}s
\kill -9 $pid
}
通过频率和持续时间参数调用:
$ _alarm 400 200
考虑到这一点,可以使用创建简单的音乐speaker-test
。请参阅此shell脚本。
timeout ${2} speaker-test --frequency ${1} --test sine
speaker-test -t sine -f 1000 -l 1 & sleep .2 && kill -9 $!
执行相同的操作即可。无论如何,@ user569825的方法更好。
要使用声卡(如果sox
已安装)和PC扬声器(如果未安装):
$ play -q -n synth 0.1 sin 880 || echo -e "\a"
sox
适用于大多数发行版。
then
块中使用此watch
通知我。甚至让我戴上耳机。这对我非常有用。
sudo -u USER play...
play
使用pulseaudio作为用户。我猜这取决于系统配置。
一些发行版具有命令行实用程序来实现此目的。也许您可以告诉我们您正在发行的发行版,或进行搜索(例如emerge -s beep
在gentoo中)。
除了“可用”的utils,您还可以制作一个发出蜂鸣声的Perl脚本,您需要做的就是:
<SomeCodeBefore>
print "\007";
<SomeCodeAfter>
如果您确实收到“哔哔声”,请尝试以下操作:
#! /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
echo -e "\007"
可以在bash而不是print "\007
perl中使用?
printf '\007'
代替使用会更方便echo
。
在Linux上,类似的工具beep
可以在控制台设备上使用ioctl发出给定的声音。更具体地说,beep
将使用KIOCSOUND
ioctl,但是还有一个KDMKTONE
ioctl可用于生成声音。
据我了解,前者会发出声音,直到被明确取消为止,而后者会发出预定持续时间的蜂鸣声。见的console_ioctl
(4)手册页了解详情。
因此,如果您对所做的beep
操作不满意,则可以编写几行代码直接访问这些ioctl。假设您具有的完全访问权限/dev/console
,则可能需要root特权。
在终端中,按Ctrl+ G,然后按Enter