Используя bash, как я могу заставить компьютерный динамик подавать звуковой сигнал?
Нечто подобное echo 'beepsound' > /dev/pcspkr
было бы неплохо.
Используя bash, как я могу заставить компьютерный динамик подавать звуковой сигнал?
Нечто подобное echo 'beepsound' > /dev/pcspkr
было бы неплохо.
Ответы:
Я обычно использую маленькую утилиту, beep
установленную на многих системах. Эта команда попробует разные подходы для создания системного звука.
Существует 3 способа создания звука из beep
man-страницы:
Традиционный метод создания звукового сигнала в сценарии оболочки заключается в записи символа ASCII BEL
( \007
) в стандартный вывод с помощью такой команды оболочки, как
echo -ne '\007'
Это работает только в том случае, если стандартный вывод вызывающей оболочки в данный момент направлен на какое-либо терминальное устройство; в противном случае звуковой сигнал не будет издавать звука и может даже вызвать нежелательное искажение в любом файле, на который направлен вывод.
Есть и другие способы вызвать звуковой сигнал. Немного более надежный способ - открыть /dev/tty
и отправить туда своего персонажа BEL. Это устойчиво к перенаправлению ввода / вывода, но все равно не работает в случае, когда сценарий оболочки, желающий генерировать звуковой сигнал, не имеет управляющего терминала, например, потому что он запускается из диспетчера окон X.
Третий подход - подключиться к вашему дисплею X и отправить ему команду звонка. Это не зависит от оконечного устройства Unix, но требует (конечно) X-дисплея.
beep
просто попробую эти 3 метода.
beep
команды: johnath.com/beep В Ubuntu / Debian вы можете установить ее с помощью apt-get install beep
.
pcspkr
модуль, загрузите snd-pcsp
, и теперь у вас есть звуковая карта alsa, которая использует приемы старой школы, чтобы фактически передавать цифровой звук на ваш внутренний динамик. Это дает дрянные результаты с пьезоэлектрическими внутренними динамиками, но на классических внутренних динамиках качество вполне удовлетворительное. Таким образом, вы можете стать более креативным для
pcspkr
и snd-pcsp
являются модулями, а не пакетами. использовать modprobe
/ modprobe -r
/ lsmod
манипулировать ими. К вашему сведению, они находятся в linux-image-something
пакете, который, мы надеемся, уже установлен (иначе у вас не будет ядра Linux).
modprobe snd-pcsp
beep теперь работает!
Просто повторяю \a
или \07
работает на меня.
$ echo -e "\a"
Это, вероятно, потребует pcspkr
загрузки модуля ядра. Я проверял это только на RHEL, так что YMMV.
Как отметил Уоррен в комментариях, это может не сработать при удаленном входе через SSH. Быстрый обходной путь - перенаправить вывод на любое из устройств TTY (в идеале, то, которое не используется). Например:
$ echo -en "\a" > /dev/tty5
sudo modprobe pcspkr
было достаточно , чтобы включить звуковые сигналы при VT, либо с помощью printf "\a"
или beep
утилиты.
Ubuntu 16.04.1 LTS
ПРИМЕЧАНИЕ. Это решение издает звуковые сигналы из динамиков , а не материнской платы .
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
. Смотрите этот сценарий оболочки .
timeout ${2} speaker-test --frequency ${1} --test sine
speaker-test -t sine -f 1000 -l 1 & sleep .2 && kill -9 $!
делает то же самое. В любом случае, метод @ user569825 приятнее.
tput bel
потому что terminfo определяет bel
как
Variable Cap- TCap Description
String name Code
bell bel bl audible signal
(bell) (P)
Для использования звуковой карты, если sox
она установлена, и динамика ПК, если нет:
$ play -q -n synth 0.1 sin 880 || echo -e "\a"
sox
доступно для большинства дистрибутивов.
then
блоке внутри, watch
чтобы уведомить меня, когда определенное условие было выполнено. Даже позволяет мне держать наушники. Это было очень полезно для меня.
sudo -u USER play...
play
использует pulseaudio, как пользователь. Я думаю, это зависит от конфигурации системы.
Некоторые дистрибутивы имеют утилиты командной строки для достижения этой цели. Может быть, вы могли бы рассказать нам, в каком дистрибутиве вы находитесь, или выполнить поиск (например, 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?
printf '\007'
вместо echo
.
« Звуковой сигнал работает только в том случае, если на вашем ПК есть« динамик ». У многих современных ноутбуков / небольших устройств его нет». - Тредегар .
Попробуйте воспроизвести звук вместо этого:
$ play xxxxx.wav
Работал для меня, когда все остальное не удалось.
Пытаться
эхо -n Ctrl+ V Ctrl+G
Недостатком является то, что это будет работать только тогда, когда устройство вывода является терминалом, поэтому оно может не работать, например, внутри задания cron. (Но если вы являетесь пользователем root, вы можете перенаправить на него /dev/console
для немедленного звукового сигнала.)
В Linux такие инструменты beep
могут использовать ioctl на консольном устройстве для воспроизведения определенного звука. Чтобы быть более конкретным, beep
будет использовать KIOCSOUND
ioctl, но есть также KDMKTONE
ioctl, который можно использовать для генерации звука.
Насколько я понимаю, первый запускает звук, который длится до тех пор, пока не будет явно отменен, в то время как второй создаст звуковой сигнал заданной длительности. Смотрите в console_ioctl
(4) человек страницы для деталей.
Так что, если вы недовольны тем beep
, что делаете, вы можете написать несколько строк кода для прямого доступа к этим ioctl. Предполагая, что у вас есть полный доступ /dev/console
, что может потребовать привилегий суперпользователя.
В терминале нажмите Ctrl+, Gа затемEnter