Сценарии командной оболочки. 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.