Come emettere un suono una volta completato un processo?


94

Ho iniziato un lungo processo attraverso un terminale. È possibile far emettere un suono al terminale Ubuntu una volta completato il processo? In questo modo, non ho bisogno di continuare a controllare, ma verrà invece notificato tramite un suono.


Puoi spiegare ulteriormente cosa intendi con processo completo ?
Lucio,

1
Il controllo @Lucio viene restituito al terminale
Goaler444

1
Vuoi dire, apri un'applicazione dal terminale e quando finisce, emetti un suono? Hai un server Ubuntu o intendi software GUI?
Lucio,

2
si, esattamente. Ad esempio, avvio un programma da riga di comando e, una volta uscito e il controllo viene restituito al terminale, viene emesso un suono. Attualmente sto usando Ubuntu 12.10
Goaler444

Risposte:


78

Esistono almeno tre modi per eseguire questa operazione inserendo il comando adatto alla fine dello script che è possibile richiamare per il lungo processo:

  1. Il modo "classico" di riprodurre un suono consiste nell'utilizzare un segnale acustico Installa bip attraverso gli altoparlanti del PC. Tuttavia, questo non funzionerà in tutti i casi (ad es. Nel mio sistema gli altoparlanti del PC sono completamente disabilitati) e dovrai rimuovere pscpkr /etc/modprobe/blacklist.confe caricare il pcspkrmodulo del kernel.

    sudo sed -i 's/blacklist pcspkr/#blacklist pcspkr/g' /etc/modprobe.d/blacklist.conf
    sudo modprobe pcspkr
    beep [optional parameters]
    
  2. Possiamo anche riprodurre qualsiasi file audio in formato wav usando aplay (installato per impostazione predefinita):

    aplay /usr/share/sounds/alsa/Side_Right.wav
    
  3. Un altro modo è utilizzare l'interfaccia della riga di comando pulseaudio per abilitare la riproduzione di tutti i file audio che il sistema (in libsndfile) riconosce sull'uscita audio predefinita:

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

    Siamo in grado di utilizzare file audio predefiniti /usr/share/sounds/o qualsiasi altro file audio in una posizione diversa.


Solo per averlo menzionato, c'è un altro bel modo per raggiungere questo obiettivo usando l' abuso di espeak , che è installato di default in Ubuntu <= 12.04. Vedi, o meglio, ascolta il seguente esempio:

#! /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"

In Ubuntu> = 12.10 Orca usa speak-dispatcher. Possiamo quindi installare espeak Installa espeak o in alternativa utilizzare spd-say "Text".


1
@Takkat Sto usando Ubuntu 12.10 e attualmente espeak non è installato.
Lucio,

@Lucio: sì, ora che lo dici ... Sono passati al talk-dispatcher. Se funziona (non funziona sul mio sistema) vedi modifica per l'utilizzo spd-say.
Takkat,

@Takkat L' spd-sayutility è installata di default e funziona sul mio sistema.
Lucio,

Dai

1
Ho avuto un buon successo conpaplay /usr/share/sounds/freedesktop/stereo/complete.oga
Nicholas DiPiazza l'


15

TL; DR

Per riprodurre un suono al termine del comando:

long-running-command; sn3

(dove sn3è il numero audio 3) inseriscilo in .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 leggi di seguito per ulteriori opzioni:

Suono diverso in caso di errore e successo

Ecco cosa uso esattamente per quello che mi chiedi, con una differenza: non solo riproduce un suono al termine del comando, ma riproduce un suono diverso in caso di successo e di errore. (Ma puoi cambiarlo se non ti piace.)

Ho una funzione Bash chiamata oksche uso alla fine di comandi a esecuzione prolungata:

make && make test && make install; oks

Riproduce un suono e visualizza OK o ERRORE (con codice di errore) al termine del comando precedente.

Codice sorgente

Ecco quella funzione con due aiutanti:

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
}

Installazione

Puoi inserirlo direttamente nel tuo ~ / .bashrc o inserirlo in qualche altro file e quindi inserire questa riga nel tuo ~ / .bashrc:

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

Configurazione

Cambia sound_oke sound_errorad altri suoni.

Puoi sperimentare soundvs. soundbge cambiare sound_oke sound_errorusare sequenze di molti suoni che ti piacciono per ottenere il risultato che desideri.

Buoni suoni

Per trovare dei buoni suoni sul tuo sistema puoi provare:

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

Ecco alcuni suoni che uso spesso che sono disponibili su Ubuntu di default che sono buoni per le notifiche - sn1 è forte e bello, sn2 è molto forte e ancora abbastanza bello, sn3 è estremamente forte e non così bello:

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
}

Ancora una volta, è possibile passare sounda soundbgse si desidera riprodurlo in background senza attendere il completamento del suono (ad es. Per non rallentare gli script quando si riproducono molti suoni).

Versione silenziosa

E per ogni evenienza, ecco la stessa funzione oksma senza suoni:

ok() {
  # prints OK or ERROR and exit status of previous command
  s=$?
  if [[ $s = 0 ]]; then
    echo OK
  else
    echo ERROR: $s
  fi
}

