Найти в Дзене
Эникей на передержке

`echo` на максималках | Escape последовательности | Linux 🐧

В предыдущей статье `echo` для чайников я затронул тему управляющих последовательностей, которые позволяют задавать цвет текста или фона, положение курсора и некоторые другие вещи. Управляющая последовательность (она же экранированная последовательность или Escape последовательность) представляет собой набор символов, которые будут обрабатываться терминалом иначе чем обычные символы. Например, если мы выполним команду `echo -e '\e[1;33mHi!'`, то вывод команды будет иметь жёлтый цвет: То есть последовательность символов \e[1;33m указывает эмулятору терминала сменить цвет выводимых символов на жёлтый. Переместить в начало экрана (1;1): echo -en '\e[H' Переместить курсор на n-ю строку в m-ю позицию: echo -e '\e[n;mH' Подняться и опуститься на заданное количество строк: echo -e '\e[5A' #go_up echo -e '\e[3B' #go_down Перемещение влево и вправо на n позиций: echo -e '\e[nC' #right echo -e '\e[nD' #left Перемещение курсора в начало строки, которая выше/ниже текущей на n строк:
Оглавление

В предыдущей статье `echo` для чайников я затронул тему управляющих последовательностей, которые позволяют задавать цвет текста или фона, положение курсора и некоторые другие вещи.

Управляющая последовательность (она же экранированная последовательность или Escape последовательность) представляет собой набор символов, которые будут обрабатываться терминалом иначе чем обычные символы. Например, если мы выполним команду `echo -e '\e[1;33mHi!'`, то вывод команды будет иметь жёлтый цвет:

-2

То есть последовательность символов \e[1;33m указывает эмулятору терминала сменить цвет выводимых символов на жёлтый.

Управление курсором

Переместить в начало экрана (1;1):

echo -en '\e[H'
Перемещение курсора в начало первой строки и вывод "test_string", начиная с этой позиции
Перемещение курсора в начало первой строки и вывод "test_string", начиная с этой позиции

Переместить курсор на n-ю строку в m-ю позицию:

echo -e '\e[n;mH'
Перемещение курсора сначала на первую строку (5-й символ), затем на третью строку (50-й символ)
Перемещение курсора сначала на первую строку (5-й символ), затем на третью строку (50-й символ)

Подняться и опуститься на заданное количество строк:

echo -e '\e[5A' #go_up
echo -e '\e[3B' #go_down
Обратите внимание, что при перемещении вверх/вниз позиция курсора в строке не изменяется
Обратите внимание, что при перемещении вверх/вниз позиция курсора в строке не изменяется

Перемещение влево и вправо на n позиций:

echo -e '\e[nC' #right
echo -e '\e[nD' #left
Отступ вправо в этом случае начинается с начала строки, а влево - с предыдущего положения курсора (test_right+1)
Отступ вправо в этом случае начинается с начала строки, а влево - с предыдущего положения курсора (test_right+1)

Перемещение курсора в начало строки, которая выше/ниже текущей на n строк:

echo -e '\e[nF'
echo -e '\e[nE'
Обратите внимание, что при выполнении в эмуляторе терминала исходной будет считаться строка, идущая после строки с командой
Обратите внимание, что при выполнении в эмуляторе терминала исходной будет считаться строка, идущая после строки с командой

Перемещение курсора к предыдущей/следующей строке:

echo -e '\eM'
echo -e '\eN'

Перемещение курсора к n-му символу в строке

echo -e '\e[nG'

Получить позицию курсора:

echo -e '\e[6n'

Сохранить и восстановить позицию курсора:

echo -e '\e[s'
echo -e '\e[u'

*вместо \e[s и \e[u можно использовать \e7 и \e8 соответственно

Перемещаем курсор на 3 строку в 50-ю позицию, печатаем pos и запоминаем позицию. Восстанавливаем позицию и через пробел печатаем restore
Перемещаем курсор на 3 строку в 50-ю позицию, печатаем pos и запоминаем позицию. Восстанавливаем позицию и через пробел печатаем restore

Удаление

Очистить экран от текущего положения курсора и до начала, конца или полностью:

echo -en '\e[1J'
echo -en '\e[0J'
echo -en '\e[2J'
echo -en '\ec'

Очистить строки, которые выше первой видимой строки:

echo -en '\e[3J'

Стереть строку от начала до курсора, от курсора до конца или стереть строку полностью:

echo -en '\e[1K'
echo -en '\e[0K'
echo -en '\e[2K'

Стиль шрифта

Чтобы задать стиль используйте команду:

echo -e '\e[xm'

*вместо x подставьте цифру, соответствующую одному из режимов ниже:

  • 1 - жирный, 22 - сброс;
  • 2 - тусклый (полупрозрачный), 22 - сброс;
  • 3 - курсив, 23 - сброс;
  • 4 - подчёркнутый, 24 - сброс;
  • 5 - мигающий, 25 - сброс;
  • 7 - инверсивный (цвета шрифта и фона меняются местами), 27 - сброс;
  • 8 - скрытый, 28 - сброс;
  • 9 - зачёркнутый, 29 - сброс;
  • 21 - двойное подчёркивание, 24 - сброс.

Стили выше можно комбинировать через точку с запятой, например:

echo -e '\e[21;6;9m'

Сбросить настройки стиля и цвета:

echo -e '\e[0m'

Управление цветом

Эмуляторы терминала, поддерживают цветной вывод и могут работать с разным количество цветов. В одних можно использовать только 8 цветов, в других - 16, в третьих - 256, а современные поддерживают Truecolor (24-bit RGB).

Для 8 и 16 цветовых решений последовательность будет выглядеть следующим образом:

echo -e '\e[xm'

*вместо x подставьте одно из чисел, соответствующих цвету текста или фона:

8 цветов (3-bit)

  • Чёрный: 30 (текст), 40 (фон).
  • Красный: 31 (текст), 41 (фон).
  • Зелёный: 32 (текст), 42 (фон).
  • Жёлтый: 33 (текст), 43 (фон).
  • Синий: 34 (текст), 44 (фон).
  • Пурпурный: 35 (текст), 45 (фон).
  • Голубой: 36 (текст), 46 (фон).
  • Белый: 37 (текст), 47 (фон).
  • Дефолтный: 39 (текст), 49 (фон).

16 цветов (4-bit)

Первые 8 цветов имеют те же коды, что перечислены выше, плюс:

  • Светло-чёрный: 90 (текст), 100 (фон).
  • Светло-красный: 91 (текст), 101 (фон).
  • Светло-зелёный: 92 (текст), 102 (фон).
  • Светло-жёлтый: 93 (текст), 103 (фон).
  • Светло-синий: 94 (текст), 104 (фон).
  • Светло-пурпурный: 95 (текст), 105 (фон).
  • Светло-голубой: 96 (текст), 106 (фон).
  • Ярко-белый: 97 (текст), 107 (фон).

256 цветов (8-bit)

Для 256 цветов последовательность будет иная:

echo -e '\e[38;5;xm' #текст
echo -e '\e[48;5;xm' #фон

*вместо x подставьте код от 0 до 255 подходящего цвета:

Скрипт генерации
Скрипт генерации
for i in {0..255}; do
echo -en "\e[38;5;${i}m$i\t";
if [[ $((($i+1)%16)) == 0 ]]; then echo; fi;
done; echo -e '\e[0m'

Truecolor (24-bit)

Для truecolor используем последовательность ниже, указав вместо r, g, b числа:

echo -e '\e[38;2;{r};{g};{b}m' #текст
echo -e '\e[48;2;{r};{g};{b}m' #фон

Пример использования hex:

color=76ff7a
echo -en "\e[38;2;$((0x${color:0:2}));$((0x${color:2:2}));$((0x${color:4:2}))mtest\t"

Управление отображением

Несколько последовательностей, которые также могут быть полезны:

echo -e '\e[?25l' #скрыть курсор
echo -e '\e[?25h' #показать курсор
echo -e '\e[?47h' #сохранить экран
echo -e '\e[?47l' #восстановить сохранённый экран
echo -e '\e[?1049h' #использовать альтернативный буфер экрана
echo -e '\e[?1049l' #отключить альтернативный буфер экрана

Заключение

В заключение добавлю, что вы можете использовать приведённые выше последовательности и в других командах, например, printf.

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

Если статья была полезна, поставьте лайк или подпишитесь на канал, чтобы чаще видеть в ленте подобный контент. Всем добра!)