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- файл, который кажется коротким и приятным, но вы также можете выбрать и свой собственный. Работает для меня, когда все остальное не удалось.


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

Я наконец нашел решение, которое не требует 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.conffile, как описано здесь, не кажется необходимым.

Мой все еще находится в черном списке, но звук моего звонка работает нормально!

$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.

Связанный:

  1. Терминал терминатора не воспроизводит звук звонка
  2. Обновление: также см. Ответ @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сделать его доступным. Он не совсем поддерживает те же параметры, но это сделало бы этот код намного длиннее, чем он есть.

paplay /usr/share/sounds/purple/alert.wav

Некоторым пользователям, столкнувшимся с рассматриваемой проблемой, потребуется всего лишь открыть графический интерфейс настроек, перейти к «Звук» и в разделе «Уровень громкости» увеличить «Системные звуки» до ненулевого значения (и еще раз проверить, что «Системная громкость» также установлена). ненулевое).

Если кто-то хочет, чтобы я добавил скриншот, дайте мне знать.

Этот ответ работает для меня, используя Ubuntu Server с установленной средой рабочего стола Cinnamon. Звонок терминала по умолчанию не работал.

Мое решение похоже на ответ @jdthood: я смог исправить это, переключив /org/gnome/desktop/wm/preferences/audible-bellк trueс использованием dconf-editor.

Другие вопросы по тегам