一个过程完成后如何发出声音?

Goa*_*444 144 notification command-line

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

小智 107

我用

make; spd-say done
Run Code Online (Sandbox Code Playgroud)

用您使用的任何长时间运行的命令替换“make”。

  • `spd-说'回去工作'。并且还预装了:http://releases.ubuntu.com/trusty/ubuntu-14.04.4-desktop-amd64.manifest ,我想是盲人吗?和`-w` 表示无限循环:`while true; do spd-say -w '回去工作吧,你这个懒惰的流浪汉';完成`。 (9认同)
  • 你让我今天很开心!!:D (5认同)
  • 提示:如果在字符串中添加逗号,则会出现停顿。`spd-说'错误,我暂停了'` (2认同)

Tak*_*kat 100

至少有三种命令行方法可以通过将适合的命令放在脚本末尾来完成此操作,您可能会为冗长的过程调用:

  1. 播放声音的“经典”方式是使用beep

    Beep 将通过 PC 扬声器发出声音。但是,这并非在所有情况下都有效(例如,在我的系统中 PC 扬声器完全禁用)您可能必须pcspkr从内核模块中删除/etc/modprobe/blacklist.conf并加载pcspkr

    sudo sed -i 's/blacklist pcspkr/#blacklist pcspkr/g' /etc/modprobe.d/blacklist.conf
    sudo modprobe pcspkr
    beep [optional parameters]
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我们还可以使用 aplay(默认安装)播放 wav 格式的任何声音文件:

     aplay /usr/share/sounds/alsa/Side_Right.wav
    
    Run Code Online (Sandbox Code Playgroud)
  3. 另一种方法是使用pulseaudio命令行界面启用系统(in libsndfile)在默认音频输出上识别的任何声音文件的播放:

      paplay /usr/share/sounds/freedesktop/stereo/complete.oga
    
    Run Code Online (Sandbox Code Playgroud)

我们可以使用 中的默认声音文件/usr/share/sounds/,或者我们可能在不同位置拥有的任何其他声音文件。


只是提到它,还有另一种很好的方法可以通过滥用espeak来实现这一点,它默认安装在 Ubuntu <= 12.04 中。请参阅,或者更确切地说是听到以下示例:

sudo sed -i 's/blacklist pcspkr/#blacklist pcspkr/g' /etc/modprobe.d/blacklist.conf
sudo modprobe pcspkr
beep [optional parameters]
Run Code Online (Sandbox Code Playgroud)

在 Ubuntu >= 12.10 中,Orca 使用 speak-dispatcher。然后我们可以安装espeak,或者使用spd-say "Text".

  • 我在`paplay /usr/share/sounds/freedesktop/stereo/complete.oga`方面取得了很好的成功 (5认同)

Mic*_*rie 24

根据\a字符转义ASCII码7,这是计算机的蜂鸣声。

所以echo $'\a'可以在我的本地机器上发出哔声,即使它是在我通过像 PuTTY 这样的终端接口连接到的计算机上运行的 bash shell 上执行的。

  • 惊人的!这是最简单和最好的解决方案(至少对我而言),因为它不需要安装任何 3rd 方应用程序,甚至可以在命令提示符成为焦点后运行的过程中键入/粘贴。 (5认同)
  • 默认情况下,在大多数现代终端中禁用此字符的声音 (2认同)
  • 这对我来说适用于本地 macOS Terminal.app 和 iTerm2,并通过 ssh 登录到远程服务器。但是,当我处于“屏幕”会话中时,它“不起作用”。 (2认同)

rsp*_*rsp 21

TL; 博士

命令完成后播放声音:

long-running-command; sn3
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

或阅读以下更多选项:

错误和成功的不同声音

这是我完全按照您的要求使用的内容 - 有一个区别:它不仅在命令完成时播放声音,而且在成功和错误时播放不同的声音。(但如果你不喜欢它,你可以改变它。)

我有一个 Bash 函数oks,我在长时间运行的命令结束时使用它:

make && make test && make install; oks
Run Code Online (Sandbox Code Playgroud)

当上一个命令完成时,它会播放声音并显示 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
}
Run Code Online (Sandbox Code Playgroud)

安装

你可以直接把它放在你的 ~/.bashrc 中,或者把它放在其他一些文件中,然后把这一行放在你的 ~/.bashrc 中:

. ~/path/to/file/with/function
Run Code Online (Sandbox Code Playgroud)

配置

改变sound_oksound_error其他一些声音。

您可以尝试soundvs.soundbg并更改sound_oksound_error使用您喜欢的许多声音序列,以获得您想要的结果。

好声音

要在您的系统上找到一些好的声音,您可以尝试:

for i in /usr/share/sounds/*/stereo/*; do echo $i; paplay $i; sleep 1; done
Run Code Online (Sandbox Code Playgroud)

以下是我经常使用的一些默认情况下在 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
}
Run Code Online (Sandbox Code Playgroud)

同样,如果您想在不等待声音结束的情况下在后台播放它(例如,在播放大量声音时不减慢脚本速度),您可以更改soundsoundbg

静音版

以防万一 - 这是与oks但没有声音的功能相同的功能:

ok() {
  # prints OK or ERROR and exit status of previous command
  s=$?
  if [[ $s = 0 ]]; then
    echo OK
  else
    echo ERROR: $s
  fi
}
Run Code Online (Sandbox Code Playgroud)

用法

以下是您如何使用它:

成功示例:

ls / && ls /bin && ls /usr; oks
Run Code Online (Sandbox Code Playgroud)

错误示例:

ls / && ls /bim && ls /usr; oks
Run Code Online (Sandbox Code Playgroud)

当然在实践中命令更像是:

make && make test && make install; oks
Run Code Online (Sandbox Code Playgroud)

但我用过,ls所以你可以很快看到它是如何工作的。

您可以使用ok代替oks无声版本。

或者你可以使用例如:

ls / && ls /bim && ls /usr; ok; sn1
Run Code Online (Sandbox Code Playgroud)

打印 OK/ERROR 但始终播放相同的声音等。

更新

我把这些函数放在 GitHub 上,见:

源码可以从以下地址下载:

更新 2

soundloop在上面的 repo 中添加了一个函数。while true; do paplay file.ogg; done正如shadi在评论中所问的那样,它会播放声音并且可以被 Ctrl+C 打断(不像一个简单的,人们希望它可以工作,但它没有)。它实现为:

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
}
Run Code Online (Sandbox Code Playgroud)

如果您认为它很复杂,请将您的投诉直接发送给 PulseAudio 开发人员。


xer*_*mus 8

命令

 speaker-test
Run Code Online (Sandbox Code Playgroud)

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

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

更新

如果你不介意安装 sox,你可以玩 Silicon Heaven Hymn:

sudo apt install sox
while true; do play -q -v 100 -n synth  .$(( $RANDOM % 51 ))1  sine $((200 + $RANDOM % 4000 )) &> /dev/null; done
Run Code Online (Sandbox Code Playgroud)

如果您不介意安装 espeak:

sudo apt install espeak
espeak 'Johnny is marching home! Hurray!'
espeak -v german  'Doch! Ich bin vertig!'
espeak -x  -v czech  'B?žela Magda ka?onem, srážela banány ramenem.' 
Run Code Online (Sandbox Code Playgroud)


kos*_*kos 8

扩展 Michael Curries 的回答,您可以通过以下方式让 Bash 打印一个BEL( \a) 字符PROMPT_COMMAND

PROMPT_COMMAND='printf \\a'
Run Code Online (Sandbox Code Playgroud)

设置PROMPT_COMMAND这种方式将使 Bashprintf \\a在每个命令的末尾执行,这将使终端播放声音(尽管正如穆鲁指出的那样,简单地触发提示的重绘将使终端播放声音,即声音将被播放每次绘制新提示时,例如即使只是点击ENTER)。

这是一个终端功能,因此它可能不适用于所有终端;例如,它在控制台中不起作用(但我确定它在gnome-terminal和 中 起作用xterm)。

  • (需要注意的是,每次按 Enter 时,您都会听到声音) (5认同)

sol*_*iCe 6

这不是您所要求的,但您可以为此使用通知。

将其他答案中给出的命令替换为

notify-send "Process terminated" "Come back to the terminal, the task is over"
Run Code Online (Sandbox Code Playgroud)

  • 我在 .bashrc 中添加了一个简写来执行此操作,然后我意识到 ubuntu 已经有了一个简写!例如:`睡觉 10;警报` (2认同)