当前位置: 首页>>技术问答>>正文


一旦进程完成,发出声音

, ,

问题描述

我已经通过终端开始了漫长的过程。一旦进程完成,是否有可能让Ubuntu终端发出声音?这样,我不需要继续检查,而是会通过声音通知。

最佳解决思路

至少有三种命令行方式可以通过将suiting命令放在脚本结尾处来完成这一任务,您可以为您的漫长过程调用脚本:

  1. 播放声音的”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]
    
  2. 我们也可以使用aplay播放wav格式的任何声音文件(默认安装):

    aplay /usr/share/sounds/alsa/Side_Right.wav
    
  3. 另一种方法是使用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"

command-line,notification,ubuntu

次佳解决思路

我用

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_oksound_error更改为其他声音。

您可以尝试soundsoundbg,并更改sound_oksound_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-terminalxterm中有效)。

第六种思路

命令

 speaker-test

发出噪音。最简单但烦人的解决方案。 🙂

查看speaker-test(1)手册,了解配置噪声信号的选项。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/981.html,未经允许,请勿转载。