Усовершенствование сценария
Запустив этот сценарий, можно увидеть такой вывод:
\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, в ней имеется операция
Чтобы понять важность этой операции, рассмотрим альтернативное решение. Если вызвать один сценарий командной оболочки из другого, по умолчанию он будет выполнен в собственной подоболочке. Проверить это можно экспериментально, как показано ниже:
$ echo "test=2" >> tinyscript.sh
$ chmod +x tinyscript.sh
$ test=1
$./tinyscript.sh
$ echo $test
1
Сценарий
$. tinyscript.sh
$ echo $test
2
Как нетрудно догадаться, если подключаемый таким способом сценарий выполнит команду exit 0, произойдет выход из текущей оболочки и окно программы терминала закроется, потому что операция подключения выполняет подключаемый сценарий в текущем процессе. В подоболочке команда exit произведет выход из нее, не вызвав остановки основного сценария. Это главное отличие и одна из причин, влияющих на выбор между командами. или source и exec (как будет показано ниже). Команда. фактически идентична команде source в bash; мы использовали точку просто потому, что такая форма подключения файлов более переносима между разными POSIX-совместимыми командными оболочками.
Код
Чтобы превратить функции, представленные в этой главе, в библиотеку для использования в других сценариях, извлеките все функции и необходимые глобальные переменные или массивы (то есть значения, общие для нескольких функций) и поместите их в один большой файл. Если назвать этот файл
Листинг 1.28. Подключение единой библиотеки с прежде реализованными функциями и их вызов
··#!/bin/bash
··# Сценарий тестирования библиотеки
··# Сначала подключить (прочитать) файл library.sh.
··initializeANSI # Настроить управляющие ANSI-последовательности.
··# Проверить функцию validint.
··echon "First off, do you have echo in your path? (1=yes, 2=no) "
··read answer
··while! validint $answer 1 2; do
····echon "${boldon}Try again${boldoff}. Do you have echo "
····echon "in your path? (1=yes, 2=no) "
····read answer
··done
··# Проверить работу функции поиска команды в списке путей.
··if! checkForCmdInPath "echo"; then
····echo "Nope, can't find the echo command."
··else
····echo "The echo command is in the PATH."
··fi
··echo ""