当程序向终端输出内容时,有没有办法播放声音?
让我说我跑:
$ for i in {0..10}; do echo $i; done
我可以在每个打印的换行符上播放声音或运行任何命令吗?
更具体地说,我正在运行WEBrick for Rails开发,我想知道每当有服务器请求而不必查看它时。
(我在Linux Mint 17上使用Bash)
答案 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服务器的请求,我就会知道,而不必查看终端。