Как сделать звук после завершения процесса?


94

Я начал долгий процесс через терминал. Можно ли заставить терминал Ubuntu издавать звук после завершения процесса? Таким образом, мне не нужно постоянно проверять, но вместо этого я получу уведомление через звук.


Можете ли вы объяснить, что вы подразумеваете под завершенным процессом ?
Лусио

1
Управление @Lucio возвращается обратно в терминал
Goaler444

1
Ты имеешь ввиду открыть приложение из терминала и когда оно закончится, издать звук? У вас есть сервер Ubuntu или вы имеете в виду программное обеспечение с графическим интерфейсом?
Лусио

2
Да, точно. Например, я запускаю программу командной строки, и как только она выходит и управление возвращается обратно в терминал, раздается звук. Я в настоящее время использую Ubuntu 12.10
Goaler444

Ответы:


78

Есть по крайней мере три способа командной строки, для этого поместите команду suiting в конец вашего скрипта, который вы можете вызвать для вашего длительного процесса:

  1. «Классический» способ воспроизведения звука - использовать звуковой сигнал Установить звуковой сигнал через динамики ПК. Однако это не будет работать во всех случаях (например, в моей системе динамики компьютера полностью отключены), и вам нужно будет удалить pscpkr /etc/modprobe/blacklist.confи загрузить pcspkrмодуль ядра.

    sudo sed -i 's/blacklist pcspkr/#blacklist pcspkr/g' /etc/modprobe.d/blacklist.conf
    sudo modprobe pcspkr
    beep [optional parameters]
    
  2. Мы также можем воспроизвести любой звуковой файл в формате wav, используя aplay (установлен по умолчанию):

    aplay /usr/share/sounds/alsa/Side_Right.wav
    
  3. Другой способ - использовать интерфейс командной строки pulseaudio, чтобы включить воспроизведение любых звуковых файлов, которые ваша система (в libsndfile) распознает на аудиовыходе по умолчанию:

     paplay /usr/share/sounds/freedesktop/stereo/complete.oga
    

    Мы можем использовать звуковые файлы по умолчанию /usr/share/sounds/или любой другой звуковой файл, который у нас может быть в другом месте.


Просто чтобы упомянуть об этом, есть еще один хороший способ добиться этого путем неправильного использования espeak , который установлен по умолчанию в Ubuntu <= 12.04. Посмотрите, вернее услышите следующий пример:

#! /bin/bash

c=10; while [ $c -ge 0 ]; do espeak $c; let c--; done; sleep 1 ## here lengthy code
espeak "We are done with counting"

В Ubuntu> = 12.10 Orca использует говорящий диспетчер. Затем мы можем установить espeak Установить espeak или использовать в качестве альтернативы spd-say "Text".


1
@Takkat Я использую Ubuntu 12.10 и espeak в настоящее время не установлен.
Лусио

@Lucio: да, теперь, когда ты это сказал ... Они переключились на разговорную диспетчерскую. Если это работает (это не в моей системе), см. Правка для использования spd-say.
Таккат

@Takkat spd-sayУтилита установлена ​​по умолчанию и работает в моей системе.
Лусио

Также взгляните на это Q / A
c0rp

1
У меня был хороший успехpaplay /usr/share/sounds/freedesktop/stereo/complete.oga
Николас ДиПьяцца

72

я использую

make; spd-say done

Замените «make» любой продолжительной командой, которую вы используете.


Вы только что сделали мой день!! : D
n0noob

5
spd-say 'get back to work». И поставляется также предустановленным: releases.ubuntu.com/trusty/… , для слепых, я полагаю? И -wдля бесконечных циклов while true; do spd-say -w 'get back to work you lazy bum'; done.
Сиро Сантилли 事件 改造 中心 法轮功 六四 事件

Я смеялся намного сильнее, чем следовало.
НельсонГон

15

TL; DR

Чтобы воспроизвести звук после завершения команды:

long-running-command; sn3

(где sn3звук № 3), поместите это в .bashrc:

sound() {
  # plays sounds in sequence and waits for them to finish
  for s in $@; do
    paplay $s
  done
}
sn1() {
  sound /usr/share/sounds/ubuntu/stereo/dialog-information.ogg
}
sn2() {
  sound /usr/share/sounds/freedesktop/stereo/complete.oga
}
sn3() {
  sound /usr/share/sounds/freedesktop/stereo/suspend-error.oga
}

Или читайте ниже для получения дополнительной информации:

Разные звуки по ошибке и успеху

Вот что я использую именно для того, что вы просите - с одним отличием: он не только воспроизводит звук при завершении команды, но и воспроизводит другой звук при успехе и при ошибке. (Но вы можете изменить это, если вам это не нравится.)

У меня есть функция Bash, oksкоторую я использую в конце длительных команд:

make && make test && make install; oks

Он воспроизводит звук и отображает OK или ERROR (с кодом ошибки), когда завершается предыдущая команда.

Исходный код

