Come faccio a emettere un segnale acustico per gli altoparlanti del mio PC


173

Utilizzando bash, come posso emettere un segnale acustico per l'altoparlante del PC?

Qualcosa del genere echo 'beepsound' > /dev/pcspkrsarebbe carino.



Risposte:


124

Di solito uso la piccola utility beepinstallata su molti sistemi. Questo comando proverà approcci diversi per creare un suono di sistema.

Esistono 3 modi per creare un suono dalla beepmanpage:

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

  2. Esistono altri modi per causare un segnale acustico. Un metodo leggermente più affidabile è quello di aprire /dev/ttye 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.

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


9
La homepage del beepcomando è: johnath.com/beep Su Ubuntu / Debian, è possibile installarlo con apt-get install beep.
Riccardo Murri,

14
Su Linux, esiste un quarto metodo di bip per il segnale acustico: scarica il pcspkrmodulo, carica il snd-pcspe 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
segnali

8
@isomorphismes: pcspkre snd-pcspsono moduli, non pacchetti. usa modprobe/ modprobe -r/ lsmodper manipolarli. Per tua informazione, sono nel linux-image-somethingpacchetto, che si spera sia già installato (altrimenti non avresti il ​​kernel Linux).
BatchyX,

3
il bip di solito funziona fuori dagli schemi per debian ma ho bisogno di caricare il modulo per farlo funzionare su Ubuntu
mchid,

4
Come ha detto mchid, dopo aver aggiunto il modulo: il modprobe snd-pcspsegnale acustico ora funziona!
lepe

74

Eco semplicemente \ao \07funziona per me.

$ echo -e "\a"

Ciò richiederà probabilmente il pcspkrcaricamento del modulo kernel. L'ho provato solo su RHEL, quindi YMMV.

AGGIORNARE

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

5
Se stai usando un terminale X o SSH nella macchina, questo potrebbe far lampeggiare il terminale, poiché molti programmi di tipo xterm / vt100 sono configurati per farlo per i caratteri BEL.
Warren Young,

2
Questo ha senso, ma non ha funzionato per me su Ubuntu 12.04.
isomorfismi

2
@isomorfismi: è per console, non per terminali X11. Per i segnali acustici con X, puoi provare questo: askubuntu.com/a/587311/11015
MestreLion

1
@isomorphismes: sto anche usando Ubuntu 12.04, e per me è sudo modprobe pcspkrstato sufficiente per abilitare i segnali acustici sotto il VT, tramite printf "\a"o tramite beeputility.
MestreLion,

3
Nessuno dei metodi funziona per me. Ubuntu 16.04.1 LTS
ar2015,

68

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 .


1
La tua funzione di one-liner (e compatibile Ctrl-C):timeout ${2} speaker-test --frequency ${1} --test sine
user569825

1
Non è necessario salvare Pid, 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.
erm3nda,

Ahi, fa male.
Shadi

28
tput bel

perché terminfo definisce belcome

           Variable                       Cap-               TCap                  Description
            String                        name               Code

   bell                                   bel                bl                audible signal
                                                                               (bell) (P)

17

Per utilizzare la scheda audio se soxinstallata 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.


2
+1 Non sapevo che il gioco avesse questa funzione. Ho finito per usarlo in un thenblocco all'interno watchper avvisarmi una volta soddisfatta una certa condizione. Mi permette persino di tenere le cuffie accese. Questo mi è stato molto utile.
andyortlieb,

Da un gioco bash sh probabilmente avrà bisognosudo -u USER play...
intika,

Sul mio sistema, playutilizza pulseaudio, come utente. Immagino che dipenda dalla configurazione del sistema.
Alexander,

13

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 beepin 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

Mi piace che le mie domande rimangano distro-agnostiche, echo -e "\007"funzionerebbero in bash anziché print "\007in perl?
Stefan,

1
@Stefan - Beep è praticamente "universale". Tuttavia, è possibile rimanere indipendenti dalla distro usando 'echo -e "\ a"' o 'echo -e "\ 07"'. Saluti!
wormintrude,

2
Sarebbe più portatile da usare printf '\007'invece di echo.
Dennis Williamson,


2

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/consoleper un segnale acustico immediato.)


1

Su Linux, strumenti come beeppossono utilizzare uno ioctl sul dispositivo console per emettere un determinato suono. Per essere più specifici, beeputilizzerà lo KIOCSOUNDioctl, ma esiste anche uno KDMKTONEioctl 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_ioctlpagina man (4) per i dettagli.

Quindi, se non sei soddisfatto di ciò che beepfa, 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.


-1

In un terminale, premere Ctrl+ Ge quindiEnter


1
Nel mio terminale (gnome-terminal), funziona senza Enter. Proprio come un test di altoparlanti per PC, questo mi sembra perfetto. Tuttavia è assolutamente inutile negli script.
Palec,

Downvotes sorprendenti. Questo funziona su alcuni PC, tuttavia potrebbe non funzionare su tutti.
Zzzach ...

Non funziona su rxvt, urxvt, xterm, lxterm o lxterminal, il mio terminale non dovrebbe almeno lampeggiare se ha una campana visiva?
Willem,

Funziona su xterm
Chris
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.