¿Cómo hago que el altavoz de mi PC emita un pitido?


173

Respuestas:


124

Usualmente uso la pequeña utilidad beepinstalada en muchos sistemas. Este comando intentará diferentes enfoques para crear un sonido de sistema.

Hay 3 formas de crear un sonido desde la página de beepmanual:

  1. El método tradicional de producir un pitido en un script de shell es escribir un carácter ASCII BEL( \007) en la salida estándar, mediante un comando de shell como

    echo -ne '\007'
    

    Esto solo funciona si la salida estándar del shell de llamada se dirige actualmente a un dispositivo terminal de algún tipo; de lo contrario, el pitido no producirá ningún sonido e incluso podría causar daños no deseados en cualquier archivo al que se dirija la salida.

  2. Hay otras formas de provocar un pitido. Un método un poco más confiable es abrir /dev/ttyy enviar su personaje BEL allí. Esto es robusto contra la redirección de E / S, pero aún falla en el caso en que el script de shell que desea generar un pitido no tiene un terminal de control, por ejemplo, porque se ejecuta desde un administrador de ventanas X.

  3. Un tercer enfoque es conectarse a su pantalla X y enviarle un comando de campana. Esto no depende de un dispositivo terminal Unix, pero sí (por supuesto) requiere una pantalla X.

beep simplemente intentará estos 3 métodos.


99
La página de inicio del beepcomando es: johnath.com/beep En Ubuntu / Debian, puede instalarlo con apt-get install beep.
Riccardo Murri

14
En Linux, hay un cuarto método rudo para emitir un pitido: descargue el pcspkrmódulo, cargue el snd-pcsp, y ahora tiene una tarjeta de sonido alsa que utiliza trucos de la vieja escuela para transmitir sonido digital a su altavoz interno. Da resultados malos con los altavoces internos piezoeléctricos, pero en los altavoces internos clásicos, la calidad es bastante buena para lo que es. De esta manera, puede ser mucho más creativo para sus pitidos;)
BatchyX

8
@isomorphismes: pcspkry snd-pcspson módulos, no paquetes. use modprobe/ modprobe -r/ lsmodpara manipularlos. Para su información, están en el linux-image-somethingpaquete, que con suerte ya está instalado (de lo contrario, no tendría un kernel de Linux).
BatchyX

3
pitido por lo general se resuelve la caja para Debian pero necesitaba para cargar el módulo para que esto funcione en Ubuntu
mchid

44
Como dijo mchid, después de agregar el módulo: ¡el modprobe snd-pcsppitido ahora funciona!
lepe

74

Simplemente haciendo eco \ao \07funciona para mí.

$ echo -e "\a"

Esto probablemente requerirá pcspkrque se cargue el módulo del núcleo. Solo he probado esto en RHEL, así que YMMV.

ACTUALIZAR

Como Warren señaló en los comentarios, esto puede no funcionar cuando se inicia sesión de forma remota a través de SSH. Una solución rápida sería redirigir la salida a cualquiera de los dispositivos TTY (idealmente uno que no se use). P.ej:

$ echo -en "\a" > /dev/tty5

55
Si está utilizando un terminal X o ssh'd en la máquina, esto puede hacer que el terminal parpadee, ya que muchos programas de tipo xterm / vt100 están configurados para hacerlo para los caracteres BEL.
Warren Young

2
Esto tiene sentido, pero no funcionó para mí en Ubuntu 12.04.
isomorfismos

2
@isomorphismes: eso es para consolas, no para terminales X11. Para pitidos debajo de X, puede probar esto: askubuntu.com/a/587311/11015
MestreLion

1
@isomorphismes: también estoy usando Ubuntu 12.04, y para mí sudo modprobe pcspkrfue suficiente para habilitar pitidos en el VT, ya sea a través de printf "\a"o beeputilidad.
MestreLion

3
Ninguno de los métodos funciona para mí. Ubuntu 16.04.1 LTS
ar2015

68

NOTA: Esta solución emite pitidos desde los altavoces , no desde la placa base .

ALSA viene con prueba de altavoz , un generador de tono de prueba de altavoz de línea de comandos, que se puede utilizar para generar un pitido:

$ speaker-test -t sine -f 1000 -l 1

Vea este hilo del foro de Arch Linux .

Sin embargo, la duración del pitido será arbitraria, pero se puede controlar de la siguiente manera:

$ ( speaker-test -t sine -f 1000 )& pid=$! ; sleep 0.1s ; kill -9 $pid

Podemos ir un paso más allá y emitir un pitido con esta función:

_alarm() {
  ( \speaker-test --frequency $1 --test sine )&
  pid=$!
  \sleep 0.${2}s
  \kill -9 $pid
}

que se llama con argumentos de frecuencia y duración:

$ _alarm 400 200

Con esto en mente, es posible crear música simple con speaker-test. Ver este script de shell .


1
Su función como one-liner (y compatible con Ctrl-C):timeout ${2} speaker-test --frequency ${1} --test sine
user569825

1
No hay necesidad real de guardar pid, solo speaker-test -t sine -f 1000 -l 1 & sleep .2 && kill -9 $! hace lo mismo. De todos modos, el método de @ user569825 es más agradable.
erm3nda

Uy, eso duele.
shadi hace

28
tput bel

porque terminfo define belcomo

           Variable                       Cap-               TCap                  Description
            String                        name               Code

   bell                                   bel                bl                audible signal
                                                                               (bell) (P)

17

Para usar la tarjeta de sonido si soxestá instalada y el altavoz de la PC si no está:

$ play -q -n synth 0.1 sin 880 || echo -e "\a"

sox está disponible para la mayoría de las distribuciones.


2
+1 No sabía que el juego tenía esta característica. Terminé usando esto en un thenbloque dentro watchpara notificarme una vez que se cumplió una determinada condición. Incluso me permite mantener mis auriculares puestos. Esto fue muy útil para mí.
andyortlieb

De un juego bash sh probablemente necesitarásudo -u USER play...
intika

En mi sistema, playutiliza pulseaudio, como usuario. Supongo que depende de la configuración del sistema.
Alexander

13

Algunas distribuciones tienen utilidades de línea de comandos para lograr esto. Tal vez podría decirnos en qué distribución se encuentra o buscar (por ejemplo, emerge -s beepen gentoo).

Yendo más allá de las utilidades "disponibles", también puede hacer un script de Perl que emita un pitido, todo lo que necesita hacer es incluir:

<SomeCodeBefore>
print "\007";
<SomeCodeAfter>  

Si terminas recibiendo un "pitido", prueba lo siguiente:

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

Me gusta que mis preguntas sigan siendo independientes de la distribución, ¿ echo -e "\007"funcionaría en bash en lugar de print "\007en perl?
Stefan

1
@Stefan - Beep es bastante 'universal'. Sin embargo, puede permanecer independiente de la distribución utilizando 'echo -e "\ a"' o 'echo -e "\ 07"'. ¡Salud!
wormintrude

2
Sería más portátil de usar en printf '\007'lugar de echo.
Dennis Williamson


2

Tratar

echo -n Ctrl+ V Ctrl+G

La desventaja es que esto solo funcionará cuando el dispositivo de salida sea un terminal, por lo que puede no funcionar dentro de un trabajo cron, por ejemplo. (Pero si usted es root, es posible que pueda redirigir /dev/consolepara un pitido inmediato).


1

En Linux, herramientas como beeppueden usar un ioctl en el dispositivo de la consola para emitir un sonido dado. Para ser más específico, beepusará el KIOCSOUNDioctl, pero también hay un KDMKTONEioctl que puede usarse para generar sonido.

Según tengo entendido, el primero emite un sonido que dura hasta que se cancela explícitamente, mientras que el segundo crea un pitido de duración predeterminada. Consulte la console_ioctlpágina del manual (4) para obtener más detalles.

Entonces, si no está satisfecho con lo que beephace, podría escribir algunas líneas de código para acceder a estos ioctls directamente. Suponiendo que tiene acceso completo a /dev/console, que bien podría requerir privilegios de root.


-1

En una terminal, presione Ctrl+ Gy luegoEnter


1
En mi terminal (gnome-terminal), funciona sin Enter. Solo como una prueba de altavoz de PC, esto me parece bien. Sin embargo, es completamente inútil en los scripts.
Palec

Sorprendentes votos negativos. Esto funciona en algunas PC, aunque podría no funcionar en todas.
Zzzach ...

No funciona en rxvt, urxvt, xterm, lxterm o lxterminal, ¿no debería mi terminal al menos parpadear si tiene una campana visual?
Willem

Funciona en xterm
Chris
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.