Beep in shell script не работает?
Я хотел бы использовать звуковой сигнал в сценарии оболочки. К сожалению, ни один из методов, которые я нашел через Google, не работает для меня.
Я старался
echo -e '\a'
echo -ne '\007'
и команда beep
после того как я установил его через apt.
Что может быть причиной?
17 ответов
Первый забег sudo modprobe pcspkr
а потом beep
должно сработать.
Причина этого не в том, что по умолчанию Ubuntu больше не загружает драйвер оборудования, который выдает звуковые сигналы.
Если это работает для вас, чтобы разрешить загрузку pcspkr, отредактируйте /etc/modprobe.d/blacklist.conf
файл (используя gksudo gedit
возможно) и закомментируйте строку с надписью blacklist pcspkr
так это выглядит так:
# уродливый и громкий шум, действующий на нервы каждого; это должно быть сделано # nice pulseaudio bing (Ubuntu: #77010) # черный список pcspkr
Не будучи поклонником звукового сигнала pcspkr, я использую звуковой сигнал одного из системных звуков с помощью команды paplay установленного сервера pulseaudio.
Сначала найдите понравившийся вам звук (например, вы можете просмотреть / usr / share / sounds для некоторых доступных) и создать ссылку на него.
export BEEP=/usr/share/sounds/ubuntu/ringtones/Harmonics.ogg
Тогда имейте это доступным как команда
alias beep='paplay $BEEP'
Теперь просто беги beep
всякий раз, когда вам это нужно. Например, чтобы предупредить вас о завершении команды:
find . | grep treasure ; beep
Так как это вопрос с очень высоким рейтингом в Google, я добавлю шаги, которые я сделал, чтобы снова включить звуковой сигнал в консоли и X11:
Для консоли Linux (CTRL+ALT+F1...F6):
Почему это не работает по умолчанию
Как уже ответили, pcspkr
Драйвер ядра для ПК Speaker занесен в черный список в 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!
Я сталкивался с этой проблемой раньше. Из того, что я помню, проблема в том, что терминал звонка пытается позвонить во внутренний компьютерный динамик (как в настольном компьютере старой школы), но ноутбуки и некоторые более новые компьютеры пропускают такую вещь.
Единственное решение, которое я нашел в то время, было 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
Чтобы решить эту проблему постоянно:
- Бежать
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
команда в окне терминала в вопросе.
" Звуковой сигнал работает только в том случае, если на вашем ПК есть" динамик ". У многих современных ноутбуков / небольших устройств его нет".
Попробуйте сыграть такой звук: play xxxxx.wav
Я нашел хороший WAV- файл, который кажется коротким и приятным, но вы также можете выбрать и свой собственный. Работает для меня, когда все остальное не удалось.
Я наконец нашел решение, которое не требует 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
Возможно, уже слишком поздно, НО для парня в будущем, ищущего это:
printf '\x07'
Я добавил эту небольшую функцию в свой.bashrc в качестве замены звукового сигнала:
beep () {
if [ "$1" = --list ]
then
find /usr/share/sounds -type f -exec basename {} \; | sort -n | tr '\n' ' '; echo
else
paplay $(find /usr/share/sounds -type f -iname "${1:-bell}*" | head -1)
fi
}
Он ищет файл в /usr/share/ звуки, начиная с предоставленного аргумента или "колокольчика", и воспроизводит его.
beep --list
возвращает список файлов в /usr/share/ Sounds.
# Examples
beep
beep bark
beep trump
Альтернативный подход - установите xterm / console на "Visual Bell", чтобы при звуковом сигнале окно просто ненадолго инвертировало свои цвета.
У меня есть функция bash под названием beep, чтобы привлечь мое внимание после завершения команды.
beep () { while true; do echo -en '\a'; sleep 1; done }
И это используется таким образом
longrun-command ; beep
Насколько я могу судить, это ошибка: системный звуковой сигнал нарушен в Karmic, несмотря на героические усилия по его устранению.
Если к компьютеру подключены фактические динамики, и вы не получаете звуковой сигнал, скорее всего, вы используете compiz. Compiz полагается на pulseaudio, который ловит звуковые сигналы и воспроизводит их, в то время как metacity обходит обычные настройки и использует libcanberra для воспроизведения звукового сигнала. Если это работает с metacity, а не compiz, то это ваша проблема, в противном случае htorque дал ответ.
Сегодня, июнь 2020 года, в Ubuntu 18.04 всяsudo modprobe pcspkr
и комментируя из blacklist pcspkr
часть /etc/modprobe.d/blacklist.conf
file, как описано здесь, не кажется необходимым.
Мой все еще находится в черном списке, но звук моего звонка работает нормально!
$cat /etc/modprobe.d/blacklist.conf
.
.
.
# ugly and loud noise, getting on everyone's nerves; this should be done by a
# nice pulseaudio bing (Ubuntu: #77010)
blacklist pcspkr
Вместо этого просто убедитесь, что звук звонка на терминале включен на вашемgnome-terminal
настройки:
Щелкните правой кнопкой мыши на экране в gnome-terminal
-> Настройки -> установите флажок "Терминальный звонок" в разделе "Звук", как показано ниже:
Теперь запустите это и услышите глухой звук характерного звука колокольчика:
echo -e "\a"
Это также работает с удаленными сеансами ssh, что очень удобно, например, при сборке на удаленной машине, так что он будет воспроизводить звук звонка, когда сборка будет завершена, чтобы предупредить вас:
time bazel build //...; echo -e "\a"
Обратите внимание, что также нажатие, Backspace когда нечего удалять, также будет воспроизводить этот звук вgnome-terminal
.
Связанный:
- Терминал терминатора не воспроизводит звук звонка
- Обновление: также см. Ответ @jvriesem на мой вопрос в комментариях к этому вопросу здесь: Как включить звонок терминала?. Кажется, я отвечаю на несколько другой вопрос.
Некоторые материнские платы не имеют звукового динамика. Чтобы обойти это, я создал скрипт Python, который вместо этого использует FFmpeg.
aevalsrc
фильтр для создания звуковых сигналов.
Примечание: вам нужно будет установить FFmpeg, используя
sudo apt install ffmpeg
#!/usr/bin/env python3
# This program runs FFPlay to generate beeps.
from argparse import ArgumentParser, ArgumentError, Action
import re
import subprocess
# Custom action for note
class NoteToFrequencyAction(Action):
_note = re.compile(r"([A-G])(bb|[bx#])?(\d+)")
_note_factors = {
"C": lambda x: x / (2 ** (9/12)),
"D": lambda x: x / (2 ** (7/12)),
"E": lambda x: x / (2 ** (5/12)),
"F": lambda x: x / (2 ** (4/12)),
"G": lambda x: x / (2 ** (2/12)),
"A": lambda x: x,
"B": lambda x: x * (2 ** (2/12)),
}
_accidental_factors = {
"x" : lambda x: x * (2 ** (2/12)),
"#" : lambda x: x * (2 ** (1/12)),
None: lambda x: x,
"b" : lambda x: x / (2 ** (1/12)),
"bb": lambda x: x / (2 ** (2/12))
}
def __call__(self, parser, namespace, values, option_string) -> None:
if not (isinstance(values, str)):
raise ArgumentError("Should not have multiple values")
parse = self._note.fullmatch(values);
parts = parse.groups()
freq = 440.0
freq *= 2 ** (int(parts[2]) - 4)
freq = self._note_factors[parts[0]](freq)
freq = self._accidental_factors[parts[1]](freq)
if not type(namespace.__dict__[self.dest]) == list:
namespace.__dict__[self.dest] = []
namespace.__dict__[self.dest].append(freq)
parser = ArgumentParser()
freq_group = parser.add_mutually_exclusive_group(required=True)
freq_group.add_argument("-f", "--frequency", type=float, action="append", dest="freqs",
help="Can be specified more than once, specifies frequencies in Hz of the beeped notes"
)
freq_group.add_argument("-n", "--note", action=NoteToFrequencyAction, dest="freqs",
help="Can be specified more than once, specifies notes (e.g. A4). You can use b, #, x, bb for accidentals."
)
parser.add_argument("-d", "--duration", type=float, default=1, dest="time",
help="The duration of the beep in seconds."
)
parser.add_argument("-v", "--volume", type=float, default=0.5,
help="The volume of the beep, defaults to 0.5"
)
args = parser.parse_args()
del parser, freq_group
aevalsrc_waves = [f"sgn(sin({repr(f)}*2*PI*t))" for f in args.freqs]
aevalsrc_expr = "+".join(aevalsrc_waves)
ffplay_filter = f"aevalsrc=({aevalsrc_expr})/{len(args.freqs)}*{args.volume}:d={args.time}"
print("aevalsrc filter:")
print(ffplay_filter)
subprocess.run([
"ffplay", "-f", "lavfi", "-i", ffplay_filter, "-autoexit", "-nodisp"
], stderr=subprocess.DEVNULL)
Просто вставьте в
~/bin/beep
а также
chmod +x beep
сделать его доступным. Он не совсем поддерживает те же параметры, но это сделало бы этот код намного длиннее, чем он есть.
Некоторым пользователям, столкнувшимся с рассматриваемой проблемой, потребуется всего лишь открыть графический интерфейс настроек, перейти к «Звук» и в разделе «Уровень громкости» увеличить «Системные звуки» до ненулевого значения (и еще раз проверить, что «Системная громкость» также установлена). ненулевое).
Если кто-то хочет, чтобы я добавил скриншот, дайте мне знать.
Этот ответ работает для меня, используя Ubuntu Server с установленной средой рабочего стола Cinnamon. Звонок терминала по умолчанию не работал.
Мое решение похоже на ответ @jdthood: я смог исправить это, переключив
/org/gnome/desktop/wm/preferences/audible-bell
к
true
с использованием
dconf-editor
.