Цветной текст в консоли #2

Преамбула

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

ESC-последовательности

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

Результат — в скрине в начале поста

Готовый скрипт

На GitHub

По мотивам

Как изменить цвет текста в терминале Linux

Отключение проверки сертификатов в curl

Преамбула

При использовании скрипта 0x0.sh, из предыдущего поста (копия), внезапно напоролся на ошибку curl: (60) SSL certificate problem: certificate has expired.

Грешным делом подумал, что у меня в системе протухли корневые сертификаты, поскольку слаку я триста лет не обновлял, уже лет 5 без переустановки стоит, даже пошел, и нашел как их вроде бы стандартным способом обновить. Недопомогло. Потом думаю, если бы сертификаты все совсем были старые и просроченные, у меня бы ничего не работало, ни curl, ни wget, ни браузеры, ни ютупчик. А тут вроде как всего один сайтик, что-то тут не то, или я не так делаю, или на сайте косяк. Неделю проебавшись, пошел спросил у более знающего юзера [info]ketmar@ljr. Да отключи ты их к лешему, или опциями командной строки, или на уровне конфига, ответил он.

Отключение проверки сертификатов в curl на уровне пользовательского конфига.

curl, перед проверкой параметров командной строки, заглядывает в свой конфиг в каталоге пользователя, так что в нем можно установить локальные (относительно пользователя) параметры по умолчанию. Нас интересует опция отключения проверки сертификатов.

1. Заходим в свой домашний каталог (/users/<ваше_имя пользователя>/)
2. Создаем файл .curlrc
3. Прописываем в нем одну строчку: insecure

Отключение проверки сертификатов в curl в скрипте

Достаточно добавить параметр -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

Котик

Конечно же котролирующий передачу, развертку по горизонтали и вертикали, и держащий под котролем изображение и звук.

Ну и пропатченный скрипт

На GitHub

Скрипт для постинга на файл-хостинг 0x0.st

Есть прикольный файл-хостинг 0x0.st, но постить на него можно только скриптом. Мопед не мой, просто оставлю его здесь.

На GitHub

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>

Цветной текст в консоли Linux #1

Преамбула

Захотел я как-то украсить скрипт, ну чтоб он не был таким скучным, и подумал — в DOS можно было красить консоль, а можно ли в Linux? Можно!

Красим с помощью tput

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

Что получилось

Исходник на GitHub

Смотреть здесь

Источник

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