Нужно получить файл после открытия терминала, чтобы функция работала.

Вопрос или проблема

Я пытаюсь сделать терминальный розыгрыш, который воспроизводит шум для каждого вывода, который происходит в терминале:

exec > >(tee >(while true; do
  while IFS= read -r line; do
    FREQ=$(echo "$line" | od -An -N2 -i | awk '{print ($1 % 1000) + 200}')
    sox -n -b 8 -c 1 -r 8000 -d synth 0.01 saw $FREQ tremolo 1000 2> /dev/null
  done
done)) 2>&1

Это почти работает очень хорошо. Я поместил это в bashrc, однако эта функция не работает, если у меня нет уже открытого терминала, а затем я не вызываю её напрямую. Как мне переформатировать это, чтобы оно работало просто из bashrc?

Спасибо!

Как упоминали оба @kos и @steeldriver, это хорошо работает в bash, однако мне стыдно признаться, что я всё время использовал zsh. Однако, если кто-то заинтересован в том, чтобы это заработало, вот следующее:

alias ls="ls -C --color=always"
if [[ -o interactive ]]; then
  log_and_play() {
    while IFS= read -r line; do
      FREQ=$(echo "$line" | od -An -N2 -i | awk '{print ($1 % 1000) + 200}')
      sox -n -b 8 -c 1 -r 8000 -d synth 0.01 aw $FREQ tremolo 1000 2> /dev/null
    done
  }

  preexec() {
    exec > >(tee >(log_and_play)) 2>&1
  }

  precmd() {
    true
  }
fi

Ответ или решение

Для решения проблемы, связанной с тем, что функция, делающая вывод в терминале, звучит только после открытия терминала, нужно внести несколько изменений в ваш файл конфигурации оболочки, в данном случае .zshrc. Приведенные ниже детали помогут вам правильно форматировать этот код для использования в zsh, чтобы он работал сразу после запуска терминала, без необходимости ручного вызова.

Шаги для настройки автоматического воспроизведения звукового эффекта:

  1. Создание функции для логирования и воспроизведения звука:
    Ваша функция должна захватывать каждую строку вывода, генерировать частоту и проигрывать звук. Важно, чтобы эта функция была доступна до выполнения команды, которую вы хотите перехватить.

  2. Использование функций preexec и precmd:
    Функция preexec в zsh позволяет выполнять команды перед каждой вводимой командой. Ваша настройка должна установить вывод с использованием exec, чтобы перенаправить стандартный вывод и вывод ошибок в вашу функцию.

  3. Настройка .zshrc:
    Вот пример, как можно изменить ваш файл .zshrc:

    alias ls="ls -C --color=always"
    
    log_and_play() {
     while IFS= read -r line; do
       FREQ=$(echo "$line" | od -An -N2 -i | awk '{print ($1 % 1000) + 200}')
       sox -n -b 8 -c 1 -r 8000 -d synth 0.01 saw $FREQ tremolo 1000 2> /dev/null
     done
    }
    
    if [[ -o interactive ]]; then
     preexec() {
       exec > >(tee >(log_and_play)) 2>&1
     }
    
     precmd() {
       true
     }
    fi

Объяснение кода:

  • alias ls="ls -C --color=always": это просто упрощение вывода команды ls, добавляющее цвет.
  • log_and_play: функция, которая читает строки вывода, вычисляет частоту на основе ASCII-кода строки и генерирует звук с помощью sox.
  • preexec: здесь происходит перенаправление вывода. Вывод каждой команды будет обрабатываться функцией log_and_play.
  • precmd: эта функция вызывается перед выполнением каждой команды, но в данном случае не требует дополнительных действий, так как просто возвращает true.

Дополнительные рекомендации:

  1. Тестирование: После внесения изменений в .zshrc, не забудьте перезагрузить ваш терминал или выполнить команду source ~/.zshrc, чтобы изменения вступили в силу.
  2. Проверка конфигурации sox: Убедитесь, что у вас установлен пакет sox, и он правильно настроен для обработки звука в вашей системе.
  3. Отладка: Если звук не проигрывается, добавьте отладочные сообщения или временные метки в функции, чтобы отслеживать, что происходит в каждом шаге.

Эти шаги помогут вам преобразовать ваш первоначальный скрипт так, чтобы он работал непосредственно из .zshrc, что обеспечит его автоматическое выполнение при каждом запуске нового терминала.

Оцените материал
Добавить комментарий

Капча загружается...