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

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

1
задан 30 March 2018 в 16:19

7 ответов

Я использую

make; spd-say done

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

55
ответ дан 24 May 2018 в 23:55
  • 1
    Вы просто сделали мой день!! : D – n0noob 11 June 2015 в 20:50
  • 2
    [F1]. И также поставляется с предустановленной версией: releases.ubuntu.com/trusty/… , для слепых людей, я полагаю? И -w для бесконечных циклов: while true; do spd-say -w 'get back to work you lazy bum'; done. – Ciro Santilli 包子露宪 六四事件 法轮功 28 July 2016 в 14:47

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

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

11
ответ дан 24 May 2018 в 23:55
  • 1
    удивительно! это самое простое и лучшее решение (по крайней мере для меня), потому что он не требует установки каких-либо сторонних приложений и даже может быть набран / вставлен в середине процесса, который будет запущен после того, как командная строка начнет фокусироваться. – hlopetz 28 July 2016 в 11:57
  • 2
    звук этого символа по умолчанию отключен в большинстве современных терминалов – Blauhirn 24 March 2018 в 04:05

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:

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

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

Вы можете поэкспериментировать с sound vs. 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, но без звуков: [ ! d21]

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

пример с ошибкой: [ ! d25]

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

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

make && make test && make install; oks

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

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

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

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

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

Обновить

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

https://github.com/rsp/scripts/blob/master /ok-functions.md

Источник можно загрузить с:

https://github.com/rsp/scripts/blob/master/ok-functions. md

Обновление 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.

10
ответ дан 24 May 2018 в 23:55
  • 1
    Я попытался поместить это в while true; do paplay ...; done, чтобы звук повторялся, пока я не ударил Ctrl+C, но когда я это сделаю, он не сломается. Я не могу найти никаких специальных опций в man paplay, чтобы выяснить, как заставить это работать. Есть идеи? – shadi 24 September 2016 в 21:23
  • 2
    @shadi См. мой обновленный ответ для решения со звуком, который повторяется, пока вы не нажмете Ctrl + C. – rsp 19 January 2017 в 01:39

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

PROMPT_COMMAND='printf \\a'

Установка PROMPT_COMMAND таким образом заставит Bash выполнить [ f6] в конце каждой команды, которая заставит терминал воспроизводить звук (хотя, как указывает муру, просто запуск повторной перемотки подсказки заставит терминал воспроизводить звук, т. е. звук будет воспроизводиться каждый раз, когда появится новое приглашение (например, даже при нажатии ENTER).

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

5
ответ дан 24 May 2018 в 23:55
  • 1
    (с оговоркой, что каждый раз, когда вы нажимаете Enter, вы получите звук) – muru 7 March 2016 в 00:27

Команда

 speaker-test

производит шум. Простое, но раздражающее решение. : -)

Посмотрите руководство по speaker-test(1) для настройки параметров шумового сигнала.

2
ответ дан 24 May 2018 в 23:55
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) приведет к ошибке.

* Требуется -

sudo apt-get install gnustep-gui-runtime

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

1
ответ дан 24 May 2018 в 23:55

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

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

notify-send "Process terminated" "Come back to the terminal, the task is over"
1
ответ дан 24 May 2018 в 23:55

Другие вопросы по тегам:

Похожие вопросы: