Как мне сделать звуковой сигнал моего компьютера?


173

Используя bash, как я могу заставить компьютерный динамик подавать звуковой сигнал?

Нечто подобное echo 'beepsound' > /dev/pcspkrбыло бы неплохо.



Ответы:


124

Я обычно использую маленькую утилиту, beepустановленную на многих системах. Эта команда попробует разные подходы для создания системного звука.

Существует 3 способа создания звука из beepman-страницы:

  1. Традиционный метод создания звукового сигнала в сценарии оболочки заключается в записи символа ASCII BEL( \007) в стандартный вывод с помощью такой команды оболочки, как

    echo -ne '\007'
    

    Это работает только в том случае, если стандартный вывод вызывающей оболочки в данный момент направлен на какое-либо терминальное устройство; в противном случае звуковой сигнал не будет издавать звука и может даже вызвать нежелательное искажение в любом файле, на который направлен вывод.

  2. Есть и другие способы вызвать звуковой сигнал. Немного более надежный способ - открыть /dev/ttyи отправить туда своего персонажа BEL. Это устойчиво к перенаправлению ввода / вывода, но все равно не работает в случае, когда сценарий оболочки, желающий генерировать звуковой сигнал, не имеет управляющего терминала, например, потому что он запускается из диспетчера окон X.

  3. Третий подход - подключиться к вашему дисплею X и отправить ему команду звонка. Это не зависит от оконечного устройства Unix, но требует (конечно) X-дисплея.

beep просто попробую эти 3 метода.


9
Домашняя страница beepкоманды: johnath.com/beep В Ubuntu / Debian вы можете установить ее с помощью apt-get install beep.
Риккардо Мурри

14
В linux существует четвертый плохой метод подачи звукового сигнала : выгрузите pcspkrмодуль, загрузите snd-pcsp, и теперь у вас есть звуковая карта alsa, которая использует приемы старой школы, чтобы фактически передавать цифровой звук на ваш внутренний динамик. Это дает дрянные результаты с пьезоэлектрическими внутренними динамиками, но на классических внутренних динамиках качество вполне удовлетворительное. Таким образом, вы можете стать более креативным для
звуковых сигналов

8
@isomorphismes: pcspkrи snd-pcspявляются модулями, а не пакетами. использовать modprobe/ modprobe -r/ lsmodманипулировать ими. К вашему сведению, они находятся в linux-image-somethingпакете, который, мы надеемся, уже установлен (иначе у вас не будет ядра Linux).
BatchyX

3
beep обычно работает для Debian, но мне нужно было загрузить модуль, чтобы он работал на Ubuntu
mchid

4
Как сказал mchid, после добавления модуля: modprobe snd-pcspbeep теперь работает!
Лепе

74

Просто повторяю \aили \07работает на меня.

$ echo -e "\a"

Это, вероятно, потребует pcspkrзагрузки модуля ядра. Я проверял это только на RHEL, так что YMMV.

ОБНОВИТЬ

Как отметил Уоррен в комментариях, это может не сработать при удаленном входе через SSH. Быстрый обходной путь - перенаправить вывод на любое из устройств TTY (в идеале, то, которое не используется). Например:

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

5
Если вы используете X-терминал или ssh'd в машине, это может просто вызвать мигание терминала, так как многие программы типа xterm / vt100 настроены для этого для символов BEL.
Уоррен Янг

2
Это имеет смысл, но это не сработало для меня в Ubuntu 12.04.
изоморфизм

2
@isomorphismes: это для консолей, а не для терминалов X11. Для сигналов ниже X вы можете попробовать это: askubuntu.com/a/587311/11015
MestreLion

1
@isomorphismes: Я также использую Ubuntu 12,04, и для меня sudo modprobe pcspkrбыло достаточно , чтобы включить звуковые сигналы при VT, либо с помощью printf "\a"или beepутилиты.
MestreLion

3
Ни один из методов не работает для меня. Ubuntu 16.04.1 LTS
ar2015

68

ПРИМЕЧАНИЕ. Это решение издает звуковые сигналы из динамиков , а не материнской платы .

ALSA поставляется с Speaker-Test , генератором тестового тона в командной строке, который может использоваться для генерации звукового сигнала:

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

Смотрите эту ветку форума Linux .

Однако длительность звукового сигнала будет произвольной, но ее можно контролировать следующим образом:

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

Мы можем сделать еще один шаг вперед и выдать звуковой сигнал с помощью этой функции:

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

который вызывается с аргументами частоты и длительности:

$ _alarm 400 200

Имея это в виду, можно создавать простую музыку с speaker-test. Смотрите этот сценарий оболочки .


1
Ваша функция в качестве однострочника (и совместимость с Ctrl-C):timeout ${2} speaker-test --frequency ${1} --test sine
user569825

1
Там нет реальной необходимости сохранять PID, просто speaker-test -t sine -f 1000 -l 1 & sleep .2 && kill -9 $! делает то же самое. В любом случае, метод @ user569825 приятнее.
erm3nda

Ой, это больно.
Шади


17

Для использования звуковой карты, если soxона установлена, и динамика ПК, если нет:

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

sox доступно для большинства дистрибутивов.


2
+1 Я не знал, что в игре есть такая особенность. Я закончил тем, что использовал это в thenблоке внутри, watchчтобы уведомить меня, когда определенное условие было выполнено. Даже позволяет мне держать наушники. Это было очень полезно для меня.
andyortlieb

От bash sh играть наверняка понадобитсяsudo -u USER play...
интика

В моей системе playиспользует pulseaudio, как пользователь. Я думаю, это зависит от конфигурации системы.
Александр

13

Некоторые дистрибутивы имеют утилиты командной строки для достижения этой цели. Может быть, вы могли бы рассказать нам, в каком дистрибутиве вы находитесь, или выполнить поиск (например, emerge -s beepв gentoo).

Выходя за рамки «доступных» утилит, вы также можете создать Perl-скрипт, который издает звуковой сигнал, все что вам нужно сделать, это включить:

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

Если в итоге вы услышите «гудок», попробуйте следующее:

#! /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"работали бы в bash, а не print "\007в perl?
Стефан

1
@Stefan - Beep довольно универсален. Вы можете, однако, остаться дистрибутивным, используя 'echo -e "\ a"' или 'echo -e "\ 07"'. Ура!
wormintrude

2
Это было бы более портативным, чтобы использовать printf '\007'вместо echo.
Деннис Уильямсон

3

« Звуковой сигнал работает только в том случае, если на вашем ПК есть« динамик ». У многих современных ноутбуков / небольших устройств его нет». - Тредегар .

Попробуйте воспроизвести звук вместо этого:

$ play xxxxx.wav

Работал для меня, когда все остальное не удалось.

Рекомендации


2

Пытаться

эхо -n Ctrl+ V Ctrl+G

Недостатком является то, что это будет работать только тогда, когда устройство вывода является терминалом, поэтому оно может не работать, например, внутри задания cron. (Но если вы являетесь пользователем root, вы можете перенаправить на него /dev/consoleдля немедленного звукового сигнала.)


1

В Linux такие инструменты beepмогут использовать ioctl на консольном устройстве для воспроизведения определенного звука. Чтобы быть более конкретным, beepбудет использовать KIOCSOUNDioctl, но есть также KDMKTONEioctl, который можно использовать для генерации звука.

Насколько я понимаю, первый запускает звук, который длится до тех пор, пока не будет явно отменен, в то время как второй создаст звуковой сигнал заданной длительности. Смотрите в console_ioctl(4) человек страницы для деталей.

Так что, если вы недовольны тем beep, что делаете, вы можете написать несколько строк кода для прямого доступа к этим ioctl. Предполагая, что у вас есть полный доступ /dev/console, что может потребовать привилегий суперпользователя.


-1

В терминале нажмите Ctrl+, Gа затемEnter


1
В моем терминале (гном-терминал) он работает без Enter. Для меня это просто тест на динамик ПК. Впрочем, это совершенно бесполезно в сценариях.
Палек

Удивительные отзывы. Это работает на некоторых ПК, но может не работать на всех.
Ззач ...

Он не работает на rxvt, urxvt, xterm, lxterm или lxterminal, не должен ли мой терминал хотя бы мигать, если на нем визуальный звонок?
Виллем

Это работает на Xterm
Крис
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.