Я начал долгий процесс через терминал. Можно ли заставить терминал Ubuntu издавать звук после завершения процесса? Таким образом, мне не нужно постоянно проверять, но вместо этого я получу уведомление через звук.
Я начал долгий процесс через терминал. Можно ли заставить терминал Ubuntu издавать звук после завершения процесса? Таким образом, мне не нужно постоянно проверять, но вместо этого я получу уведомление через звук.
Ответы:
Есть по крайней мере три способа командной строки, для этого поместите команду 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"
.
spd-say
.
spd-say
Утилита установлена по умолчанию и работает в моей системе.
paplay /usr/share/sounds/freedesktop/stereo/complete.oga
я использую
make; spd-say done
Замените «make» любой продолжительной командой, которую вы используете.
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
.
Чтобы воспроизвести звук после завершения команды:
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, смотрите:
Источник можно скачать с:
Я добавил 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.
while true; do paplay ...; done
так, чтобы звук повторялся до тех пор, пока я не ударил Ctrl+C
, но когда я это сделал, он не сломался. Я не могу найти никаких специальных опций, man paplay
чтобы выяснить, как заставить это работать. Есть идеи?
В соответствии с этим\a
символ ускользает ASCII код 7, который является сигналом компьютера.
Таким образом, echo $'\a'
работает звуковой сигнал на моем локальном компьютере, даже если он выполняется на оболочке bash, работающей на компьютере, к которому я подключен через интерфейс терминала, например PuTTY.
Расширяя ответ Майкла Карри, вы можете заставить Bash напечатать символ BEL
( \a
) через PROMPT_COMMAND
:
PROMPT_COMMAND='printf \\a'
Установка PROMPT_COMMAND
этого способа заставит Bash выполняться printf \\a
в конце каждой команды, что заставит терминал воспроизводить звук (хотя, как указывает muru, простое инициирование перерисовки приглашения заставит терминал воспроизводить звук, т.е. будет воспроизводиться звук каждый раз выводится новое приглашение, например, даже когда вы просто нажимаете ENTER).
Это функция терминала, поэтому она может работать не на всех терминалах; например, он не работает в консоли (но я уверен, что он работает в gnome-terminal
и xterm
).
Команда
speaker-test
издает шум Самое простое, но раздражающее решение. :-)
Посмотрите в руководстве оspeaker-test(1)
вариантах настройки шумового сигнала.
Это не то, что вы просили, но вы можете использовать уведомление для этого.
Замените команду, приведенную в других ответах, на
notify-send "Process terminated" "Come back to the terminal, the task is over"
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
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"
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#57610684
Протестировано в Ubuntu 18.04, ffmpeg 3.4.6.