Beep in shell script не работает?


87

Я хотел бы использовать звуковой сигнал в сценарии оболочки. К сожалению, ни один из методов, которые я нашел через Google, не работает для меня.

Я пытался

echo -e '\a'

echo -ne '\007'

и команда beepпосле того, как я установил его через apt.

Что может быть причиной?


Смотрите этот отчет об ошибке: bugs.launchpad.net/ubuntu/+source/unity/+bug/769314
Flimm

Ответы:


93

Сначала запустите, sudo modprobe pcspkrа затем beepдолжно работать.

Причина этого не в том, что по умолчанию Ubuntu больше не загружает драйвер оборудования, который выдает звуковые сигналы.

Если это работает для вас, чтобы разрешить загрузку pcspkr, отредактируйте /etc/modprobe.d/blacklist.confфайл (используя gksudo geditвозможно) и закомментируйте строку, в которой говорится, blacklist pcspkrчто это выглядит так:

# уродливый и громкий шум, действующий на нервы каждого; это должно быть сделано
# nice pulseaudio bing (Ubuntu: # 77010)
# черный список pcspkr

3
Если я комментирую, blacklist pcspkrя должен сделать, modprobe -r pcspkr && modprobe pcspkrчтобы заставить его работать. Также получение звукового сигнала на работу - это не то же самое, что включение звукового звонка, и, таким образом, askubuntu.com/questions/22168/how-do-i-enable-the-terminal-bell все еще должен быть открыт.
daithib8

3
Это не работает для меня в Ubuntu 14.
Cerin

90

Не будучи поклонником звукового сигнала pcspkr, я использую звуковой сигнал одного из системных звуков с помощью команды paplay установленного сервера pulseaudio.

Сначала найдите понравившийся вам звук (например, вы можете просмотреть / usr / share / sounds для некоторых доступных) и создать ссылку на него.

export BEEP=/usr/share/sounds/ubuntu/ringtones/Harmonics.ogg

Тогда имейте это доступным как команда

alias beep='paplay $BEEP'

Теперь просто бегите, beepкогда вам это нужно. Например, чтобы предупредить вас о завершении команды:

find . | grep treasure ; beep

1
Можете ли вы заставить его играть этот звук, когда кто-то бежитecho -e '\a'
Flimm

Вам может понадобиться какая-то команда чтения в цикле while или какая-то другая библиотека, которая может отслеживать нажатия клавиш.
Ювилио

2
Это отличное решение! Теперь я могу делать run-my-long-test-suite.sh; beepи читать stackoverflow, пока система не будет готова.
Jamesc

3
Приятно! Я использую export BEEP=/usr/share/sounds/ubuntu/stereo/dialog-information.oggи alias beep='paplay $BEEP --volume=32768'сейчас, это хорошо работает для меня. (Обратите внимание, что вы можете переопределить громкость с помощью beepпсевдонима, например, beep --volume=15000при громкости -12 дБ.)
leftaroundabout

3
Воспроизведение этих ogg-файлов может привести к тому, что время ожидания будет на несколько порядков больше, чем у звукового сигнала внутреннего динамика ПК. Мало того, что задержка кажется очень изменчивой. Я признаю, что большинству людей все равно, но когда вам нужна отзывчивость в реальном времени или почти в реальном времени, динамик ПК, вероятно, является лучшим вариантом для звуковой обратной связи.
H2ONaCl

21

Чтобы решить эту проблему постоянно:

  • Запустите gconf-editorи, если desktop | gnome | peripherals | keyboard | bell_modeпараметр присутствует, измените его с offнаon
  • Запустите dconf-editorи, если org | gnome | settings-daemon | peripherals | keyboard | bell-modeпараметр присутствует, измените его с offнаon
  • Добавить pactl upload-sample /usr/share/sounds/gnome/default/alerts/glass.ogg bell.oggв файл ~/.xprofile(нужно gnome-control-center-dataдля glass.ogg)
  • Добавить [ "$DISPLAY" ] && xset b 100в файл~/.bashrc

Самый простой способ активировать это решение - перезагрузить компьютер.

Кроме того, чтобы немедленно реализовать это решение для окна терминала, которое уже открыто, выполните pactlкоманду и выполните xsetкоманду в рассматриваемом окне терминала.


Я поместил pactl upload-sampleкоманду в сценарий оболочки, но ваш метод более организован. Спасибо!
JoBu1324 12.12.12

Если вы введете pactlкоманду, ~/.xprofileона будет выполнена в начале сеанса графического интерфейса.
JDThood 12.12.12

dconf-editorВерсия bell-modeустановки , кажется org.gnome.settings-daemon.peripherals.keyboard.
Igarzo

@lgarzo: Спасибо за совет. Я обновлю ответ.
Jdthood

1
@ Hibou57: Убедитесь , что у вас есть пакет , содержащий glass.oggустановленный
Janus Troelsen

21

Так как это вопрос с очень высоким рейтингом в Google, я добавлю шаги, которые я сделал, чтобы снова включить звуковой сигнал в консоли и X11:


Для консоли Linux ( CTRL+ ALT+ F1... F6):

Почему это не работает по умолчанию

Как уже было сказано , pcspkrдрайвер ядра для динамика ПК занесен в черный список в Ubuntu.

Временно включить до перезагрузки:

sudo modprobe pcspkr

Автоматически включить при загрузке:

sudo nano /etc/modprobe.d/blacklist.conf

