Про эстетику и терминал

Записывал я тут какое-то видео и заметил, что меня пиздец бесит такое поведение:

  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
Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Вот такой фигнёй я порой занимаюсь, а не сериальчики смотрю.

Покеда! Вечером ещё увидимся, декабрь прямо шепчет на контент и интеграции. В январе уж отдохнём.