Спа-лось
(из классификатора «Эсхатологические мутанты»)
Спа-лось
(из классификатора «Эсхатологические мутанты»)
Мы уже красили консоль при помощи tput (копия), но есть лучший способ, при помощи эскейп-последовательностей, там немного сложнее и запутаннее синтаксис, но зато нормальная поддержка 16 цветов и стилей.

ESC-последовательность это код, который вставляется в вызов команды echo или printf перед, после или прямо посреди текста, который мы собираемся выводить.
Синтаксис кода такой: \x1b[???m, где вместо ??? надо вставить код цвета текста, фона или стиля текста. Коды можно перечислять через точку с запятой: \x1b[???;???;???m или несколько кодов подряд: \x1b[???m\x1b[???m\x1b[???m. 1b — это код символа ASCII 27, который соответствует коду клавиши ESC (откуда и название).
| # | Название цвета | Код цвета текста | Код цвета фона |
| 0 | Default (По умолчанию) | 39 | 49 |
| 1 | Black (Черный) | 30 | 40 |
| 2 | DarkRed (Темно-красный) | 31 | 41 |
| 3 | DarkGreen (Зеленый) | 32 | 42 |
| 4 | DarkYellow (Темно-желтый) | 33 | 43 |
| 5 | DarkBlue (Синий) | 34 | 44 |
| 6 | DarkMagenta (Темно-фиолетовый) | 35 | 45 |
| 7 | DarkCyan (Темный аквамарин) | 36 | 46 |
| 8 | Gray (Серый) | 37 | 47 |
| 9 | DarkGray (Темно-серый) | 90 | 100 |
| 10 | Red (Красный) | 91 | 101 |
| 11 | Green (Ярко-зеленый) | 92 | 102 |
| 12 | Yellow (Желтый) | 93 | 103 |
| 13 | Blue (Голубой) | 94 | 104 |
| 14 | Magenta (Фиолетовый) | 95 | 105 |
| 15 | Cyan (Аквамарин) | 96 | 106 |
| 16 | White (Белый) | 97 | 107 |
Код сброса: \x1b[0m — сбрасывает настройки консоли (цвет текста, фона и стиль) к значению по умолчанию.
| Код стиля | Стиль текста |
| 0 | Default (По умолчанию) |
| 1 | Bold (Жирный) |
| 4 | Understrike (Подчернкутый) |
| 5 | Blinking (Мигающий), не работает, получается серый текст на темно-сером фоне |
| 7 | Inversing (Инверсия), цвет фона и текста меняются местами |
| 8 | Invisible (Невидимый), не работает |
1. Проще всего покласть названия цветов, а также коды цвета и фона в массивы:
NAMES=(Default Black DarkRed DarkGreen DarkYellow DarkBlue DarkMagenta DarkCyan Gray DarkGray Red Green Yellow Blue Magenta Cyan White)
FGROUND=(39 30 31 32 33 34 35 36 37 90 91 92 93 94 95 96 97)
BGROUND=(49 40 41 42 43 44 45 46 47 100 101 102 103 104 105 106 107)
2. Создадим функцию echoc(), принимающую три параметра, цвет текста, цвет фона и стиль:
echoc() #Text, color, background, attributes
{
...
Тут будет код
...
}
Внутри функции:
if [ -z "$2" ];then echo "$1" return fi
Если второго параметра нет, просто вызываем echo и выходим из функции.
E__="\x1b[${FGROUND[$2]}m"
Второй параметр, номер кода цвета текста в массиве, формируем ESC-последовательность с ним во временную переменную.
if [ -n "$3" ];then
E__="$E__\x1b[${BGROUND[$3]}m"
fi
Если есть третий параметр — добавляем ESC-последовательность для цвета фона.
if [ -n "$4" ];then E__="$E__\x1b[$4""m" fi
Если есть четвертый — добавляем код для стиля текста (1, 4, 5, 7, 8), см. таблицу выше.
echo -e "$E__$1\x1b[0m"
Выводим текст:
-e — параметр, позволяющий команде echo обрабатывать ESC-последовательности.
$E__ — переменная, в которой сформирована ESC-последовательность.
$1 — выводимый текст.
\x1b[0m — после текста вставляем код сброса.
3. Создаем функцию echocn(), которая от функции echoc() отличается одной строчкой:
echo -e -n "$E__$1\x1b[0m"
где -n — вывести текст без перевода строки
4. Выводим в цикле названия цветов, и примеры цвета и фона:
echo -e "Foreground color:\tBackground color:"
for N in {0..16}; do
if [ $N -eq 1 ];then #foreground
echocn "$N - ${NAMES[$N]}" $N "16"
else
echocn "$N - ${NAMES[$N]}" $N
fi
echo -e -n "\t\t\t"
if [ $N -gt 1 ];then
echoc " ${NAMES[$N]} " 1 $N #background
else
echoc " ${NAMES[$N]} " 0 $N
fi
done
5. И тестируем стили:
echo
echocn "Bold" 0 0 1; echo -n " "
echocn "Understrike" 0 0 4; echo -n " "
echocn "Blinking" 0 0 5; echo -n " "
echocn "Inversing" 0 0 7; echo -n " "
echocn "Invisible" 0 0 8; echo -n " "
echo
echo
Результат — в скрине в начале поста
При использовании скрипта 0x0.sh, из предыдущего поста (копия), внезапно напоролся на ошибку curl: (60) SSL certificate problem: certificate has expired.
Грешным делом подумал, что у меня в системе протухли корневые сертификаты, поскольку слаку я триста лет не обновлял, уже лет 5 без переустановки стоит, даже пошел, и нашел как их вроде бы стандартным способом обновить. Недопомогло. Потом думаю, если бы сертификаты все совсем были старые и просроченные, у меня бы ничего не работало, ни curl, ни wget, ни браузеры, ни ютупчик. А тут вроде как всего один сайтик, что-то тут не то, или я не так делаю, или на сайте косяк. Неделю проебавшись, пошел спросил у более знающего юзера
ketmar@ljr. Да отключи ты их к лешему, или опциями командной строки, или на уровне конфига, ответил он.
curl, перед проверкой параметров командной строки, заглядывает в свой конфиг в каталоге пользователя, так что в нем можно установить локальные (относительно пользователя) параметры по умолчанию. Нас интересует опция отключения проверки сертификатов.
1. Заходим в свой домашний каталог (/users/<ваше_имя пользователя>/)
2. Создаем файл .curlrc
3. Прописываем в нем одну строчку: insecure
Достаточно добавить параметр -k или --insecure до параметров -F "file=@<имя файла>", если вы curl‘ом что-то отправляете, или до адреса URL, если вы curl‘ом что-то получаете.
Например, я модифицировал код скрипта 0x0.sh:
Было:
...
url=$(curl ${curl_opts} -F "file=@${file}" "${host}")
...
Стало:
...
url=$(curl ${curl_opts} --insecure -F "file=@${file}" "${host}")
...
Было:
...
shortened=$(curl ${curl_opts} -F "shorten=${url}" "${host}")
...
Стало:
...
shortened=$(curl ${curl_opts} --insecure -F "shorten=${url}" "${host}")
...
Было:
...
uploaded=$(curl ${curl_opts} -F "url=${url}" "${host}")
...
Стало:
...
uploaded=$(curl ${curl_opts} --insecure -F "url=${url}" "${host}")
...
smallwolfie@wolfshanze:/tmp# 0x0.sh -f 332068.jpg
uploading "332068.jpg"...
######################################################################## 100.0%
https://0x0.st/o4_0.jpg
Конечно же котролирующий передачу, развертку по горизонтали и вертикали, и держащий под котролем изображение и звук.

Есть прикольный файл-хостинг 0x0.st, но постить на него можно только скриптом. Мопед не мой, просто оставлю его здесь.
Copyright 2016-2018 Kylie McClain <kylie@somas.is>
Использование: 0x0.sh [-f <file>] [-s <url>] [-u <url>] [file]
Если файл не указан, скрипт загружает поток stdin
-f <file> - загрузить <файл>
-s <url> - шортинг адреса <url> (В настоящее время не поддерживается сервисом!)
-u <url> - загрузка содержимого по адресу <url>
Захотел я как-то украсить скрипт, ну чтоб он не был таким скучным, и подумал — в DOS можно было красить консоль, а можно ли в Linux? Можно!
tput — команда, в основном предназначающаяся для управления консольным курсором, но покрасить она тоже может, хоть и довольно хреново.
Общий синтаксис:
tput <команда> <параметры>
В нашем случае, интересуют команды, изменяющие цвет или стиль текста.
Для удобства сведу их в таблицу:
| Команда tput | Действие |
| bold | Жирный текст, после вызова команды |
| smul | Начало подчеркнутого текста |
| rmul | Конец подчеркнутого текста |
| rev | Реверс текста и фона, т.е. они меняются местами |
| blink | Мигающий текст (не на одной консоли не сработал) |
| invis | Невидимый текст (у меня не сработало) |
| smso | Некий «выдающийся» (standout) режим, отличий при выводе не заметил |
| rmso | Отключить «выдающийся» режим |
| setaf <код_цвета> | Установить цвет текста |
| setab <код_цвета> | Установить цвет фона |
| sgr0 | Сбросить настройки терминала к значениям по умолчанию. |
tput, на самом деле, плох для окраски текста консоли, но зато хорош в синтаксисе. Не надо сочинять дополнительных функций для ESC-последовательностей (о них в следующей заметке), но он поддерживает только 7 основных цветов, а на некоторых консолях не срабатывает и белый цвет. Вот таблица цветов для текста и фона (значения одинаковые и для того, и для другого):| Код цвета | Цвет |
| 0 | Черный (Black) |
| 1 | Красный (Red) |
| 2 | Зеленый (Green) |
| 3 | Желтый (Yellow) |
| 4 | Голубой (Blue) |
| 5 | Фиолетовый (Magenta) |
| 6 | Светло-голубой (Cyan) |
| 7 | Белый (White), у меня почему-то не сработал. |
| 8 | Не используется |
| 9 | Возврат к цвету по умолчанию |
Я написал тестовый скрипт, где последовательно перебираю цвета текста и цвета фона:
tput setaf <код_цвета>, для текста
tput setab <код_цвета>, для фона
потом echo -n "некий текст", где некий текст — наименование цветов в массиве, см. исходник.
А потом вызываю tput sgr0, чтобы сбросить консоль.
Стили текста:
echo "Text style:"
tput bold; echo "Bold"; tput sgr0
tput smul; echo "Underlined"; tput rmul
tput rev; echo "Reversed"; tput sgr0
tput blink; echo "Blinking"; tput sgr0
tput invis; echo "Invisible"; tput sgr0
tput smso; echo "Standout"; tput rmso
tput sgr0

tput, на буржуйском. Копия в PDF