Вопрос или проблема
Я пытаюсь сделать терминальный розыгрыш, который воспроизводит шум для каждого вывода, который происходит в терминале:
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
, чтобы он работал сразу после запуска терминала, без необходимости ручного вызова.
Шаги для настройки автоматического воспроизведения звукового эффекта:
-
Создание функции для логирования и воспроизведения звука:
Ваша функция должна захватывать каждую строку вывода, генерировать частоту и проигрывать звук. Важно, чтобы эта функция была доступна до выполнения команды, которую вы хотите перехватить. -
Использование функций
preexec
иprecmd
:
Функцияpreexec
вzsh
позволяет выполнять команды перед каждой вводимой командой. Ваша настройка должна установить вывод с использованиемexec
, чтобы перенаправить стандартный вывод и вывод ошибок в вашу функцию. -
Настройка
.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
.
Дополнительные рекомендации:
- Тестирование: После внесения изменений в
.zshrc
, не забудьте перезагрузить ваш терминал или выполнить командуsource ~/.zshrc
, чтобы изменения вступили в силу. - Проверка конфигурации
sox
: Убедитесь, что у вас установлен пакетsox
, и он правильно настроен для обработки звука в вашей системе. - Отладка: Если звук не проигрывается, добавьте отладочные сообщения или временные метки в функции, чтобы отслеживать, что происходит в каждом шаге.
Эти шаги помогут вам преобразовать ваш первоначальный скрипт так, чтобы он работал непосредственно из .zshrc
, что обеспечит его автоматическое выполнение при каждом запуске нового терминала.