Використовуючи bash, як я можу зробити звуковий сигнал ПК-динаміка?
Щось подібне echo 'beepsound' > /dev/pcspkr
було б добре.
Використовуючи bash, як я можу зробити звуковий сигнал ПК-динаміка?
Щось подібне echo 'beepsound' > /dev/pcspkr
було б добре.
Відповіді:
Зазвичай я використовую маленьку утиліту, beep
встановлену в багатьох системах. Ця команда спробує різні підходи для створення системного звуку.
Існує 3 способи створення звуку на сторінці сторінки beep
:
Традиційний метод отримання звукового сигналу в скрипті оболонки - записати символ ASCII BEL
( \007
) на стандартний висновок за допомогою команди оболонки, наприклад
echo -ne '\007'
Це працює лише в тому випадку, якщо стандартний вихід оболонки виклику в даний час спрямований на якийсь термінальний пристрій; якщо ні, то звуковий сигнал не видаватиме звуку і навіть може спричинити небажане пошкодження у будь-якому файлі, на який спрямований вихід.
Є й інші способи викликати звуковий сигнал. Трохи надійніший спосіб - відкрити /dev/tty
та відправити туди свій символ БЕЛ. Це надійно проти перенаправлення вводу / виводу, але все-таки виходить з ладу у випадку, коли сценарій оболонки, який бажає генерувати звуковий сигнал, не має керуючого терміналу, наприклад, тому що він запускається від менеджера вікон 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
звуковий сигнал зараз працює!
Просто відлуння \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 -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. (Але якщо ви користуєтеся коренем, ви можете перенаправитись на /dev/console
негайний звуковий сигнал.)
У Linux такі інструменти beep
можуть використовувати ioctl на консольному пристрої, щоб видавати заданий звук. Якщо бути більш конкретним, beep
буде використовуватися KIOCSOUND
йоктл, але є і KDMKTONE
йоктл, який можна використовувати для отримання звуку.
Наскільки я розумію, перший запускає звук, який триває, поки явно не скасується, а другий створить звуковий сигнал заздалегідь визначеної тривалості. Дивіться в console_ioctl
(4) людина сторінки для деталей.
Отже, якщо ви незадоволені тим, що beep
робить, ви можете написати кілька рядків коду, щоб отримати доступ до цих йоктлів безпосередньо. Якщо припустити, що ви маєте повний доступ до цього /dev/console
, що може вимагати кореневих привілеїв.
У терміналі натисніть Ctrl+, Gа потімEnter