Come emettere un suono una volta completato un processo?

75

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

    
posta Goaler444 02.04.2013 - 20:16

9 risposte

68

Ci sono almeno tre modi per eseguire questa operazione inserendo il comando di adattamento alla fine dello script che potresti invocare per il tuo lungo processo:

  1. Il modo "classico" di riprodurre un suono è usare bip attraverso gli altoparlanti del PC. Tuttavia questo non funzionerà in tutti i casi (ad esempio nel mio sistema gli altoparlanti del PC sono completamente disabilitati) e dovrai rimuovere pscpkr da /etc/modprobe/blacklist.conf e caricare il modulo del kernel pcspkr .

    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 di default):

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

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

    Possiamo utilizzare i file audio predefiniti da /usr/share/sounds/ o qualsiasi altro file audio che potremmo avere in una posizione diversa.

Solo per averlo menzionato, c'è un altro bel modo per ottenere questo risultato usando in modo improprio espeak , che è installato di default in Ubuntu & lt; = 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 & gt; = 12,10 Orca usa il dispatcher. Possiamo quindi installare espeak , o in alternativa usa spd-say "Text" .

    
risposta data Takkat 02.04.2013 - 20:40
60

Io uso

make; spd-say done

Sostituisci "make" con qualsiasi comando di lunga durata che usi.

    
risposta data Memetic 20.02.2015 - 00:58
11

Secondo questo il carattere \a sfugge al codice ASCII 7, che è il segnale acustico del computer.

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

    
risposta data Michael Currie 13.09.2015 - 21:39
11

TL; DR

Per riprodurre un suono al termine del comando:

long-running-command; sn3

(dove sn3 è il suono numero 3) metti questo in .bashrc :

sound() {
  # plays sounds in sequence and waits for them to finish
  for s in [email protected]; 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
}

Oppure leggi sotto per ulteriori opzioni:

Suono diverso in caso di errore e successo

Ecco quello che uso esattamente per quello che chiedi - con una differenza: non solo riproduce un suono quando il comando finisce ma riproduce un suono diverso in caso di successo e in caso di errore. (Ma puoi cambiarlo se non ti piace.)

Ho una funzione di Bash chiamata oks che uso alla fine dei comandi long running:

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 la funzione con due helper:

sound() {
  # plays sounds in sequence and waits for them to finish
  for s in [email protected]; do
    paplay $s
  done
}
soundbg() {
  # plays all sounds at the same time in the background
  for s in [email protected]; 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 metterlo nella tua ~ / .bashrc direttamente o metterlo in qualche altro file e poi mettere questa linea in ~ / .bashrc:

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

Configurazione

Cambia sound_ok e sound_error con altri suoni.

Puoi sperimentare con sound rispetto a soundbg e modificare sound_ok e sound_error per utilizzare sequenze di molti suoni che ti piacciono per ottenere il risultato che desideri.

Suoni buoni

Per trovare alcuni suoni buoni 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 rumoroso e comunque molto carino, sn3 è estremamente rumoroso 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, puoi cambiare sound in soundbg se vuoi giocare in background senza aspettare che il suono finisca (ad esempio per non rallentare gli script quando suoni un sacco di suoni).

Versione silenziosa

E nel caso in cui - qui c'è la stessa funzione di oks ma 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

Ovviamente nella pratica i comandi sono più simili a:

make && make test && make install; oks

ma ho usato ls in modo da poter vedere rapidamente come funziona.

Puoi utilizzare ok anziché oks per una versione invisibile.

Oppure puoi utilizzare ad esempio:

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

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

Aggiornamento

Metto queste funzioni su GitHub, vedi:

La fonte può essere scaricata da:

Aggiornamento 2

Ho aggiunto una funzione soundloop al repository precedente. Riproduce un suono e può essere interrotto da Ctrl + C (a differenza di un semplice while true; do paplay file.ogg; done che ci si aspetterebbe di funzionare ma non lo fa) come richiesto da shadi nei commenti. È implementato come:

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
}

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

    
risposta data rsp 01.04.2015 - 21:24
6

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

PROMPT_COMMAND='printf \a'

Impostando PROMPT_COMMAND in questo modo, Bash eseguirà printf \a alla fine di ogni comando, il che farà suonare il terminale da un terminale (sebbene come indicato da muru, semplicemente attivando il ridisegno del prompt farà in modo che il terminale riproduca il suono, ovvero il suono verrà riprodotto ogni volta che viene richiamato un nuovo prompt, ad esempio anche quando si preme ENTER ).

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

    
risposta data kos 06.03.2016 - 21:25
2

Il comando

 speaker-test

fa un rumore. La soluzione più semplice ma fastidiosa. : -)

Guarda il manuale di speaker-test(1) per le opzioni per configurare il segnale di rumore.

    
risposta data xerostomus 01.11.2015 - 09:01
1
command && (say done ; echo done) || (echo error ; say error)

Esempio 1: echo alik && (say done ; echo done) || (echo error ; say error) darà come risultato una parola.

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

* Richiede gnustep-gui-runtime -

sudo apt-get install gnustep-gui-runtime

Saluti.

    
risposta data AlikElzin-kilaka 23.05.2016 - 13:23
1

Questo non è quello che hai chiesto, ma puoi usare 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"
    
risposta data solsTiCe 30.03.2018 - 16:07
0

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

Come usare?

Prima esecuzione - Impostazione:

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

    mkdir ~/noti
    
  2. Scarica noti.sh ed estrailo alla precedente noti dir.

  3. Apri Terminale e Cambia directory in noti

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

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

    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 la notifica del completamento del processo (esempio)

sudo apt-get update; noti "Done" "now"
    
risposta data Yahya 10.07.2018 - 16:02

Leggi altre domande sui tag