Программа sh представляет собой наиболее важную утилиту ОС UNIX. Shell – это не только интерпретатор команд системы UNIX, но еще и полноценный язык программирования, причем, как многие интерпретаторы, довольно высокого уровня. Если задача – разовая (нет требований по быстродействию, совместимости и переносимости) и достаточно абстрактная (нет привязки к конкретной сложной структуре данных), ее скорее всего можно решить, написав командный сценарий – программу на shell. По совокупности свойств shell можно считать самым мощным средством системы UNIX.
Операционные системы различаются по степени развитости входящих в их состав интерпретаторов команд. В одних системах интерпретатор прост, но совокупность программ не образует язык программирования, а в других имеются отличные языки программирования на уровне системных команд, но выполнение отдельной команды осложнено. Shell же объединяет в себе лучшие качества интерпретаторов различных операционных систем.
В командных процессорах используются всего два типа языков. Это sh–подобный язык и csh–подобный язык. Первый тип поддерживается в sh, ksh, bash. Второй – в csh и tcsh. Язык sh более удобен и стандартен, на нем написаны практически все сценарии во всех системах UNIX, включая стартовые скрипты системы. Язык csh по синтаксису ближе к языку программирования С, но используется для скриптов реже. Однако в некоторых случаях программное обеспечение включает в себя скрипты на языке csh.
Первой строкой любого сценария должна быть строка, содержащая управляющий комментарий специального вида:
#!полное_имя_командного процессора
Например,
#!/bin/sh
Этот комментарий требует выполнить скрипт с помощью указанного командного процессора. По умолчанию скрипт выполняется в среде /bin/sh, даже если он запущен в среде другого командного процессора. Если вы работаете в tcsh и хотите, чтобы ваши скрипты запускались в tcsh, следует обязательно указать полный путь к tcsh в управляющем комментарии.
Интерактивный режим взаимодействия с shell мы уже рассмотрели во второй части курса. В интерактивном режиме пользователи ограничиваются вводом простых команд, таких, как «ls», генерацией имен типа «ls *.doc», переадресацией ввода–вывода, например, «ls>file». Эти средства полезны и эффективны, но представляют лишь часть всех средств shell’а.
Важно отметить, что интерактивное управление задачей и создание программы для ее автоматического выполнения суть не одно и то же. При интерактивном управлении вы можете полагаться на свой интеллект в тех или иных ситуациях, возникающих при решении задачи, тогда как никакая программа интеллектом не обладает. Ее реакции должны быть заранее определены и запрограммированы. Любому, кто писал большую программу, известно, насколько сложно при этом предусмотреть все возможные ситуации.
Интерактивная процедура представляет собой простую последовательность команд, а программа, реализующая то же самое действие, – сложную логическую структуру. Опыт показывает, что наличие развитых управляющих структур для повторения последовательностей операторов и проверки определенных условий облегчает создание хороших программ. Известно также, что во многих случаях целесообразно применять системные переменные, значение которых изменяется в процессе выполнения программы.
Интерпретатор shell системы UNIX располагает как управляющими структурами, так и системными переменными. Shell обычная программа, т.е. она не входит в ядро операционной системы UNIX. Ее можно заменить на другую или иметь несколько.