Любая, хранимая в файле команда или последовательность команд системы UNIX, называется shell–программой или командным файлом. Обычно термин «командный файл» относят к простой последовательности команд, а «shell–программа» – к их более сложно организованным наборам, в которых часто используются условные команды shell и другие дополнительные средства.
Существует три способа инициации shell для выполнения командных файлов.
1. Первый из них основан на том, что путем переадресации можно обеспечить ввод команд из файла:
$ sh<dw
Результат достаточно ясен: sh будет читать команды из файла dw, игнорируя двоеточие и пропуская комментарии (аналогично тому, как если бы вы набрали data; who).
2. Даже без переназначения sh воспринимает dw в качестве аргумента, выделяя из него две команды и выполняя их с идентичными результатами. Программа sh (как и многие другие программы Unix) может воспринимать свои входные данные из файла, заданного в качестве аргумента, независимо от того, используете вы переназначение или нет:
$ sh dw
Хотя эти два примера дают один и тот же результат, с технической точки зрения они различны. В примере sh dw командный процессор сохраняет в качестве стандартного ввода вашу клавиатуру, а в случае sh<dw стандартный ввод переназначается на файл dw.
Описав два способа использования dw необходимо уточнить, что dw – это еще не настоящий сценарий командного процессора. По определению сценарий командного процессора – это выполняемый текстовый файл, который может работать как обычная команда.
3. Третий метод состоит в том, что для выполнения shell–программы требуется лишь указать ее имя, так как работа с ней ничем не отличается от работы с другими программами, достаточно при этом установить разрешение на выполнение файла, выполнив команду изменения его кода защиты:
$ chmod a+x dw
(Так как а задается по умолчанию, будет работать и просто +х)
При таком вызове исходный командный процессор распознает, что dw – это сценарий командного процессора (поскольку это выполняемый текстовый файл, а не выполняемый двоичный), и немедленно порождает командный процессор для чтения и выполнения команд dw. Подпроцессор выполняет необходимые действия, родительский командный процессор ждет, пока подпроцессор закончит свою работу. Сигнал конца файла, генерируемый, когда dw все сделает, уничтожает процесс командного процессора (точно так же, как если бы вы нажали Ctrl–D). Родительский командный процессор активизируется вновь, и выводит приглашение.
Для вызова dw можно применить команду точки.
$ .dw
Исходный командный процессор сам считывает и выполняет найденные в файле dw команды (командный подпроцессор не вызывается). Выводимые на экран результаты будут совпадать с командами sh<dw, sh dw и dw. Когда командный подпроцессор выполняет команду, все изменения (присваивания переменных, изменения в каталоге и т.д.), вносимые данной командой в операционную среду, влияют только на этот подпроцессор, При возврате в родительский командный процессор восстанавливается исходная среда. Все внесенные командой изменения сохраняются на выходе, так как команда с точкой выполняет свой аргумент–команду в текущем командном процессоре.
Ко всем сценариям применимы следующие общие правила:
1. Предполагается, что вы работаете в своих собственных каталогах.
2. Ваш маршрут PATH включает в себя текущий каталог.
3. У вас есть необходимые полномочия чтения/записи.
Перед началом непосредственной интерпретации и выполнением команд, содержащихся в командных файлах, shell выполняет различные виды подстановок.
1. Подстановка результатов. Выполняются все команды, заключенные в обратные кавычки, и на их место подставляется результат.
2. Подстановка значений параметров и переменных. Т.е. слова, начинающиеся на "$", заменяются соответствующими значениями переменных и параметров.