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


94

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.


¿Puede explicar más a qué se refiere con el proceso completo ?
Lucio

1
El control de @Lucio regresa a la terminal
Goaler444

1
¿Quieres decir, abrir una aplicación desde la terminal y cuando termine, emitir un sonido? ¿Tienes un servidor Ubuntu o te refieres al software GUI?
Lucio

2
sí exactamente. Por ejemplo, inicio un programa de línea de comandos, y una vez que sale y el control vuelve al terminal, se emite un sonido. Actualmente estoy usando Ubuntu 12.10
Goaler444

Respuestas:


78

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:

  1. La forma "clásica" de reproducir un sonido es usar un pitido a Instalar pitido 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.confy cargar el pcspkrmódulo del 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 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 Instalar espeak , o alternativamente usar spd-say "Text".


1
@Takkat Estoy usando Ubuntu 12.10 y espeak no está instalado actualmente.
Lucio

@Lucio: sí, ahora que lo dices ... Cambiaron al hablador. Si esto funciona (no funciona en mi sistema) vea editar para usar spd-say.
Takkat

@Takkat La spd-sayutilidad está instalada por defecto y funciona en mi sistema.
Lucio

También eche un vistazo a este Q / A
c0rp

1
Tenía buen éxito conpaplay /usr/share/sounds/freedesktop/stereo/complete.oga
Nicholas DiPiazza

73

yo suelo

make; spd-say done

Reemplace "make" con cualquier comando de larga duración que utilice.


¡¡Usted acaba de hacer mi día!! : D
n0noob

55
spd-say 'get back to work'. Y también viene preinstalado: releases.ubuntu.com/trusty/… , para personas ciegas, supongo. Y -wpara los bucles infinitos: while true; do spd-say -w 'get back to work you lazy bum'; done.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Me reí mucho más fuerte de lo que debería haberlo hecho.
NelsonGon

15

TL; DR

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

long-running-command; sn3

(donde sn3está 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:

Sonido diferente en caso de error y éxito.

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 oksque 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.

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

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

Configuración

Cambio sound_oky sound_erroralgunos otros sonidos.

Puede experimentar con soundvs soundbgy cambiar sound_oky sound_errorusar secuencias de muchos sonidos que le gusten para obtener el resultado que desea.

Buenos sonidos

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 sounda soundbgsi desea reproducirlo en segundo plano sin esperar a que termine el sonido (por ejemplo, para no ralentizar sus guiones cuando reproduce muchos sonidos).

Versión silenciosa

Y por si acaso, aquí está la misma función okspero 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 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é lspara que pudieras ver rápidamente cómo funciona.

Puede usar en oklugar de okspara 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.

Actualizar

Puse esas funciones en GitHub, mira:

La fuente se puede descargar desde:

Actualización 2

Agregué una soundloopfunció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; doneque 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.


Traté de poner esto while true; do paplay ...; donepara 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 paplaypara descubrir cómo hacer que esto funcione. ¿Algunas ideas?
shadi

@shadi Vea mi respuesta actualizada para una solución con un sonido que se repite hasta que presione Ctrl + C.
rsp

14

De acuerdo con esto, el \apersonaje 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.


3
¡asombroso! esa es la mejor y más fácil solución (al menos para mí) porque no requiere instalar ninguna aplicación de terceros e incluso puede escribirse / pegarse en el medio del proceso para ejecutarse después de que el símbolo del sistema se centre.
hlopetz

2
el sonido de este personaje está deshabilitado en la mayoría de los terminales modernos de forma predeterminada
phil294

6

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_COMMANDesa manera, Bash se ejecutará printf \\aal 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-terminaly xterm).


55
(con la advertencia de que cada vez que presione Entrar, obtendrá un sonido)
muru


2

Esto no es lo que pediste, pero puedes usar una 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"

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.

* Necesidades gnustep-gui-runtime-

sudo apt-get install gnustep-gui-runtime

Salud.


0

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

¿Cómo utilizar?

Primera ejecución - Configuración:

  1. Cree un nuevo directorio en su hogar y llámelo noti

    mkdir ~/noti
    
  2. Descargue noti.sh y extráigalo al notidirectorio anterior .

  3. Abra la Terminal y cambie el directorio a noti

    cd ~/noti
    
  4. Haga que noti.sh sea ejecutable 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"

0

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.