Как сделать звук после завершения процесса?
Я начал долгий процесс через терминал. Можно ли заставить терминал Ubuntu издавать звук после завершения процесса? Таким образом, мне не нужно постоянно проверять, но вместо этого я получу уведомление через звук.
15 ответов
Есть по крайней мере три способа командной строки, для этого поместите команду suiting в конец вашего скрипта, который вы можете вызвать для вашего длительного процесса:
"Классический" способ воспроизведения звука - использование звукового сигнала.
через динамики ПК. Однако это не будет работать во всех случаях (например, в моей системе динамики компьютера полностью отключены), и вам нужно будет удалить 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]
Мы также можем воспроизвести любой звуковой файл в формате wav, используя aplay (установлен по умолчанию):
aplay /usr/share/sounds/alsa/Side_Right.wav
Другой способ - использовать интерфейс командной строки 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"
,
Я использую
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!
Примечания:
gs_
это мои инициалы. Я добавляю сюда свои собственные команды, чтобы их было легко найти: теперь я могу просто ввестиgs_
на терминале, затем Tab дважды нажмите, чтобы увидеть распечатку всех моих пользовательских команд.В
_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
Как пользоваться?
Первый запуск - настройка:
Создайте новый каталог у себя дома и назовите его
noti
mkdir ~/noti
Скачайте noti.sh и распакуйте его выше
noti
реж.Откройте терминал и измените каталог на
noti
cd ~/noti
Сделайте noti.sh исполняемым, выполнив:
sudo chmod +x noti.sh
Запустите тест, как это:
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, и он издаст звуковой сигнал (о боже)