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

77

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

    
задан Goaler444 02.04.2013 в 20:16
источник

9 ответов

70

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

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

    sudosed-i's/blacklistpcspkr/#blacklistpcspkr/g'/etc/modprobe.d/blacklist.confsudomodprobepcspkrbeep[optionalparameters]
  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 или, альтернативно, используйте spd-say "Text" .

    
ответ дан Takkat 02.04.2013 в 20:40
источник
60

Я использую

make; spd-say done

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

    
ответ дан Memetic 20.02.2015 в 00:58
11

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

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

    
ответ дан Michael Currie 13.09.2015 в 21:39
11

TL; DR

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

long-running-command; sn3

(где sn3 является звуковым номером 3) поместите это в .bashrc :

sound() {
  # plays sounds in sequence and waits for them to finish
  for s in [email protected]; 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 [email protected]; do
    paplay $s
  done
}
soundbg() {
  # plays all sounds at the same time in the background
  for s in [email protected]; 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 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 , но без звуков:

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

Update

Я помещаю эти функции в GitHub, см.

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

Обновление 2

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

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.

    
ответ дан rsp 01.04.2015 в 21:24
6

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

PROMPT_COMMAND='printf \a'

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

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

    
ответ дан kos 06.03.2016 в 21:25
3

Команда

 speaker-test

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

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

    
ответ дан xerostomus 01.11.2015 в 09:01
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

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

    
ответ дан AlikElzin-kilaka 23.05.2016 в 13:23
1

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

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

notify-send "Process terminated" "Come back to the terminal, the task is over"
    
ответ дан solsTiCe 30.03.2018 в 16:07
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 dir.

  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"
    
ответ дан Yahya 10.07.2018 в 16:02