Введение

Скрипт, написанный для оболочки, или интерпретатора командной строки, операционной системы, скриптинг в Unix-подобных системах.

Shell-скрипт – это компьютерная программа, предназначенная для выполнения Unix-оболочкой, которая является интерпретатором командной строки. Различные диалекты shell-скриптов рассматриваются как языки сценариев. Типичные операции, выполняемые shell-скриптами, включают манипулирование файлами, запуск программ и вывод текста. Скрипт, который настраивает окружение, запускает программу и выполняет необходимую очистку или ведение журнала, называется оберткой (wrapper). Этот термин также используется в более широком смысле для обозначения автоматизированного режима запуска оболочки операционной системы; каждая операционная система использует определенное название для этих функций, включая пакетные файлы (MS-DOS, Windows 95, OS/2), командные процедуры (VMS) и shell-скрипты (Windows NT и сторонние производные, такие как 4NT – статья доступна по cmd.exe), а для мейнфрейм-систем используется ряд других терминов. Распространенные оболочки, используемые в Unix и Unix-подобных системах, включают Korn shell, Bourne shell и GNU Bash. Хотя в Unix-системе может быть установлена другая оболочка по умолчанию, например Zsh в macOS, эти оболочки обычно присутствуют для обеспечения обратной совместимости.

Комментарии