(удалите или прокомментируйте pcspkrстроку, добавив ее #)


Для терминалов X11 (например, по умолчанию gnome-terminal)

Почему это не работает по умолчанию

В X, как при использовании Unity, KDE, Gnome Shell, звуковые события регистрируются благодаря PulseAudio module-x11-bell, который загружается по умолчанию в /usr/bin/start-pulseaudio-x11. И образец звука PulseAudio воспроизводится по звуку bell.ogg, по умолчанию пуст. Кроме того, громкость звонка может быть отключена.

Чтобы временно включить текущий сеанс,

xset b 100  # perhaps not needed, on my system it was 40 by default
pactl upload-sample /usr/share/sounds/ubuntu/stereo/bell.ogg bell.ogg

Есть и другие подходящие образцы, которые вы можете попробовать /usr/share/sounds, например, проверить на/usr/share/sounds/gnome/default/alerts/

Обратите внимание, что beepпрограмма на самом деле не нужна. Но если он установлен, он использует динамик ПК. Это был единственный способ включить зуммер под X:

sudo apt-get install beep

Чтобы автоматически включить при загрузке, просто добавьте вышеупомянутые строки в вашей ~/.profileили общесистемной по адресу/etc/profile


Чтобы проверить это:

printf '\a'

Beep!

beep

Buzz!


Чтобы автоматически включить звуковой сигнал динамика компьютера при загрузке, вы должны прокомментировать указанную строку в /etc/modprobe.d/blacklist.conf, не раскомментируя ее (вы хотите отключить черный список, а не наоборот).
z33k 16.09.16

1
оба решения работают на Ubuntu 16.04 Примечание: pcspkrи bell.oggявляются независимыми подходами. beepпытается подать звуковой сигнал, используя различные подходы, например, ioctl(console_fd, KIOCSOUND, period)использовать pcspkr(звук исходит из динамика ПК на материнской плате), в то время как printf '\a'метод на основе может работать без использования только bell.ogg(звук из обычных динамиков). Второй метод может не работать, пока служба pulseaudio не будет запущена и / или xset b onзапущена
jfs

Это pactl upload-sample ...было золотым для меня. Какой способ снова настроить загрузку образца?
ulidtko

@ulidtko: Просто добавьте эти строки в свою ~/.profileили общесистемную /etc/profile
страницу

@MestreLion неправильно. load-sample bell.ogg /usr/share/sounds/ubuntu/stereo/bell.oggв /etc/pulseaudio/default.pa.
Улидько

15

Я сталкивался с этой проблемой раньше. Из того, что я помню, проблема в том, что терминал звонка пытается позвонить во внутренний компьютерный динамик (как в настольном компьютере старой школы), но ноутбуки и некоторые более новые компьютеры пропускают такую ​​вещь.

Единственное решение, которое я нашел в то время, было sudo apt-get install soxи

play -n synth <duration in seconds> sine <freq in Hz> vol <volume (0-1)>

например

 play -n synth 0.1 sine 880 vol 0.5

попробуйте мое решение - я хотел бы знать, работает ли оно для вас!
JoBu1324

Вы можете использовать для этого и спикер-тест
Янус Троелсен,

1
Вы также можете иметь хороший тон для гитары play -q -n synth 2 pluck C5. С5 это примечание.
Пабло А

3

Я наконец нашел решение, которое не требует alsamixerналичия звукового сигнала для ПК. Я думаю, что я помню все мои изменения:

раскомментируйте следующее в /etc/pulse/default.pa:

load-sample-lazy x11-bell /usr/share/sounds/ubuntu/stereo/bell.ogg
load-module module-x11-bell sample=bell-windowing-system

за эту ошибку , запуститьpactl upload-sample /usr/share/sounds/ubuntu/stereo/bell.ogg bell.ogg


Попробовал это, Пактл дал мне Connection failure: Connection refused pa_context_connect() failed: Connection refused.
YodaDaCoda

Может быть, этот поток поможет - если вы когда-либо запускали pulseaudio от имени root.
JoBu1324

На самом деле у меня другая проблема. Pulseaudio бросает Failed to open module "module-esound-protocol-unix": file not found. Вероятно, не стоит обсуждать здесь, поскольку я работаю 13.04, хотя я бы хотел проверить ваше решение.
YodaDaCoda

Хорошо, просто немного разные строки для 15.04.
VRR

2

Если к компьютеру подключены фактические динамики, и вы не получаете звуковой сигнал, скорее всего, вы используете compiz. Compiz полагается на pulseaudio, который ловит звуковые сигналы и воспроизводит их, в то время как metacity обходит обычные настройки и использует libcanberra для воспроизведения звукового сигнала. Если это работает с metacity, а не compiz, то это ваша проблема, в противном случае htorque дал ответ.


2

3
«Не включено по умолчанию» не означает «сломано», и «героическое усилие» не требуется: просто modprobe pcsprk(в консоли) или pactl upload-sample ...в X11, и надоедливый гудок вернулся :)
MestreLion

2

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

Попробуйте воспроизвести такой звук: play xxxxx.wav я нашел хороший WAV- файл, который кажется коротким и приятным, но вы также можете выбрать и свой собственный. Работает для меня, когда все остальное не удалось.


Благодаря: tredegar & hk_centos


1

Альтернативный подход - установите xterm / console на «Visual Bell», чтобы при звуковом сигнале окно просто ненадолго инвертировало свои цвета.

У меня есть функция bash под названием beep, чтобы привлечь мое внимание после завершения команды.

beep ()  { while true; do  echo -en '\a'; sleep 1; done }

И это используется таким образом

longrun-command ; beep

0

Это может быть поздно НО, потому что парень в будущем ищет это:

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