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

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

15 ответов

Решение

Есть по крайней мере три способа командной строки, для этого поместите команду 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",

Я использую

make; spd-say done

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

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

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

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.

Команда

 speaker-test

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

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

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

PROMPT_COMMAND='printf \\a'

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

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

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

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

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

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

Воспроизвести звук символа ASCII Bell:

       echo -e "\a"

СДЕЛАННЫЙ!

Подробнее:

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

       # 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 the sound bell when `long_cmd` completes!
CMD="echo -e \"\a\""
alias gs_sound_bell="$CMD"
alias gs_sound_bell_echo="echo '$CMD'"

# 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!
CMD="gs_sound_bell; alert \"task complete\""
alias gs_alert="$CMD"
alias gs_alert_echo="echo '$CMD'"

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

       # 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 секунды вы услышите звук колокольчика и увидите всплывающее окно в верхней части экрана:

Используй это:

       my_long_cmd; gs_alert  # get alerted when `my_long_cmd` finishes!

Примечания:

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

  2. В _echoВерсия команд - это просто напоминание, чтобы помочь мне узнать, что в команде. я могу печатать gs_alert_echo например, чтобы увидеть результат, который показывает, что находится в команде:

    gs_sound_bell; предупреждение "задача завершена"

    Обновление: это _echoверсия команды совершенно не нужна оказывается! Просто беги alias gs_alert вместо этого, чтобы увидеть, что в нем!:

              $ alias gs_alert
     alias gs_alert='gs_sound_bell; alert "task complete"'
    

Идти дальше:

Если вы сочтете это полезным, вы найдете гораздо больше моих настроек Linux, включая все вышеперечисленное, здесь: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles.

Вы можете нажать Ctrl+ gна клавиатуре, находясь в окне терминала, в котором выполняется команда, и когда команда завершится, раздастся звуковой сигнал. Если вы нажмете ее несколько раз, она также издаст много звуковых сигналов.

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

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

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

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

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

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

tput bel

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

илиaplayилиspd-sayдостаточно, если вы хотите воспроизвести звук. но если вы хотите, чтобы какой-нибудь приятный колокольчик звонил по умолчанию, тогда звон может быть подходящим выбором, просто

      ding npm install

или

      docker build && docker tag && docker push && ding

чтобы установить напоминание, когда команда выполнена

      aplay /usr/share/sounds/purple/alert.wav

и для простоты запоминания сделайте его псевдонимом в .bashrc

      alias beep="aplay /usr/share/sounds/purple/alert.wav 2>/dev/null"

затем вы можете набрать beep, и он издаст звуковой сигнал (о боже)

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