Комментарии игнорируются оболочкой. Обычно они начинаются с символа решётки (#) и продолжаются до конца строки.

Конфигурируемый выбор языка сценария

Шебанг, или хэш-банг, — это специальный вид комментария, который система использует, чтобы определить, какой интерпретатор следует использовать для запуска файла. Шебанг должен быть первой строкой файла и начинаться с "#! ".

Программирование

Многие современные оболочки также предоставляют различные функции, которые обычно встречаются только в более сложных языках программирования общего назначения, такие как конструкции управления потоком выполнения, переменные, комментарии, массивы, подпрограммы и тому подобное. Благодаря этим возможностям можно создавать достаточно сложные приложения в виде скриптов оболочки. Однако они по-прежнему ограничены тем, что большинство языков оболочки практически не поддерживают или вовсе не поддерживают системы типизации данных, классы, многопоточность, сложные математические вычисления и другие распространенные функции полноценных языков программирования, а также, как правило, работают значительно медленнее, чем скомпилированный код или интерпретируемые языки, разработанные с акцентом на скорость. Стандартные утилиты Unix sed и awk расширяют возможности программирования оболочки; Perl также можно встраивать в скрипты оболочки, как и другие скриптовые языки, например Tcl. Perl и Tcl поставляются с графическими библиотеками.

Другие языки сценариев

Многие мощные языки сценариев были разработаны для задач, которые слишком велики или сложны для удобного выполнения с помощью обычных скриптов командной оболочки, но при этом преимущества использования сценариев желательны, а накладные расходы на разработку полноценного компилируемого языка программирования были бы нежелательны. Вопрос о том, что именно отличает языки сценариев от языков программирования высокого уровня, часто является предметом споров, но, как правило, язык сценариев – это язык, требующий интерпретатора.

Жизненный цикл

Shell-скрипты часто используются на начальном этапе разработки программного обеспечения и впоследствии нередко переписываются на другую платформу, чаще всего на Perl, Python или C. Директива интерпретатора позволяет полностью скрыть детали реализации внутри скрипта, не отображая их в расширении имени файла, и обеспечивает возможность бесшовной переработки на различных языках без каких-либо изменений для конечных пользователей. Хотя файлы с расширением ".sh" обычно являются скриптами оболочки, большинство скриптов оболочки вообще не имеют расширения имени файла.

Преимущества и недостатки

Возможно, самое большое преимущество написания скрипта оболочки заключается в том, что команды и синтаксис полностью соответствуют тем, которые вводятся непосредственно в командной строке. Программисту не приходится переключаться на совершенно иной синтаксис, как это было бы при написании скрипта на другом языке или использовании компилируемого языка. Часто написание скрипта оболочки происходит гораздо быстрее, чем написание эквивалентного кода на других языках программирования. К многочисленным преимуществам относятся простота выбора программ или файлов, быстрый запуск и интерактивная отладка. Скрипт оболочки можно использовать для организации последовательности действий и принятия решений на основе существующих программ, а для скриптов умеренного размера отсутствие этапа компиляции является плюсом. Интерпретативное выполнение упрощает встраивание отладочного кода в скрипт и его повторный запуск для обнаружения и исправления ошибок. Даже пользователи без специальной подготовки могут использовать скрипты для настройки поведения программ, а скрипты оболочки предоставляют ограниченные возможности для многопроцессорности. С другой стороны, скрипты оболочки подвержены дорогостоящим ошибкам. Случайные опечатки, такие как `rm -rf * /` (вместо задуманного `rm -rf */`), стали притчей во языцех в сообществе Unix: всего один лишний пробел превращает команду, удаляющую все подкаталоги в текущем каталоге, в команду, удаляющую всё из корневого каталога файловой системы. Подобные проблемы могут превратить `cp` и `mv` в опасное оружие, а неправильное использование перенаправления `>` может привести к удалению содержимого файла. Усугубляет ситуацию то, что многие команды UNIX отличаются по названию всего на одну букву: `cp`, `cd`, `dd`, `df` и т. д. Еще один существенный недостаток – медленная скорость выполнения и необходимость запуска нового процесса для почти каждой команды оболочки. Если задача скрипта может быть решена путем организации конвейера, в котором эффективные фильтрующие команды выполняют основную работу, замедление снижается, но сложный скрипт обычно на несколько порядков медленнее, чем традиционная компилируемая программа, выполняющая аналогичную задачу. Существуют также проблемы совместимости между различными платформами. Ларри Уолл, создатель Perl, однажды написал: «Перенести оболочку проще, чем скрипт оболочки». Аналогично, более сложные скрипты могут столкнуться с ограничениями самого языка скриптов оболочки; эти ограничения затрудняют написание качественного кода, а расширения, предлагаемые различными оболочками для решения проблем исходного языка, могут только усугубить ситуацию. Многие недостатки использования некоторых скриптовых языков обусловлены ошибками в дизайне синтаксиса или реализации языка и не обязательно связаны с использованием текстовой командной строки; существуют оболочки, использующие другие языки программирования оболочки или даже полноценные языки, такие как Scsh (который использует Scheme).

Совместимость между языками сценариев

Различные языки скриптов могут иметь много общих элементов, во многом благодаря их основам на POSIX, и некоторые оболочки предлагают режимы эмуляции других оболочек. Это позволяет адаптировать скрипт, написанный на одном языке скриптов, для использования в другом. Например, Bash предлагает ту же грамматику и синтаксис, что и оболочка Bourne, а также предоставляет режим, соответствующий стандарту POSIX. Таким образом, большинство скриптов, написанных для оболочки Bourne, можно запускать в Bash, но обратное не всегда верно, поскольку Bash имеет расширения, отсутствующие в оболочке Bourne. Эти расширения известны как "башизмы".

Скриптовый код оболочки на других операционных системах

Программное обеспечение для обеспечения взаимодействия, такое как Cygwin, MKS Toolkit, Interix (доступный в Microsoft Windows Services для UNIX), Hamilton C shell, UWIN (AT&T Unix для Windows) и другие, позволяет запускать программы командной строки Unix на компьютерах под управлением Windows NT и последующих версий, с некоторой потерей функциональности на ветке MS-DOS Windows 95, а также в более ранних версиях MKS Toolkit для OS/2. Для этих систем также доступны как минимум три реализации DCL для операционных систем типа Windows, в дополнение к XLNT – многоцелевому пакету языка сценариев, используемому с командной оболочкой, Windows Script Host и программированием CGI. Mac OS X и последующие версии также подобны Unix. Помимо вышеупомянутых инструментов, некоторая функциональность POSIX и OS/2 может использоваться с соответствующими подсистемами среды операционных систем Windows NT до Windows 2000. Третья, 16-битная подсистема, часто называемая подсистемой MS-DOS, использует Command.com, поставляемый с этими операционными системами, для запуска вышеупомянутых пакетных файлов MS-DOS. Консольные альтернативы 4DOS, 4OS2, FreeDOS, Peter Norton's NDOS и 4NT / Take Command, которые расширяют функциональность cmd.exe в стиле Windows NT, пакетных файлов MS-DOS/Windows 95 (запускаемых Command.com), cmd.exe OS/2 и 4NT соответственно, аналогичны оболочкам, которые они улучшают, и более тесно интегрированы с Windows Script Host, который поставляется с тремя предустановленными движками: VBScript, JScript и VBA, а также поддерживает множество сторонних движков, таких как Rexx, Perl, Python, Ruby и Tcl, имеющих предопределенные функции в 4NT и связанных программах. PC DOS весьма похож на MS-DOS, в то время как DR DOS значительно отличается. Более ранние версии Windows NT способны запускать современные версии 4OS2 посредством подсистемы OS/2. Языки сценариев по определению расширяемы; например, в системах MS-DOS/Windows 95/98 и Windows NT программы командной строки могут вызывать такие инструменты, как KiXtart, QBasic, различные реализации BASIC, Rexx, Perl и Python, а также Windows Script Host и его установленные движки. В Unix и других системах, соответствующих стандарту POSIX, awk и sed используются для расширения возможностей обработки строк и чисел в скриптах командной строки. Tcl, Perl, Rexx и Python имеют графические библиотеки и могут использоваться для написания функций и процедур для скриптов командной строки, которые становятся узким местом по скорости (C, Fortran, язык ассемблера и т.д. работают значительно быстрее), а также для добавления функциональности, недоступной в языке командной строки, такой как сокеты и другие функции подключения, интенсивная обработка текста, работа с числами, если вызывающий скрипт не обладает такими возможностями, самомодифицирующийся код, методы, такие как рекурсия, прямой доступ к памяти, различные алгоритмы сортировки и многое другое, что сложно или невозможно реализовать непосредственно в основном скрипте. Visual Basic for Applications и VBScript можно использовать для управления и взаимодействия с такими компонентами, как электронные таблицы, базы данных, скриптуемые программы любого типа, телекоммуникационное программное обеспечение, инструменты разработки, графические инструменты и другое программное обеспечение, доступное через Component Object Model.