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

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

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

12 ответов

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

  1. "классический" способ играть звук состоит в том, чтобы использовать звуковой сигнал Install beep через динамики компьютера. Однако это не будет работать во всех случаях (например, в моей системе динамики компьютера полностью отключены), и необходимо будет удалить 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 говорить-диспетчеров использования Косатки. Мы можем затем установить espeak Install espeak или альтернативно использовать spd-say "Text".

78
ответ дан 30 March 2018 в 16:19

Команда

 speaker-test

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

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

5
ответ дан 30 March 2018 в 16:19

Подробно останавливаясь на ответе Michael Curries, Вы могли заставить Bash распечатать BEL символ (\a) до PROMPT_COMMAND:

PROMPT_COMMAND='printf \\a'

Установка PROMPT_COMMAND тот путь заставит Bash выполниться printf \\a в конце каждой команды, которая заставит терминал играть звук (хотя, поскольку muru указывает, просто инициировать redrawal подсказки заставит терминал играть звук, т.е. звук будет играться каждый раз, когда новая подсказка оттянута, например, даже когда просто удар ВХОДИТ ).

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

6
ответ дан 30 March 2018 в 16:19
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

Аплодисменты.

1
ответ дан 30 March 2018 в 16:19

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

Это играет звук и отображается хорошо или ОШИБКА (с кодом ошибки), когда предыдущая команда заканчивается.

Исходный код

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

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/ошибку, но всегда играть тот же звук, и т.д.

Обновление

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

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

Обновление 2

Я добавил a soundloop функционируйте к вышеупомянутому repo. Это играет звук и может быть прервано 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.

15
ответ дан 30 March 2018 в 16:19

Я использую

make; spd-say done

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

73
ответ дан 30 March 2018 в 16:19

ffmpeg синусоидальная волна

Для минималистов там, можно играть синус на 1 000 Гц в течение 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
[еще 116] информация в: https://stackoverflow.com/questions/5109038/linux-sine-wave-audio-generator/57610684#57610684

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

0
ответ дан 14 October 2019 в 14:58

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

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

14
ответ дан 22 November 2019 в 23:05

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

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

notify-send "Process terminated" "Come back to the terminal, the task is over"
2
ответ дан 22 November 2019 в 23:05

Я создал простой и почти собственный сценарий, который играет Звук и отображает Уведомление с Данным сообщением и Время для Ubuntu (Суть):

#!/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 dir.

  3. Откройте Terminal и Change Directory к 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
ответ дан 22 November 2019 в 23:05

Супер простой ответ:

Воспроизвести звук ASCII Bell Character :

echo -e "\a"

Сделать это после длинной команды, имитируемой sleep 2 здесь:

sleep 2; echo -e "\a"

ВЫПОЛНЕНО!

Дополнительные сведения:

Чтобы упростить использование, добавьте это в конец вашего файла ~ / .bashrc (создайте этот файл, если он не существует). Или, если вы используете Ubuntu, добавьте его вместо этого в свой файл ~ / .bash_aliases (который импортируется файлом Ubuntu по умолчанию ~ / .bashrc ) , как я делаю в моем ~ / .bash_aliases здесь :

# Play sound; very useful to add to the end of a long cmd you want to be notified of when it completes!
# Ex: `long_cmd; gs_sound_bell` will play a bell sound when `long_cmd` completes!
alias gs_sound_bell="echo -e \"\a\""

# Even better, have a pop-up notification too!
# Ex: `long_cmd; gs_alert` will play the sound above *and* pop up a notification when complete!
# See more details & a screenshot of the popup on my answer here:
#   https://askubuntu.com/questions/277215/how-to-make-a-sound-once-a-process-is-complete/1213564#1213564
# For other popup window options, see my other answer here:
#   https://superuser.com/questions/31917/is-there-a-way-to-show-notification-from-bash-script-in-ubuntu/1310142#1310142
alias gs_alert="gs_sound_bell; alert \"task complete\""

Обратите внимание, что мой псевдоним gs_alert вызывает alert , поэтому вам также необходимо определить этот псевдоним. Этот псевдоним определен по умолчанию в Ubuntu.Но если в вашем файле ~ / .bashrc его еще нет в верхней части, добавьте его чуть выше кода выше. Опять же, эти строки используются по умолчанию в вашем файле ~ / .bashrc в Ubuntu 18 или 20, например:

# Add an "alert" alias for long running commands.  Use like so:
#   sleep 10; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

Протестируйте:

Закройте и снова откройте свой терминал или позвоните . ~ / .bashrc , чтобы повторно "источник" файла, затем протестируйте его следующим образом:

sleep 2; gs_alert

Через 2 секунды вы услышите звук колокольчика и увидите всплывающее окно вверху экрана: enter image description here

Если вы когда-нибудь забудете, что содержится в вашем псевдониме, вы можете увидеть, что находится в каждом из них, запустив следующее:

# See the definitions for ALL aliases you have defined!
alias 

# See just the definitions for specific aliases. Ex:
alias gs_sound_bell
alias gs_alert 
alias alert 

Используйте его:

# get alerted when `my_long_cmd` finishes! Ex: building software. 
my_long_cmd; gs_alert  

Примечания:

  1. Часть gs_ в начале каждого псевдонима мои инициалы. Я добавляю сюда свои собственные команды и псевдонимы, чтобы их было легко найти: теперь я могу просто набрать gs_ в терминале, затем нажать Tab Tab ( Tab дважды), чтобы увидеть распечатку всех моих пользовательских команд.

Идем дальше:

  1. Если вы сочтете это полезным, вы найдете намного больше моих настроек Linux, включая все, что указано выше, здесь: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles .
    1. Проверьте мой домашний каталог .
  2. Для других вариантов всплывающих окон см. Мой другой ответ здесь: SuperUser.com: Есть ли способ показать уведомление из сценария bash в Ubuntu?
3
ответ дан 28 February 2020 в 01:44

Просто добавив интересную идею, которую я видел реализованной в некоторых скриптах, используя системный колокол:

tput bel

он будет звонить в системный колокол, который (по крайней мере, в konsole) показывает уведомление, если вы не смотрите терминал, и ничего не делает, если вы его смотрите (в старых терминах он может звонить в настоящий колокол). согласно этот quesiton он очень портативный, он даже работает в macOS и не нуждается в установке.

1
ответ дан 17 November 2020 в 20:54

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

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