Записывал я тут какое-то видео и заметил, что меня пиздец бесит такое поведение:
1. Открываю терминал
2. Запускаю к примеру sleep 10
3. Курсор перескакивает на новую строку
Но команда sleep еще не завершилась, а курсор уже выпрыгнул из штанов.
ㅤ
Хочу, чтобы курсор после запуска команды не перескакивал на новую строку, а ждал завершения команды.
Люблю я себе головняк создать на ровном месте. Поехали решать чо!
cursor_killer() {
echo -ne '\e[?25h'
trap 'echo -ne "\e[?25l"; trap DEBUG' DEBUG
}
PROMPT_COMMAND='cursor_killer'Получилась такая упоротая и непонятная функция.
Что происходит?
Инициализируем переменную PROMPT_COMMAND. Это команда выполняется перед выводом строки приглашения (prompt).
Дальше делаем курсор видимым с помощью echo. А следом скрываем курсор перед выполнением каждой команды с помощью trap.
В trap мы установили обработчик для псевдо-сигнала DEBUG.
➡️ help trap
If a SIGNAL_SPEC is DEBUG, ARG is executed before every simple command.
\e[?25h = включает отображение курсора (h = "show")\e[?25l = отключает отображение курсора (l = "low visibility" или "hide")Получилось так:
1. Первая команда делает курсор видимым.
2. Вторая команда установит обработчик на сигнал DEBUG.
3. Обработчик скрывает курсор и сбрасывается обработчик для сигнала DEBUG в дефолт.
Сохраняем эту поделку в
cur_killer.sh и запускаем когда нам это нужно. Либо делаем source cur_killer.sh.Ну а чтобы эта штука оказалась тебе полезной, можешь написать свой отладчик bash скриптов.
К примеру будем выводить команду, перед её выполнением:
trap 'echo "RUN: $BASH_COMMAND"' DEBUG
Теперь позапускай sleep, ls или что-то еще, перед выполнением команды, на экран будет выводиться команда. К примеру так:
trap 'echo "RUN: $BASH_COMMAND"' DEBUG
ls
RUN: ls --color=auto -la
Вот такой фигнёй я порой занимаюсь, а не сериальчики смотрю.
Покеда! Вечером еще увидимся, декабрь прям шепчет на контент и интеграции. В январе уж отдохнем.
tags: #bash
—
🔔 @bashdays➡️ @gitgate