uso

Ecco come lo usi:

Esempio con successo:

ls / && ls /bin && ls /usr; oks

esempio con errore:

ls / && ls /bim && ls /usr; oks

Naturalmente in pratica i comandi sono più simili a:

make && make test && make install; oks

ma l'ho usato in lsmodo da poter vedere rapidamente come funziona.

Puoi usare okinvece che oksper una versione silenziosa.

Oppure puoi usare ad esempio:

ls / && ls /bim && ls /usr; ok; sn1

per stampare OK / ERRORE ma riprodurre sempre lo stesso suono, ecc.

Aggiornare

Metto quelle funzioni su GitHub, vedi:

La fonte può essere scaricata da:

Aggiornamento 2

Ho aggiunto una soundloopfunzione al repository sopra. Riproduce un suono e può essere interrotto da Ctrl + C (a differenza di un semplice while true; do paplay file.ogg; doneche ci si aspetterebbe di lavorare ma non lo fa) come richiesto da Shadi nei commenti. È implementato come:

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
}

Se ritieni che sia complicato, invia i tuoi reclami agli sviluppatori PulseAudio.


Ho provato a inserirlo in while true; do paplay ...; donemodo che il suono si ripeta fino a quando non lo colpisco Ctrl+C, ma quando lo faccio, non si interrompe. Non riesco a trovare alcuna opzione speciale man paplayper capire come farlo funzionare. Qualche idea?
Shadi,

@shadi Vedi la mia risposta aggiornata per una soluzione con un suono che si ripete finché non premi Ctrl + C.
rsp

14

In base a ciò, il \acarattere sfugge al codice ASCII 7, che è il segnale acustico del computer.

Quindi echo $'\a'funziona per emettere un segnale acustico sul mio computer locale, anche quando viene eseguito su una shell bash in esecuzione su un computer a cui sono collegato tramite un'interfaccia terminale come PuTTY.


3
sorprendente! questa è la soluzione più semplice e migliore (almeno per me) perché non richiede l'installazione di app di terze parti e può anche essere digitata / incollata nel mezzo del processo per essere eseguita dopo che il prompt dei comandi sarà attivo.
hlopetz,

2
il suono di questo personaggio è disabilitato nella maggior parte dei terminali moderni per impostazione predefinita
phil294

6

Espandendo la risposta di Michael Curries, puoi fare in modo che Bash stampi un carattere BEL( \a) attraverso PROMPT_COMMAND:

PROMPT_COMMAND='printf \\a'

L'impostazione in PROMPT_COMMANDquesto modo farà eseguire Bash printf \\aalla fine di ogni comando, il che farà suonare un suono al terminale (anche se, come indicato da Muru, semplicemente facendo scattare il ridisegno del prompt farà suonare il suono al terminale, cioè il suono verrà riprodotto ogni volta che viene disegnato un nuovo prompt, ad esempio anche solo premendo ENTER).

Questa è una funzione terminale, quindi potrebbe non funzionare su tutti i terminali; ad esempio non funziona nella console (ma sono sicuro che funzioni in gnome-terminale xterm).


5
(con l'avvertenza che ogni volta che premi Invio, otterrai un suono)
muru


2

Non è quello che hai chiesto, ma potresti utilizzare la notifica per questo.

Sostituisci il comando indicato nelle altre risposte con

notify-send "Process terminated" "Come back to the terminal, the task is over"

1
command && (say done ; echo done) || (echo error ; say error)

Esempio 1: echo alik && (say done ; echo done) || (echo error ; say error)si tradurrà in una parola fatta.

Esempio 2: non_existing_command_error && (say done ; echo done) || (echo error ; say error)genererà una parola di errore.

* Necessità gnustep-gui-runtime-

sudo apt-get install gnustep-gui-runtime

Saluti.


0

Ho creato uno script semplice e quasi nativo che riproduce suoni e visualizza una notifica con un determinato messaggio e tempo per 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

Come usare?

Prima esecuzione - Installazione:

  1. Crea una nuova directory a casa tua e chiamala noti

    mkdir ~/noti
    
  2. Scarica noti.sh ed estrailo nella directory sopra noti.

  3. Apri Terminale e cambia directory in noti

    cd ~/noti
    
  4. Rendere eseguibile noti.sh emettendo:

    sudo chmod +x noti.sh
    
  5. Esegui un test come questo:

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

Esempi

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"

Per notificare la fine del processo (esempio)

sudo apt-get update; noti "Done" "now"

0

onda sinusoidale ffmpeg

Per i minimalisti là fuori, puoi suonare un seno di 1000 Hz per 5 secondi:

sudo apt-get install ffmpeg
ffplay -f lavfi -i "sine=frequency=1000:duration=5" -autoexit -nodisp

o per sempre finché non fai Ctrl-C:

ffplay -f lavfi -i "sine=frequency=1000" -nodisp

Maggiori informazioni su: https://stackoverflow.com/questions/5109038/linux-sine-wave-audio-generator/57610684#57610684

Testato in Ubuntu 18.04, ffmpeg 3.4.6.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.