2015-01-08 4 views
0

Есть ли способ воспроизвести звук, когда программа выдает что-то на терминал?Воспроизвести звук на выход терминала

Скажет, я бег:

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

Может ли я играть звук, или выполнить любую команду на каждую новой строке печатается?

В частности, я запускаю WEBrick for Rails, и я хотел бы знать всякий раз, когда есть запрос на сервер, не глядя на него.

(я использую Bash на Linux Mint 17)

+0

Работает ли символ колокола? 'echo -e" \ a "' – August

+0

Попробуйте это. http://unix.stackexchange.com/questions/8607/how-can-i-play-a-sound-when-script-execution-is-ready В основном просто используйте разделитель ';', чтобы сообщить BASH, чтобы выполнить звук файл после завершения первой команды. – franklin

+0

Я просто получаю пустую строку. –

ответ

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 

Это сделает это так, что каждый раз, когда что-то меняется в оболочке, в том числе набора текста, script.sh будет работать play. Теперь я узнаю всякий раз, когда есть запрос на мой сервер WEBrick, без необходимости смотреть на терминал.

2

Вы можете проверить для командной строки ведомой звукового игрока, как play от sox package.

Тогда вы можете просто написать цикл 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 
+0

Это решит проблему для скриптов, которые я пишу, но как насчет тех, которые я не контролирую, например 'rails s'? –

+0

Можете ли вы опубликовать здесь или написать github сценарий, который вы говорите? Я не уверен, что понимаю этот вопрос. – franklin

+0

Спасибо за подсказку команды 'play'. Мне нужно общее решение, поэтому не нужно было менять сам скрипт. Способ «шпионить» на выходе, если хотите. Я скоро отправлю решение. Еще раз спасибо за подсказку, я использую его в своем решении. –

3

Вы можете попробовать AASCII "колокол символ" (07), его отпущения полукокса (\a) на echo команды.

Вы должны использовать «echo -e», чтобы он разбирал escape-символы из входной строки. Пример: 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 

Вы можете использовать один и тот же усики полукокс в Рубине (я сделал тест на IRB). Попробуйте прямо в приложении Rails:

puts "bell\a" 
+0

По какой-то причине 'echo -e \ n' ничего не делает для меня. Я использую 'paplay', чтобы обойти это. Спасибо за помощь. –

+0

@ fábio-queluci 'echo -e \ n' переводится в' echo -e n' оболочкой перед запуском команды. «\' Без кавычек используется для отмены специальных символов. Чтобы отправить '\ n' команде, вы должны поместить ее в строку с кавычками, например' echo -e '\ n'' или 'echo -e" \ n "'. – Aurium

+0

Спасибо за головы. Я попробовал 'puts 'bell \ a" 'и ничего не получил, просто« звонок ». Я посмотрел на него, и я думаю, что проблема в моем ноутбуке. –

Смежные вопросы