在终端输出上播放声音
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 服务器的请求,我就可以知道,而无需查看终端。
有没有办法在程序向终端输出内容时播放声音?
假设我运行:
$ 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 服务器的请求,我就可以知道,而无需查看终端。