问题描述
我已经通过终端开始了漫长的过程。一旦进程完成,是否有可能让Ubuntu终端发出声音?这样,我不需要继续检查,而是会通过声音通知。
最佳解决思路
至少有三种命令行方式可以通过将suiting命令放在脚本结尾处来完成这一任务,您可以为您的漫长过程调用脚本:
-
播放声音的”classical”方式是通过PC扬声器使用beep。然而,这在所有情况下都不起作用(例如,在我的系统中,PC扬声器完全禁用),您需要从
/etc/modprobe/blacklist.conf
中删除pscpkr并加载pcspkr
内核模块。sudo sed -i 's/blacklist pcspkr/#blacklist pcspkr/g' /etc/modprobe.d/blacklist.conf sudo modprobe pcspkr beep [optional parameters]
-
我们也可以使用aplay播放wav格式的任何声音文件(默认安装):
aplay /usr/share/sounds/alsa/Side_Right.wav
-
另一种方法是使用pulseaudio命令行界面来启用系统(在
libsndfile
中)在默认音频输出中识别的任何声音文件的播放:paplay /usr/share/sounds/freedesktop/stereo/complete.oga
我们可以使用来自
/usr/share/sounds/
的默认声音文件,或者我们可能位于不同位置的任何其他声音文件。
刚才已经提到过,还有一种很好的方式可以通过滥用espeak来实现,默认情况下它安装在Ubuntu< = 12.04中。看,或者听听下面的例子:
#! /bin/bash
c=10; while [ $c -ge 0 ]; do espeak $c; let c--; done; sleep 1 ## here lengthy code
espeak "We are done with counting"
在Ubuntu> = 12.10 Orca中使用speak-dispatcher。然后我们可以安装espeak,或者使用spd-say "Text"
。
次佳解决思路
我用
make; spd-say done
将”make”替换为您使用的任何long-running命令。
第三种解决思路
根据this,\a
字符转义ASCII码7,即计算机的哔声。
因此echo $'\a'
可以在我的本地机器上发出嘟嘟声,即使它在我通过终端接口(如PuTTY)连接的计算机上运行的bash shell上执行。
第四种思路
长话短说
命令完成后播放声音:
long-running-command; sn3
(其中sn3
是3号声音)将其放入.bashrc
:
sound() {
# plays sounds in sequence and waits for them to finish
for s in $@; do
paplay $s
done
}
sn1() {
sound /usr/share/sounds/ubuntu/stereo/dialog-information.ogg
}
sn2() {
sound /usr/share/sounds/freedesktop/stereo/complete.oga
}
sn3() {
sound /usr/share/sounds/freedesktop/stereo/suspend-error.oga
}
或者阅读下面的更多选项:
错误和成功的不同声音
以下是我所用的正是你所要求的 – 有一点不同:它不仅在命令结束时播放声音,而且在成功和错误时播放不同的声音。 (但是如果你不喜欢,你可以改变它。)
我有一个名为oks
的Bash函数,我在长时间运行命令的末尾使用了:
make && make test && make install; oks
它播放声音并在上一个命令结束时显示OK或ERROR(带有错误代码)。
源代码
这是两个帮手的功能:
sound() {
# plays sounds in sequence and waits for them to finish
for s in $@; do
paplay $s
done
}
soundbg() {
# plays all sounds at the same time in the background
for s in $@; do
# you may need to change 0 to 1 or something else:
pacmd play-file $s 0 >/dev/null
done
}
oks() {
# like ok but with sounds
s=$?
sound_ok=/usr/share/sounds/ubuntu/stereo/dialog-information.ogg
sound_error=/usr/share/sounds/ubuntu/stereo/dialog-warning.ogg
if [[ $s = 0 ]]; then
echo OK
soundbg $sound_ok
else
echo ERROR: $s
soundbg $sound_error
fi
}
Installation
你可以直接把它放在你的〜/.bashrc中,或者把它放在其他文件中,然后把这行放在〜/.bashrc中:
. ~/path/to/file/with/function
Configuration
将sound_ok
和sound_error
更改为其他声音。
您可以尝试sound
与soundbg
,并更改sound_ok
和sound_error
,以使用您喜欢的许多声音的序列来获得所需的结果。
好的声音
要在你的系统上找到一些好的声音,你可以尝试:
for i in /usr/share/sounds/*/stereo/*; do echo $i; paplay $i; sleep 1; done
下面是我经常使用的一些声音,默认情况下它们在Ubuntu上可用,这对声音很有帮助 – sn1很响亮而且很好,sn2非常响亮而且还不错,sn3非常响亮而且不太好:
sn1() {
sound /usr/share/sounds/ubuntu/stereo/dialog-information.ogg
}
sn2() {
sound /usr/share/sounds/freedesktop/stereo/complete.oga
}
sn3() {
sound /usr/share/sounds/freedesktop/stereo/suspend-error.oga
}
同样,如果您想在后台播放而不等待声音完成(例如,在播放大量声音时不降低脚本速度),则可以将sound
更改为soundbg
。
无声版本
以防万一 – 这里的功能与oks
相同,但没有声音:
ok() {
# prints OK or ERROR and exit status of previous command
s=$?
if [[ $s = 0 ]]; then
echo OK
else
echo ERROR: $s
fi
}
Usage
以下是您如何使用它的方法:
成功案例:
ls / && ls /bin && ls /usr; oks
错误示例:
ls / && ls /bim && ls /usr; oks
当然实际上这些命令更像是:
make && make test && make install; oks
但我用ls
,所以你可以很快看到它是如何工作的。
无声版本可以使用ok
而不是oks
。
或者你可以使用例如:
ls / && ls /bim && ls /usr; ok; sn1
打印OK /ERROR,但始终播放相同的声音等。
Update
我将这些函数放在GitHub上,请参阅:
来源可以从以下网站下载:
更新2
我为上述回购添加了soundloop
功能。它可以播放声音,并且可以通过Ctrl + C中断(与简单的while true; do paplay file.ogg; done
不同,它可以工作,但它不会),正如评论中的shadi所问。它被实现为:
soundloop() {
set +m
a=`date +%s`
{ paplay $1 & } 2>/dev/null
wait
b=`date +%s`
d=$(($b-$a))
[ $d -eq 0 ] && d=1
while :; do
pacmd play-file $1 0 >/dev/null
sleep $d
done
}
如果您认为它很复杂,请将您的投诉指向PulseAudio开发人员。
第五种思路
根据Michael Curries的回答,你可以让Bash通过PROMPT_COMMAND
打印一个BEL
(\a
)字符:
PROMPT_COMMAND='printf \\a'
设置PROMPT_COMMAND
这种方式将使Bash在每个命令结束时执行printf \\a
,这将使终端播放声音(尽管Muru指出,只需触发重新提示即可使终端播放声音,即声音将会每次画出新的提示时都会播放,例如即使刚刚击中ENTER
)。
这是一个终端功能,所以它可能不适用于所有终端;例如它不能在控制台中工作(但我确定它在gnome-terminal
和xterm
中有效)。
第六种思路
命令
speaker-test
发出噪音。最简单但烦人的解决方案。 🙂
查看speaker-test(1)
手册,了解配置噪声信号的选项。