Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание - страница 24
>
>#·· цветам фона (background).
>initializeANSI()
>{
>··esc="\033" # Если эта последовательность не будет работать,
>············ #·· введите символ ESC непосредственно.
>··# Цвета шрифта
>··blackf="${esc}[30m";··redf="${esc}[31m";·· greenf="${esc}[32m"
>··yellowf="${esc}[33m"··bluef="${esc}[34m";··purplef="${esc}[35m"
>··cyanf="${esc}[36m";·· whitef="${esc}[37m"
>··# Цвета фона
>··blackb="${esc}[40m";··redb="${esc}[41m";·· greenb="${esc}[42m"
>··yellowb="${esc}[43m"··blueb="${esc}[44m";··purpleb="${esc}[45m"
>··cyanb="${esc}[46m";·· whiteb="${esc}[47m"
>··# Жирный, наклонный, с подчеркиванием и инверсное отображение
>··boldon="${esc}[1m";···· boldoff="${esc}[22m"
>··italicson="${esc}[3m";··italicsoff="${esc}[23m"
>··ulon="${esc}[4m";······ uloff="${esc}[24m"
>··invon="${esc}[7m";······invoff="${esc}[27m"
>··reset="${esc}[0m"
>}
Как это работает
Если вы привыкли использовать язык разметки HTML, работа с этими последовательностями может показаться вам слишком сложной. В HTML вы просто вставляете открывающие теги и закрываете их в обратном порядке, следя за тем, чтобы закрыть все открытые теги. Чтобы выделить наклонным шрифтом фрагмент приложения, отображаемого жирным шрифтом, можно написать такой код HTML:
>this is in bold and this is italics within the bold
Попытка закрыть тег, управляющий жирностью шрифта, раньше, чем тег, управляющий наклонным отображением, может вызвать беспорядок в отдельных веб-браузерах. Но в случае с ANSI-последовательностями дело обстоит иначе: некоторые из них фактически отменяют действие предыдущих, а также существует общая последовательность сброса, отменяющая действие всех других. Ее обязательно нужно добавить в конце вывода, а за последовательностью, включающей тот или иной режим форматирования, должна идти соответствующая ей последовательность, выключающая этот режим. Использовав переменные из сценария, предыдущее предложение можно вывести, как показано ниже:
>${boldon}this is in bold and ${italicson}this is
>italics${italicsoff}within the bold${reset}
Запуск сценария
Чтобы опробовать этот сценарий, нужно сначала вызвать функцию инициализации, а затем выполнить несколько команд echo с разными комбинациями цвета и эффектами форматирования:
>initializeANSI
>echo −e "${yellowf}This is a phrase in yellow${redb} and red${reset}"
>echo −e "${boldon}This is bold${ulon} this is ul${reset} bye-bye"
>echo −e "${italicson}This is italics${italicsoff} and this is not"
>echo −e "${ulon}This is ul${uloff} and this is not"
>echo −e "${invon}This is inv${invoff} and this is not"
>echo −e "${yellowf}${redb}Warning I ${yellowb}${redf}Warning II${reset}"
Результаты
Результаты работы сценария в листинге 1.27, воспроизведенные в книге, не впечатляют, но на экране, где поддерживаются все управляющие последовательности, они определенно привлекут ваше внимание.
Листинг 1.27. Как можно оформить текст с применением переменных из листинга 1.26
>This is a phrase in yellow and red
>This is bold this is ul bye-bye
>This is italics and this is not
>This is ul and this is not
>This is inv and this is not
>Warning I Warning II
Усовершенствование сценария
Запустив этот сценарий, можно увидеть такой вывод:
>\033[33m\033[41mWarning!\033[43m\033[31mWarning!\033[0m
Эта проблема может заключаться в отсутствии поддержки управляющих ANSI-последовательностей в программе терминала или неправильной интерпретации формы записи \033 в определении переменной esc. Чтобы устранить последнюю проблему, откройте сценарий в редакторе vi или в другом терминальном редакторе, удалите последовательность \033 и нажмите клавиши ^V (ctrl-V) и esc, в результате должна отобразиться последовательность ^[. Если результат на экране выглядит как esc="^[", все должно заработать, как ожидается.
С другой стороны, если программа-терминал вообще не поддерживает ANSI-последовательности, стоит обновить ее, чтобы получить возможность расцвечивать и форматировать вывод других своих сценариев. Но прежде чем распрощаться со своим нынешним терминалом, проверьте его настройки — вполне вероятно, что там предусмотрены параметры для включения полноценной поддержки ANSI.