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


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


76
2018-04-02 18:16


происхождения


Можете ли вы подробнее объяснить, что вы имеете в виду? процесс завершен? - Lucio
Управление @Lucio возвращается обратно на терминал - Goaler444
Вы имеете в виду, откройте приложение с терминала и, когда оно закончите, сделайте звук? У вас есть сервер Ubuntu или вы имеете в виду программное обеспечение GUI? - Lucio
Да, точно. Например, я запускаю программу командной строки, и после ее выхода и управления возвращается обратно на терминал, звук создается. В настоящее время я использую Ubuntu 12.10 - Goaler444


ответы:


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

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


Просто, чтобы упомянуть об этом, есть еще один хороший способ добиться этого, злоупотребляя озвучки, который по умолчанию установлен в 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 использует оператор-диспетчер. Затем мы можем установить озвучки  Install espeak, или, альтернативно, использовать spd-say "Text",


69
2018-04-02 18:40



@Takkat Я использую Ubuntu 12.10 и озвучки в настоящее время не установлен. - Lucio
@Lucio: Да, теперь, когда вы это говорите ... Они переключились на говорящего-диспетчера. Если это работает (оно не работает в моей системе), см. Править для использования spd-say, - Takkat
@Takkat spd-say Утилита установлена ​​по умолчанию, и она работает в моей системе. - Lucio
Также взгляните на это Q / - c0rp
У меня был хороший успех paplay /usr/share/sounds/freedesktop/stereo/complete.oga - Nicholas DiPiazza


я использую

make; spd-say done

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


60
2018-02-19 23:58



Вы просто сделали мой день!! : D - n0noob
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, - Ciro Santilli 新疆改造中心 六四事件 法轮功


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

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


11
2017-09-13 19:39



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


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.


11
2018-04-01 19:24



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


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

PROMPT_COMMAND='printf \\a'

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

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


6
2018-03-06 20:25



(с оговоркой, что каждый раз, когда вы нажимаете Enter, вы получите звук) - muru


Команда

 speaker-test

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

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


3
2017-11-01 08:01





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
2018-05-23 11:23





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

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

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

1
2018-03-30 14:07





Я создал простой и почти собственный скрипт, который воспроизводит звук и отображает уведомление с заданным сообщением и временем для 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 реж.

  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
2017-07-10 14:02