【问题标题】:Play sound on terminal output在终端输出上播放声音
【发布时间】:2015-03-06 03:02:03
【问题描述】:

当程序向终端输出一些东西时,有什么方法可以播放声音吗?

假设我跑步:

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

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

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

(我在 Linux Mint 17 上使用 Bash)

【问题讨论】:

  • 铃铛字符有用吗? echo -e "\a"
  • 试试这个。 unix.stackexchange.com/questions/8607/… 基本上只需使用 ; 分隔符告诉 BASH 在第一个命令完成后执行声音文件。
  • 我只是得到一个空行。
  • 我可以按顺序运行命令,但这并不能解决问题,因为只有在服务器关闭后才会播放声音。

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


【解决方案1】:

您可以在 echo 命令上通过其 scape char (\a) 尝试 AASCII “bell char” (07)。

您必须使用“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"

【讨论】:

  • 出于某种原因,echo -e \n对我没有任何帮助。我正在使用paplay 来解决这个问题。感谢您的帮助。
  • @fábio-queluci echo -e \n 在运行命令之前由 shell 转换为 echo -e n` without quotes is used to cancel special chars. To send \n` 到命令中,您必须将其放在带引号的字符串中,例如 echo -e '\n'echo -e "\n"
  • 感谢您的提醒。我试过puts "bell\a",什么也没得到,只是“铃”。我查了一下,我认为问题出在我的笔记本电脑上。
【解决方案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

【讨论】:

  • 这样可以解决我编写的脚本的问题,但是我无法控制的脚本呢,比如rails s
  • 你能在这里或 github 上发布你所说的那种 Rails 脚本吗?我不确定我是否理解这个问题。
  • 感谢play 命令提示。我需要一个通用的解决方案,所以不需要更改脚本本身。一种“窥探”输出的方法,如果你愿意的话。我会尽快发布我的解决方案。再次感谢您的提示,我正在我的解决方案中使用它。
【解决方案3】:

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

在我的 .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 服务器的请求,我就可以知道,而无需查看终端。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多