Utilizzando bash, come posso emettere un segnale acustico per l'altoparlante del PC?
Qualcosa del genere echo 'beepsound' > /dev/pcspkr
sarebbe carino.
Utilizzando bash, come posso emettere un segnale acustico per l'altoparlante del PC?
Qualcosa del genere echo 'beepsound' > /dev/pcspkr
sarebbe carino.
Risposte:
Di solito uso la piccola utility beep
installata su molti sistemi. Questo comando proverà approcci diversi per creare un suono di sistema.
Esistono 3 modi per creare un suono dalla beep
manpage:
Il metodo tradizionale per produrre un segnale acustico in uno script di shell è scrivere un carattere ASCII BEL
( \007
) nell'output standard, mediante un comando di shell come
echo -ne '\007'
Funziona solo se l'output standard della shell chiamante è attualmente diretto a un dispositivo terminale di qualche tipo; in caso contrario, il segnale acustico non produrrà alcun suono e potrebbe persino causare la corruzione indesiderata in qualsiasi file a cui è diretto l'output.
Esistono altri modi per causare un segnale acustico. Un metodo leggermente più affidabile è quello di aprire /dev/tty
e inviare lì il tuo personaggio BEL. Ciò è efficace contro il reindirizzamento I / O, ma non riesce comunque nel caso in cui lo script della shell che desidera generare un segnale acustico non abbia un terminale di controllo, ad esempio perché viene eseguito da un X Window Manager.
Un terzo approccio è quello di connettersi al display X e inviargli un comando a campana. Ciò non dipende da un dispositivo terminale Unix, ma richiede (ovviamente) un display X.
beep
proverò semplicemente questi 3 metodi.
beep
comando è: johnath.com/beep Su Ubuntu / Debian, è possibile installarlo con apt-get install beep
.
pcspkr
modulo, carica il snd-pcsp
e ora hai una scheda audio alsa che usa i trucchi della vecchia scuola per inviare effettivamente l'audio digitale all'altoparlante interno. Dà risultati scadenti con gli altoparlanti interni piezoelettrici, ma sugli altoparlanti interni classici, la qualità è abbastanza buona per quello che è. In questo modo, puoi diventare molto più creativo per i tuoi
pcspkr
e snd-pcsp
sono moduli, non pacchetti. usa modprobe
/ modprobe -r
/ lsmod
per manipolarli. Per tua informazione, sono nel linux-image-something
pacchetto, che si spera sia già installato (altrimenti non avresti il kernel Linux).
modprobe snd-pcsp
segnale acustico ora funziona!
Eco semplicemente \a
o \07
funziona per me.
$ echo -e "\a"
Ciò richiederà probabilmente il pcspkr
caricamento del modulo kernel. L'ho provato solo su RHEL, quindi YMMV.
Come sottolineato da Warren nei commenti, questo potrebbe non funzionare quando si effettua l'accesso in remoto tramite SSH. Una soluzione alternativa sarebbe quella di reindirizzare l'output a uno qualsiasi dei dispositivi TTY (idealmente uno che non viene utilizzato). Per esempio:
$ echo -en "\a" > /dev/tty5
sudo modprobe pcspkr
stato sufficiente per abilitare i segnali acustici sotto il VT, tramite printf "\a"
o tramite beep
utility.
Ubuntu 16.04.1 LTS
NOTA: questa soluzione emette segnali acustici dagli altoparlanti , non dalla scheda madre .
ALSA viene fornito con speaker-test , un generatore di toni di test degli altoparlanti della riga di comando, che può essere utilizzato per generare un segnale acustico:
$ speaker-test -t sine -f 1000 -l 1
Vedi questo thread del forum di arch linux .
Tuttavia, la durata del segnale acustico sarà arbitraria, ma può essere controllata come segue:
$ ( speaker-test -t sine -f 1000 )& pid=$! ; sleep 0.1s ; kill -9 $pid
Possiamo fare un ulteriore passo avanti ed emettere un segnale acustico con questa funzione:
_alarm() {
( \speaker-test --frequency $1 --test sine )&
pid=$!
\sleep 0.${2}s
\kill -9 $pid
}
che viene chiamato con argomenti di frequenza e durata:
$ _alarm 400 200
Con questo in mente, è possibile creare musica semplice con speaker-test
. Vedi questo script della shell .
timeout ${2} speaker-test --frequency ${1} --test sine
speaker-test -t sine -f 1000 -l 1 & sleep .2 && kill -9 $!
fa solo la stessa cosa. Ad ogni modo, il metodo di @ user569825 è più bello.
tput bel
perché terminfo definisce bel
come
Variable Cap- TCap Description
String name Code
bell bel bl audible signal
(bell) (P)
Per utilizzare la scheda audio se sox
installata e l'altoparlante del PC in caso contrario:
$ play -q -n synth 0.1 sin 880 || echo -e "\a"
sox
è disponibile per la maggior parte delle distro.
then
blocco all'interno watch
per avvisarmi una volta soddisfatta una certa condizione. Mi permette persino di tenere le cuffie accese. Questo mi è stato molto utile.
sudo -u USER play...
play
utilizza pulseaudio, come utente. Immagino che dipenda dalla configurazione del sistema.
Alcune distro hanno utilità da riga di comando per raggiungere questo obiettivo. Forse potresti dirci su quale distro sei, o cercare (ad esempio emerge -s beep
in Gentoo).
Andando oltre le utility "disponibili", potresti anche creare uno script Perl che emette un segnale acustico, tutto ciò che devi fare è includere:
<SomeCodeBefore>
print "\007";
<SomeCodeAfter>
Se si ottiene "bip", provare quanto segue:
#! /bin/sh
beep -f 500 -l 700
beep -f 480 -l 400
beep -f 470 -l 250
beep -f 530 -l 300 -D 100
beep -f 500 -l 300 -D 100
beep -f 500 -l 300
beep -f 400 -l 600
beep -f 300 -l 500
beep -f 350 -l 700
beep -f 250 -l 600
echo -e "\007"
funzionerebbero in bash anziché print "\007
in perl?
printf '\007'
invece di echo
.
"Il segnale acustico funziona solo se il tuo PC ha un" altoparlante ". Molti laptop moderni / piccoli dispositivi non ne hanno uno." - tredegar .
Prova invece a riprodurre un suono:
$ play xxxxx.wav
Ha funzionato per me, quando tutto il resto ha fallito.
Provare
echo -n Ctrl+ V Ctrl+G
Il rovescio della medaglia è che questo funzionerà solo quando il dispositivo di output è un terminale, quindi potrebbe non funzionare all'interno di un processo cron, ad esempio. (Ma se sei root potresti essere in grado di reindirizzare /dev/console
per un segnale acustico immediato.)
Su Linux, strumenti come beep
possono utilizzare uno ioctl sul dispositivo console per emettere un determinato suono. Per essere più specifici, beep
utilizzerà lo KIOCSOUND
ioctl, ma esiste anche uno KDMKTONE
ioctl che può essere usato per generare suono.
A quanto ho capito, il primo avvia un suono che dura fino a quando non viene esplicitamente annullato, mentre il secondo crea un segnale acustico di durata predeterminata. Vedi la console_ioctl
pagina man (4) per i dettagli.
Quindi, se non sei soddisfatto di ciò che beep
fa, potresti scrivere alcune righe di codice per accedere direttamente a questi ioctls. Supponendo che tu abbia pieno accesso a /dev/console
, che potrebbe richiedere privilegi di root.
In un terminale, premere Ctrl+ Ge quindiEnter