在终端输出上播放声音

Play sound on terminal output

有没有办法在程序向终端输出内容时播放声音?

假设我运行:

$ for i in {0..10}; do echo $i; done

我可以在打印的每个换行符上播放声音或运行任何命令吗?

更具体地说,我正在运行 WEBrick 进行 Rails 开发,我想知道何时有对服务器的请求而无需查看它。

(我在 Linux Mint 17 上使用 Bash)

您可以从 sox package 检查命令行驱动的声音播放器,例如 play

然后你可以简单地写一个for循环,让它在每次循环成功时执行play程序。

for i in {0..10}; do
    # do your stuff here, presumably something like:
    `ruby /path/to/script.rb`
    echo $i
    `play /path/to/notification.ogg`
done

您可以尝试 AASCII "bell char" (07),在 echo 命令中通过其换码字符 (\a)。

您必须使用“echo -e”来解析输入字符串中的转义字符。示例:echo -e "line 1\nline 2"

更多信息在这里: http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/bash-prompt-escape-sequences.html

在 BASH 你可以做:

for i in {0..10}; do echo -e "$i\a"; sleep 0.2; done

您可以在 Ruby (我在 irb 上测试过) 中使用相同的转义字符。直接在您的 Rails 应用程序上试用:

puts "bell\a"

这可能是一个相当复杂的解决方案,但它满足了我的需要。

在我的 .bashrc 文件中,我添加了以下内容:

#ensure that the call is made only once, preventing an infinite loop

if [ $SHLVL == 1 ]
then
    script -afq ~/custom/log.txt #log everything that happens in the shell
fi

#call my script only once by checking for another instance of it

if [[ ! $(pidof -x script.sh) ]]
then
    ~/custom/script.sh&
fi

我的 script.sh 文件检查 log.txt 中的更改并在发生更改时播放哔声(您需要下载它):

#!/bin/bash

$(stat -c %y ~/custom/log.txt > ~/custom/update.txt)

while :
do
    now=$(stat -c %y ~/custom/log.txt)
    update=$(cat ~/custom/update.txt)
    if [ "$now" != "$update" ]
    then
        $(stat -c %y ~/custom/log.txt > ~/custom/update.txt)
        $(play -q ~/custom/beep.ogg vol 0.1) #props to franklin
    fi
done

这将使 shell 每次发生变化时,包括输入,script.sh 都会 运行 play。现在,只要有对我的 WEBrick 服务器的请求,我就可以知道,而无需查看终端。