Вот эта функция с двумя помощниками:

sound() {
  # plays sounds in sequence and waits for them to finish
  for s in $@; do
    paplay $s
  done
}
soundbg() {
  # plays all sounds at the same time in the background
  for s in $@; do
    # you may need to change 0 to 1 or something else:
    pacmd play-file $s 0 >/dev/null
  done
}
oks() {
  # like ok but with sounds
  s=$?
  sound_ok=/usr/share/sounds/ubuntu/stereo/dialog-information.ogg
  sound_error=/usr/share/sounds/ubuntu/stereo/dialog-warning.ogg
  if [[ $s = 0 ]]; then
    echo OK
    soundbg $sound_ok
  else
    echo ERROR: $s
    soundbg $sound_error
  fi
}

Монтаж

Вы можете поместить его непосредственно в ~ / .bashrc или в другой файл, а затем поместить эту строку в ~ / .bashrc:

. ~/path/to/file/with/function

конфигурация

Поменяй sound_okи sound_errorна некоторые другие звуки.

Вы можете поэкспериментировать с « soundпротив» soundbgи «изменить» sound_okи sound_errorиспользовать последовательности из множества звуков, которые вам нравятся, чтобы получить желаемый результат.

Хорошие звуки

Чтобы найти хорошие звуки в вашей системе, вы можете попробовать:

