С другой стороны, если программа-терминал вообще не поддерживает 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, для доступа ко всем функциям, написанным в этой главе, и их проверки.
Листинг 1.28.Подключение единой библиотеки с прежде реализованными функциями и их вызов
··#!/bin/bash
··# Сценарий тестирования библиотеки
··# Сначала подключить (прочитать) файл library.sh.
··. 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 ""
··echon "Enter a year you think might be a leap year: "
··read year
··# Убедиться, что значение года находится в диапазоне между 1 и 9999,
··#·· с помощью validint, передав ей минимальное и максимальное значения.
··while! validint $year 1 9999; do
····echon "Please enter a year in the ${boldon}correct${boldoff} format: "
····read year
··done
··# Проверить, является ли год високосным.
··if isLeapYear $year; then
····echo "${greenf}You're right! $year is a leap year.${reset}"
··else
····echo "${redf}Nope, that's not a leap year.${reset}"
··fi
··exit 0
Обратите внимание, что библиотека и все содержащиеся в ней функции включаются в окружение сценария выполнением единственной строки
.
Этот очень удобный прием можно снова и снова использовать со многими сценариями, представленными в книге. Просто поместите подключаемый библиотечный файл в один из каталогов, перечисленных в переменной окружения PATH, чтобы команда. могла найти его.
Читать дальше