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.
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.
Risposte:
Esistono almeno tre modi per eseguire questa operazione inserendo il comando adatto alla fine dello script che è possibile richiamare per il lungo processo:
Il modo "classico" di riprodurre un suono consiste nell'utilizzare un segnale acustico 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.conf
e caricare il pcspkr
modulo del kernel.
sudo sed -i 's/blacklist pcspkr/#blacklist pcspkr/g' /etc/modprobe.d/blacklist.conf
sudo modprobe pcspkr
beep [optional parameters]
Possiamo anche riprodurre qualsiasi file audio in formato wav usando aplay (installato per impostazione predefinita):
aplay /usr/share/sounds/alsa/Side_Right.wav
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 o in alternativa utilizzare spd-say "Text"
.
spd-say
.
spd-say
utility è installata di default e funziona sul mio sistema.
paplay /usr/share/sounds/freedesktop/stereo/complete.oga
Io uso
make; spd-say done
Sostituisci "make" con qualsiasi comando di lunga durata che usi.
spd-say 'get back to work
'. E viene anche preinstallato: release.ubuntu.com/trusty/… , per i non vedenti suppongo? E -w
per loop infiniti: while true; do spd-say -w 'get back to work you lazy bum'; done
.
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:
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 oks
che 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.
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
}
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
Cambia sound_ok
e sound_error
ad altri suoni.
Puoi sperimentare sound
vs. soundbg
e cambiare sound_ok
e sound_error
usare sequenze di molti suoni che ti piacciono per ottenere il risultato che desideri.
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 sound
a soundbg
se si desidera riprodurlo in background senza attendere il completamento del suono (ad es. Per non rallentare gli script quando si riproducono molti suoni).
E per ogni evenienza, ecco la stessa funzione 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
}
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 ls
modo da poter vedere rapidamente come funziona.
Puoi usare ok
invece che oks
per 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.
Metto quelle funzioni su GitHub, vedi:
La fonte può essere scaricata da:
Ho aggiunto una soundloop
funzione al repository sopra. 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 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.
while true; do paplay ...; done
modo 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 paplay
per capire come farlo funzionare. Qualche idea?
In base a ciò, il \a
carattere 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.
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_COMMAND
questo modo farà eseguire Bash printf \\a
alla 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-terminal
e xterm
).
Il comando
speaker-test
emette un suono. Soluzione più semplice ma fastidiosa. :-)
Guarda il manuale dispeaker-test(1)
per le opzioni per configurare il segnale di rumore.
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.
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
Crea una nuova directory a casa tua e chiamala noti
mkdir ~/noti
Scarica noti.sh ed estrailo nella directory sopra noti
.
Apri Terminale e cambia directory in noti
cd ~/noti
Rendere eseguibile noti.sh emettendo:
sudo chmod +x noti.sh
Esegui un test come questo:
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 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.