for i in /usr/share/sounds/*/stereo/*; do echo $i; paplay $i; sleep 1; done

Вот несколько звуков, которые я часто использую, которые доступны в Ubuntu по умолчанию и которые хороши для уведомлений - sn1 громкий и приятный, sn2 очень громкий и все же довольно приятный, sn3 чрезвычайно громкий и не очень приятный:

sn1() {
  sound /usr/share/sounds/ubuntu/stereo/dialog-information.ogg
}
sn2() {
  sound /usr/share/sounds/freedesktop/stereo/complete.oga
}
sn3() {
  sound /usr/share/sounds/freedesktop/stereo/suspend-error.oga
}

Опять же, вы можете изменить soundего, soundbgесли хотите воспроизводить его в фоновом режиме, не дожидаясь завершения звука (например, чтобы не замедлять выполнение сценариев при воспроизведении большого количества звуков).

Тихая версия

И на всякий случай - здесь та же функция, что и oksбез звуков:

ok() {
  # prints OK or ERROR and exit status of previous command
  s=$?
  if [[ $s = 0 ]]; then
    echo OK
  else
    echo ERROR: $s
  fi
}

использование

Вот как вы используете это:

Пример с успехом:

ls / && ls /bin && ls /usr; oks

пример с ошибкой:

ls / && ls /bim && ls /usr; oks

Конечно, на практике команды больше похожи на:

make && make test && make install; oks

но я использовал, lsчтобы вы могли быстро увидеть, как это работает.

Вы можете использовать okвместо oksтихой версии.

Или вы можете использовать, например:

ls / && ls /bim && ls /usr; ok; sn1

распечатать OK / ERROR, но всегда воспроизводить один и тот же звук и т. д.

Обновить

Я поместил эти функции на GitHub, смотрите:

Источник можно скачать с:

Обновление 2

Я добавил soundloopфункцию в репо выше. Он воспроизводит звук и может быть прерван с помощью Ctrl + C (в отличие от простого, while true; do paplay file.ogg; doneкоторый можно ожидать, но не сработает), как спросил Шади в комментариях. Это реализовано как:

soundloop() {
  set +m
  a=`date +%s`
  { paplay $1 & } 2>/dev/null
  wait
  b=`date +%s`
  d=$(($b-$a))
  [ $d -eq 0 ] && d=1
  while :; do
    pacmd play-file $1 0 >/dev/null
    sleep $d
  done
}

Если вы считаете, что это сложно, направьте свои жалобы разработчикам PulseAudio.


Я попытался вставить это while true; do paplay ...; doneтак, чтобы звук повторялся до тех пор, пока я не ударил Ctrl+C, но когда я это сделал, он не сломался. Я не могу найти никаких специальных опций, man paplayчтобы выяснить, как заставить это работать. Есть идеи?
Шади

@shadi Смотрите мой обновленный ответ для решения со звуком, который повторяется, пока вы не нажмете Ctrl + C.
RSP

14

В соответствии с этим\a символ ускользает ASCII код 7, который является сигналом компьютера.

Таким образом, echo $'\a'работает звуковой сигнал на моем локальном компьютере, даже если он выполняется на оболочке bash, работающей на компьютере, к которому я подключен через интерфейс терминала, например PuTTY.


3
удивительно! это самое простое и лучшее решение (по крайней мере, для меня), потому что оно не требует установки каких-либо сторонних приложений и даже может быть набрано / вставлено в середине процесса, который будет запущен после того, как командная строка получит фокус.
Хлопец

2
звук этого персонажа по умолчанию отключен в большинстве современных терминалов
Blauhirn

6

Расширяя ответ Майкла Карри, вы можете заставить Bash напечатать символ BEL( \a) через PROMPT_COMMAND:

PROMPT_COMMAND='printf \\a'

Установка PROMPT_COMMANDэтого способа заставит Bash выполняться printf \\aв конце каждой команды, что заставит терминал воспроизводить звук (хотя, как указывает muru, простое инициирование перерисовки приглашения заставит терминал воспроизводить звук, т.е. будет воспроизводиться звук каждый раз выводится новое приглашение, например, даже когда вы просто нажимаете ENTER).

Это функция терминала, поэтому она может работать не на всех терминалах; например, он не работает в консоли (но я уверен, что он работает в gnome-terminalи xterm).


5
(с оговоркой, что каждый раз, когда вы нажимаете Enter, вы
слышите


2

Это не то, что вы просили, но вы можете использовать уведомление для этого.

Замените команду, приведенную в других ответах, на

notify-send "Process terminated" "Come back to the terminal, the task is over"

1
command && (say done ; echo done) || (echo error ; say error)

Пример 1: echo alik && (say done ; echo done) || (echo error ; say error)приведет к завершению слова.

Пример 2: non_existing_command_error && (say done ; echo done) || (echo error ; say error)приведет к появлению слова ошибки.

* Необходимо gnustep-gui-runtime-

sudo apt-get install gnustep-gui-runtime

Приветствия.


0

Я создал простой и почти родной скрипт, который воспроизводит звук и отображает уведомление с заданным сообщением и временем для Ubuntu ( Gist ):

#!/bin/sh

# https://gist.github.com/John-Almardeny/04fb95eeb969aa46f031457c7815b07d
# Create a Notification With Sound with a Given Message and Time
# The Downloaded Sound is from Notification Sounds https://notificationsounds.com/

MSSG="$1"
TIME="$2"

# install wget if not found
if ! [ -x "$(command -v wget)" ]; then 
    echo -e "INSTALLING WGET...\n\n"
    sudo apt-get install wget
    echo -e "\n\n"
fi

# install at package if not found
if ! [ -x "$(command -v at)" ]; then
    echo -e "INSTALLING AT...\n\n"
    sudo apt-get install at
    echo -e "\n\n"
fi

# install sox if not found
if ! [ -x "$(command -v sox)" ]; then
    echo -e "INSTALLING SOX...\n\n"
    sudo apt-get install sox
    sudo apt-get install sox libsox-fmt-all
    echo -e "\n\n"
fi

# download the noti sound if this is first time
# add alias to the bashrc file
if ! [ -f ~/noti/sound.mp3 ]; then
    echo -e "DOWNLOADING SOUND...\n\n"
    touch ~/noti/sound.mp3 | wget -O ~/noti/sound.mp3 "https://notificationsounds.com/wake-up-tones/rise-and-shine-342/download/mp3"
    sudo echo "alias noti=\"sh ~/noti/noti.sh\"" >> ~/.bashrc
    source ~/.bashrc        
    echo -e "\n\n"
fi

# notify with the sound playing and particular given message and time
echo "notify-send \""$MSSG\"" && play ~/noti/sound.mp3" | at $TIME

Как пользоваться?

Первый запуск - настройка:

  1. Создайте новый каталог у себя дома и назовите его noti

    mkdir ~/noti
    
  2. Скачайте noti.sh и распакуйте его в каталог выше noti.

  3. Откройте терминал и измените каталог на noti

    cd ~/noti
    
  4. Сделайте noti.sh исполняемым, выполнив:

    sudo chmod +x noti.sh
    
  5. Запустите тест, как это:

    sh ~/noti/noti.sh "Test" "now"
    

Примеры

noti "Hello From Noti" "now +1 minute"
noti "Hello From Noti" "now +5 minutes"
noti "Hello From Noti" "now + 1 hour"
noti "Hello From Noti" "now + 2 days"
noti "Hello From Noti" "4 PM + 2 days"
noti "Hello From Noti" "now + 3 weeks"
noti "Hello From Noti" "now + 4 months"
noti "Hello From Noti" "4:00 PM"
noti "Hello From Noti" "2:30 AM tomorrow"
noti "Hello From Noti" "2:30 PM Fri"
noti "Hello From Noti" "2:30 PM 25.07.18"

Для уведомления о завершении процесса (пример)

sudo apt-get update; noti "Done" "now"

0

ffmpeg синусоида

Для минималистов, вы можете играть синус 1000 Гц в течение 5 секунд:

sudo apt-get install ffmpeg
ffplay -f lavfi -i "sine=frequency=1000:duration=5" -autoexit -nodisp

или навсегда, пока вы не нажмете Ctrl-C:

ffplay -f lavfi -i "sine=frequency=1000" -nodisp

Дополнительная информация по адресу: https://stackoverflow.com/questions/5109038/linux-sine-wave-audio-generator/57610684#57610684

Протестировано в Ubuntu 18.04, ffmpeg 3.4.6.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.