He comenzado un largo proceso a través de una terminal. ¿Es posible hacer que el terminal de Ubuntu emita un sonido una vez que se completa el proceso? De esta manera, no necesito seguir revisando, sino que se me notificará a través de un sonido.
He comenzado un largo proceso a través de una terminal. ¿Es posible hacer que el terminal de Ubuntu emita un sonido una vez que se completa el proceso? De esta manera, no necesito seguir revisando, sino que se me notificará a través de un sonido.
Respuestas:
Hay al menos tres formas de línea de comando para lograr esto colocando el comando de adaptación al final de su script que puede invocar para su largo proceso:
La forma "clásica" de reproducir un sonido es usar un pitido a través de los altavoces de la PC. Sin embargo, esto no funcionará en todos los casos (por ejemplo, en mi sistema, los altavoces de la PC están completamente deshabilitados) y deberá eliminar pscpkr /etc/modprobe/blacklist.conf
y cargar el pcspkr
módulo del kernel.
sudo sed -i 's/blacklist pcspkr/#blacklist pcspkr/g' /etc/modprobe.d/blacklist.conf
sudo modprobe pcspkr
beep [optional parameters]
También podemos reproducir cualquier archivo de sonido en formato wav usando aplay (instalado por defecto):
aplay /usr/share/sounds/alsa/Side_Right.wav
Otra forma es usar la interfaz de línea de comandos de pulseaudio para permitir la reproducción de cualquier archivo de sonido que su sistema (en libsndfile
) reconozca en la salida de audio predeterminada:
paplay /usr/share/sounds/freedesktop/stereo/complete.oga
Podemos usar archivos de sonido predeterminados /usr/share/sounds/
o cualquier otro archivo de sonido que tengamos en una ubicación diferente.
Solo por haberlo mencionado, hay otra buena manera de lograr esto haciendo un mal uso de espeak , que se instala de manera predeterminada en Ubuntu <= 12.04. Vea, o más bien escuche el siguiente ejemplo:
#! /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"
En Ubuntu> = 12.10, Orca usa speak-dispatcher. Entonces podemos instalar espeak , o alternativamente usar spd-say "Text"
.
spd-say
.
spd-say
utilidad está instalada por defecto y funciona en mi sistema.
paplay /usr/share/sounds/freedesktop/stereo/complete.oga
yo suelo
make; spd-say done
Reemplace "make" con cualquier comando de larga duración que utilice.
spd-say 'get back to work
'. Y también viene preinstalado: releases.ubuntu.com/trusty/… , para personas ciegas, supongo. Y -w
para los bucles infinitos: while true; do spd-say -w 'get back to work you lazy bum'; done
.
Para reproducir un sonido después de que termine el comando:
long-running-command; sn3
(donde sn3
está el número de sonido 3) pon esto en .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
}
O lea a continuación para obtener más opciones:
Esto es lo que uso exactamente para lo que pides, con una diferencia: no solo reproduce un sonido cuando finaliza el comando, sino que reproduce un sonido diferente en caso de éxito y error. (Pero puede cambiarlo si no le gusta).
Tengo una función Bash llamada oks
que uso al final de los comandos de ejecución larga:
make && make test && make install; oks
Reproduce un sonido y muestra OK o ERROR (con código de error) cuando finaliza el comando anterior.
Aquí está esa función con dos ayudantes:
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
}
Puede ponerlo en su ~ / .bashrc directamente o ponerlo en otro archivo y luego poner esta línea en su ~ / .bashrc:
. ~/path/to/file/with/function
Cambio sound_ok
y sound_error
algunos otros sonidos.
Puede experimentar con sound
vs soundbg
y cambiar sound_ok
y sound_error
usar secuencias de muchos sonidos que le gusten para obtener el resultado que desea.
Para encontrar algunos buenos sonidos en su sistema, puede probar:
for i in /usr/share/sounds/*/stereo/*; do echo $i; paplay $i; sleep 1; done
Aquí hay algunos sonidos que uso a menudo que están disponibles en Ubuntu de manera predeterminada que son buenos para las notificaciones: sn1 es ruidoso y agradable, sn2 es muy fuerte y sigue siendo bastante agradable, sn3 es extremadamente ruidoso y no tan agradable:
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
}
Nuevamente, puede cambiar sound
a soundbg
si desea reproducirlo en segundo plano sin esperar a que termine el sonido (por ejemplo, para no ralentizar sus guiones cuando reproduce muchos sonidos).
Y por si acaso, aquí está la misma función oks
pero sin sonidos:
ok() {
# prints OK or ERROR and exit status of previous command
s=$?
if [[ $s = 0 ]]; then
echo OK
else
echo ERROR: $s
fi
}
Así es como lo usas:
Ejemplo con éxito:
ls / && ls /bin && ls /usr; oks
ejemplo con error:
ls / && ls /bim && ls /usr; oks
Por supuesto, en la práctica, los comandos son más como:
make && make test && make install; oks
pero lo usé ls
para que pudieras ver rápidamente cómo funciona.
Puede usar en ok
lugar de oks
para una versión silenciosa.
O puede usar, por ejemplo:
ls / && ls /bim && ls /usr; ok; sn1
para imprimir OK / ERROR pero siempre reproducir el mismo sonido, etc.
Puse esas funciones en GitHub, mira:
La fuente se puede descargar desde:
Agregué una soundloop
función al repositorio anterior. Reproduce un sonido y puede ser interrumpido por Ctrl + C (a diferencia de un simple while true; do paplay file.ogg; done
que uno esperaría que funcione pero no funciona), como lo ha pedido Shadi en los comentarios. Se implementa como:
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
}
Si cree que es complicado, dirija sus quejas a los desarrolladores de PulseAudio.
while true; do paplay ...; done
para que el sonido se repita hasta que golpee Ctrl+C
, pero cuando lo hago, no se rompe. No puedo encontrar ninguna opción especial man paplay
para descubrir cómo hacer que esto funcione. ¿Algunas ideas?
De acuerdo con esto, el \a
personaje escapa al código ASCII 7, que es el pitido de la computadora.
Así que echo $'\a'
funciona para hacer un pitido en mi máquina local, incluso cuando se ejecuta en un bash shell que se ejecuta en una computadora a la que estoy conectado a través de una interfaz de terminal como PuTTY.
Ampliando la respuesta de Michael Curries, podría hacer que Bash imprima un carácter BEL
( \a
) a través de PROMPT_COMMAND
:
PROMPT_COMMAND='printf \\a'
Si se configura de PROMPT_COMMAND
esa manera, Bash se ejecutará printf \\a
al final de cada comando, lo que hará que el terminal reproduzca un sonido (aunque, como señala muru, simplemente activando la redistribución del indicador hará que el terminal reproduzca el sonido, es decir, se reproducirá el sonido cada vez que se dibuja una nueva solicitud, por ejemplo, incluso cuando se está presionando ENTER).
Esta es una función de terminal, por lo que podría no funcionar en todos los terminales; por ejemplo no funciona en la consola (pero estoy seguro de que funciona en gnome-terminal
y xterm
).
El comando
speaker-test
hace un ruido La solución más simple pero molesta. :-)
Consulte el manual despeaker-test(1)
opciones para configurar la señal de ruido.
command && (say done ; echo done) || (echo error ; say error)
Ejemplo 1: echo alik && (say done ; echo done) || (echo error ; say error)
dará como resultado una palabra hecha.
Ejemplo 2: non_existing_command_error && (say done ; echo done) || (echo error ; say error)
dará como resultado una palabra de error.
* Necesidades gnustep-gui-runtime
-
sudo apt-get install gnustep-gui-runtime
Salud.
Creé un script simple y casi nativo que reproduce sonido y muestra una notificación con un mensaje y hora dados para 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
Cree un nuevo directorio en su hogar y llámelo noti
mkdir ~/noti
Descargue noti.sh y extráigalo al noti
directorio anterior .
Abra la Terminal y cambie el directorio a noti
cd ~/noti
Haga que noti.sh sea ejecutable emitiendo:
sudo chmod +x noti.sh
Ejecute una prueba como esta:
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"
onda sinusoidal ffmpeg
Para los minimalistas, puedes jugar un seno de 1000 Hz durante 5 segundos:
sudo apt-get install ffmpeg
ffplay -f lavfi -i "sine=frequency=1000:duration=5" -autoexit -nodisp
o para siempre hasta que hagas Ctrl-C:
ffplay -f lavfi -i "sine=frequency=1000" -nodisp
Más información en: https://stackoverflow.com/questions/5109038/linux-sine-wave-audio-generator/57610684#57610684
Probado en Ubuntu 18.04, ffmpeg 3.4.6.