${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.
№ 12. Создание библиотечных сценариев
Многие сценарии в этой главе написаны как функции, а не самостоятельные сценарии, то есть их легко можно включить в другие сценарии без увеличения накладных расходов на выполнение дополнительных команд. Даже при том, что в командной оболочке отсутствует директива #include, как в языке C, в ней имеется операция подключения файла-источника (sourcing), которая служит тем же целям, позволяя подключать другие сценарии как библиотечные функции.
Чтобы понять важность этой операции, рассмотрим альтернативное решение. Если вызвать один сценарий командной оболочки из другого, по умолчанию он будет выполнен в собственной подоболочке. Проверить это можно экспериментально, как показано ниже:
$ echo "test=2" >> tinyscript.sh
$ chmod +x tinyscript.sh
$ test=1
$./tinyscript.sh
$ echo $test
1
Сценарий tinyscript.sh изменяет значение переменной test, но только внутри подоболочки, в которой он выполняется, то есть не затрагивая значение переменной test в текущей оболочке. Если выполнить сценарий с помощью точки (.), подключающей файл-источник, этот сценарий выполнится в текущей оболочке:
$. tinyscript.sh
$ echo $test
2
Как нетрудно догадаться, если подключаемый таким способом сценарий выполнит команду exit 0, произойдет выход из текущей оболочки и окно программы терминала закроется, потому что операция подключения выполняет подключаемый сценарий в текущем процессе. В подоболочке команда exit произведет выход из нее, не вызвав остановки основного сценария. Это главное отличие и одна из причин, влияющих на выбор между командами. или source и exec (как будет показано ниже). Команда. фактически идентична команде source в bash; мы использовали точку просто потому, что такая форма подключения файлов более переносима между разными POSIX-совместимыми командными оболочками.
Код
Чтобы превратить функции, представленные в этой главе, в библиотеку для использования в других сценариях, извлеките все функции и необходимые глобальные переменные или массивы (то есть значения, общие для нескольких функций) и поместите их в один большой файл. Если назвать этот файл library.sh, его можно использовать, как показано в тестовом сценарии из листинга 1.28, для доступа ко всем функциям, написанным в этой главе, и их проверки.