¿Cómo hacer un sonido una vez que se completa un proceso?

76

Empecé un largo proceso a través de una terminal. ¿Es posible hacer que el terminal de Ubuntu emita un sonido una vez que el proceso esté completo? De esta forma, no necesito seguir revisando, sino que recibiré una notificación a través de un sonido.

    
pregunta Goaler444 02.04.2013 - 18:16

9 respuestas

69

Hay al menos tres formas de línea de comandos para lograr esto al poner el comando adecuado al final de su secuencia de comandos que puede invocar para su largo proceso:

  1. La forma "clásica" de reproducir un sonido es usar beep 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 tendrás que eliminar pscpkr de /etc/modprobe/blacklist.conf y cargar el% kernel%%.

    sudo sed -i 's/blacklist pcspkr/#blacklist pcspkr/g' /etc/modprobe.d/blacklist.conf
    sudo modprobe pcspkr
    beep [optional parameters]
    
  2. También podemos reproducir cualquier archivo de sonido en formato wav usando aplay (instalado por defecto):

    aplay /usr/share/sounds/alsa/Side_Right.wav
    
  3. 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 pcspkr ) reconozca en la salida de audio predeterminada:

     paplay /usr/share/sounds/freedesktop/stereo/complete.oga
    

    Podemos usar archivos de sonido predeterminados de libsndfile o cualquier otro archivo de sonido que tengamos en una ubicación diferente.

Solo por haberlo mencionado, hay otra buena forma de lograrlo al usar espeak , que está instalado por defecto en Ubuntu & lt; = 12.04. Vea, o mejor 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 & gt; = 12.10 Orca usa speak-dispatcher. Luego podemos instalar espeak , o alternativamente use /usr/share/sounds/ .

    
respondido por el Takkat 02.04.2013 - 18:40
60

uso

make; spd-say done

Reemplaza "make" con cualquier comando de larga duración que uses.

    
respondido por el Memetic 19.02.2015 - 23:58
11

De acuerdo con esto , el carácter \a escapa del código ASCII 7, que es el pitido de la computadora.

Entonces echo $'\a' funciona para hacer un pitido en mi máquina local, incluso cuando se ejecuta en un shell bash que se ejecuta en una computadora a la que estoy conectado a través de una interfaz de terminal como PuTTY.

    
respondido por el Michael Currie 13.09.2015 - 19:39
11

TL; DR

Para reproducir un sonido después de que termine el comando:

long-running-command; sn3

(donde sn3 es el sonido número 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:

Sonido diferente por error y éxito

Esto es lo que uso para exactamente lo que pide, con una diferencia: no solo reproduce un sonido cuando el comando finaliza, sino que reproduce un sonido diferente cuando tiene éxito y se produce un error. (Pero puede cambiarlo si no le gusta).

Tengo una función Bash llamada oks que uso al final de los comandos de larga ejecución:

make && make test && make install; oks

Reproduce un sonido y muestra OK o ERROR (con código de error) cuando termina el comando anterior.

Código fuente

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
}

Instalación

Puedes ponerlo en tu ~ / .bashrc directamente o ponerlo en otro archivo y luego poner esta línea en tu ~ / .bashrc:

. ~/path/to/file/with/function

Configuración

Cambia sound_ok y sound_error a otros sonidos.

Puedes experimentar con sound vs. soundbg y cambiar sound_ok y sound_error para usar secuencias de muchos sonidos que te gusten para obtener el resultado que deseas.

Buenos sonidos

Para encontrar buenos sonidos en su sistema, puede intentar:

for i in /usr/share/sounds/*/stereo/*; do echo $i; paplay $i; sleep 1; done

Estos son algunos sonidos que utilizo a menudo que están disponibles en Ubuntu de manera predeterminada, que son buenos para las notificaciones: sn1 es fuerte y agradable, sn2 es muy fuerte y sigue siendo bastante agradable, sn3 es extremadamente fuerte 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
}

De nuevo, puedes cambiar sound a soundbg si quieres jugarlo en segundo plano sin esperar a que el sonido termine (por ejemplo, para no ralentizar tus scripts cuando tocas muchos sonidos).

Versión silenciosa

Y por las dudas, aquí está la misma función que 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
}

Uso

Así es como lo usa:

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 parecidos a:

make && make test && make install; oks

pero utilicé ls para que pudieras ver rápidamente cómo funciona.

Puede usar ok en 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 reproduce el mismo sonido, etc.

Actualizar

Puse esas funciones en GitHub, mira:

La fuente se puede descargar desde:

Actualización 2

Agregué una función soundloop 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 funcionara pero no lo hace) como lo pide shadi en los comentarios. Se implementa como:

soundloop() {
  set +m
  a='date +%s'
  { paplay  & } 2>/dev/null
  wait
  b='date +%s'
  d=$(($b-$a))
  [ $d -eq 0 ] && d=1
  while :; do
    pacmd play-file  0 >/dev/null
    sleep $d
  done
}

Si crees que es complicado, dirige tus quejas a los desarrolladores de PulseAudio.

    
respondido por el rsp 01.04.2015 - 19:24
6

Ampliando la respuesta de Michael Curries, podrías hacer que Bash imprima un carácter BEL ( \a ) a través de PROMPT_COMMAND :

PROMPT_COMMAND='printf \a'

Configurando PROMPT_COMMAND de esta forma hará que Bash ejecute printf \a al final de cada comando, lo que hará que el terminal reproduzca un sonido (aunque como señala muru, simplemente activando el redibujado del indicador hará que el terminal toque el sonido, es decir, el sonido se reproducirá cada vez que se emita un nuevo aviso, por ejemplo, incluso cuando se acaba de presionar 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 ).

    
respondido por el kos 06.03.2016 - 20:25
3

El comando

 speaker-test

hace un sonido de ruido. La solución más simple pero molesta. : -)

Consulte el manual de speaker-test(1) para ver las opciones para configurar el señal de ruido.

    
respondido por el xerostomus 01.11.2015 - 08:01
1
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.

* Necesita gnustep-gui-runtime -

sudo apt-get install gnustep-gui-runtime

Saludos.

    
respondido por el AlikElzin-kilaka 23.05.2016 - 11:23
1

Esto no es lo que pediste, pero podrías usar la notificación para eso.

Reemplace el comando dado en las otras respuestas con

notify-send "Process terminated" "Come back to the terminal, the task is over"
    
respondido por el solsTiCe 30.03.2018 - 14:07
0

Creé un script simple y casi nativo que reproduce sonido y muestra una notificación con un mensaje determinado y tiempo 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=""
TIME=""

# 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

¿Cómo usar?

Primera ejecución - Configuración:

  1. Crea un nuevo Directorio en tu hogar y llámalo noti

    mkdir ~/noti
    
  2. Descargue noti.sh y extráigalo al% co_de anterior % dir.

  3. Abrir terminal y cambiar directorio a noti

    cd ~/noti
    
  4. Hacer ejecutable a noti.sh emitiendo:

    sudo chmod +x noti.sh
    
  5. Ejecute una prueba como esta:

    sh ~/noti/noti.sh "Test" "now"
    

Ejemplos

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"

Para notificar el final del proceso (ejemplo)

sudo apt-get update; noti "Done" "now"
    
respondido por el Yahya 10.07.2018 - 14:02

Lea otras preguntas en las etiquetas