在终端输出上播放声音

时间:2015-01-08 03:55:24

标签: ruby-on-rails linux bash terminal linuxmint

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

让我说我跑:

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

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

更具体地说,我正在运行WEBrick for Rails开发,我想知道每当有服务器请求而不必查看它时。

(我在Linux Mint 17上使用Bash)

3 个答案:

答案 0 :(得分:3)

您可以尝试AASCII"钟形字母" (07),通过\a命令上的scape char(echo)。

您必须使用" 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 中使用相同的scape char(我在irb上进行测试)。直接在您的Rails应用上试用它:

puts "bell\a"

答案 1 :(得分:2)

您可以从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

答案 2 :(得分:2)

这可能是一个非常复杂的解决方案,但它可以满足我的需求。

在我的.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服务器的请求,我就会知道,而不必查看终端。