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

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

Я попытался

echo -e '\a'

echo -ne '\007'

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

В чем может быть причина?

101
задан 10 June 2013 в 03:24

15 ответов

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

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

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

# ugly and loud noise, getting on everyone's nerves; this should be done by a
# nice pulseaudio bing (Ubuntu: #77010)
# blacklist pcspkr
101
ответ дан 10 June 2013 в 03:24

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

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

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

Затем, чтобы он был доступен в виде команды

alias beep='paplay $BEEP'

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

find . | grep treasure ; beep
105
ответ дан 10 June 2013 в 03:24

Для постоянного решения этой проблемы:

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

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

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

22
ответ дан 10 June 2013 в 03:24

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


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

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

As уже ответил , драйвер ядра 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 / звуки , например, проверьте их на / usr / share / Sounds / gnome / default / alerts /

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

sudo apt-get install beep

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


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

printf '\a'

Beep!

beep

Buzz!

27
ответ дан 10 June 2013 в 03:24

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

Единственное решение, которое я нашел в время было до

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
21
ответ дан 10 June 2013 в 03:24

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

2
ответ дан 10 June 2013 в 03:24

Я наконец нашел решение, которое не требует, чтобы alsamixer имел опцию PC Beep. Думаю, я помню все свои изменения:

раскомментируйте следующее в /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- пример /usr/share/sounds/ubuntu/stereo/bell.ogg bell.ogg

3
ответ дан 10 June 2013 в 03:24

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

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

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

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

longrun-command ; beep
1
ответ дан 10 June 2013 в 03:24

" Звуковой сигнал может работать только в том случае, если на вашем ПК есть традиционный" динамик "старого стиля , и, вероятно, у большинства, если не у всех ноутбуков и небольших устройств его нет.

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

Итак, устаревшие советуют установить команду beep и / или модуль ядра pcspkr никогда не будет работать тихо, если у вас нет старого оборудования для динамиков.

INSTEAD: Попробуйте воспроизвести такой звук, когда вам нужен звуковой сигнал:

paplay /usr/share/sounds/sound-icons/capital

Обратите внимание, что здесь используется команда paplay ( P ulse A udio Play ), которая лучше сочетается со звуками другого уровня пользователя (приложение пользователя). в вашей системе, а не более старую команду aplay ( A LSA Play ), которая обычно может воспроизводить только один звук одновременно. Но учтите, что PulseAudio вызывает ALSA для фактического воспроизведения звука.

Мое предыдущее предложение использовать play все еще может работать, но запуск SoX, из которого происходит воспроизведение, является излишним.


Работает для меня, когда все остальное не удалось. Выражаем благодарность: tredegar & hk_centos и другим.

4
ответ дан 10 June 2013 в 03:24

Это может быть слишком поздно, НО для парня, который в будущем ищет это:

printf '\x07'
0
ответ дан 22 November 2019 в 23:10

Сегодня, июнь 2020 года , в Ubuntu 18.04 , весь sudo modprobe pcspkr и комментарии из черного списка pcspkr части /etc/modprobe.d/blacklist.conf файл,, как описано здесь , кажется необязательным.

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

$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 -> Настройки -> установите флажок " Терминальный звонок »в разделе« Звук », как показано ниже:

enter image description here

Теперь запустите это и услышите глухой« глухой »звук символа звонка:

echo -e "\a"

Это также работает в удаленных сеансах ssh, которые очень удобно, например, при сборке на удаленном компьютере, так что он будет воспроизводить звук колокольчика, когда сборка будет завершена, чтобы предупредить вас:

time bazel build //...; echo -e "\a"

Обратите внимание, что также нажатие Backspace , когда нечего удалять также будет воспроизводить этот звук в gnome-terminal .

Связано:

  1. Терминал `terminator` не будет воспроизводить звук звонка
  2. Обновление: также см. ответ @ jvriesem на мой вопрос в комментариях к этому вопросу здесь: Как включить звонок терминала? . Кажется, я отвечаю на несколько другой вопрос:
0
ответ дан 5 January 2021 в 23:56
paplay /usr/share/sounds/purple/alert.wav
1
ответ дан 5 January 2021 в 23:56

Я добавил эту небольшую функцию в свой .bashrc вместо beep:

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.[12222pting

1
ответ дан 5 January 2021 в 23:56

Некоторые материнские платы не имеют звукового динамика. Чтобы обойти это, я создал сценарий на 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, чтобы сделать его доступным. Он не совсем поддерживает те же опции, но если сделать это, то код станет намного длиннее, чем он есть.

1
ответ дан 4 September 2021 в 12:42

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

Похожие вопросы: