Скрипт оболочки — это компьютерная программа, разработанная для запуска в оболочке Unix , интерпретаторе командной строки . [1] Различные диалекты скриптов оболочки считаются командными языками . Типичные операции, выполняемые скриптами оболочки, включают обработку файлов, выполнение программ и печать текста. Скрипт, который настраивает среду, запускает программу и выполняет необходимую очистку или регистрацию, называется оболочкой .
Этот термин также используется в более общем смысле для обозначения автоматизированного режима работы оболочки операционной системы; каждая операционная система использует определенное название для этих функций, включая пакетные файлы (поток MSDos-Win95, OS/2 ), командные процедуры (VMS) и сценарии оболочки ( поток Windows NT и сторонние производные, такие как 4NT — статья находится по адресу cmd.exe ), а операционные системы мэйнфреймов связаны с рядом терминов.
Оболочки, обычно присутствующие в Unix и Unix-подобных системах, включают Korn shell , Bourne shell и GNU Bash . Хотя операционная система Unix может иметь другую оболочку по умолчанию, например Zsh в macOS , эти оболочки обычно присутствуют для обратной совместимости.
Комментарии игнорируются оболочкой. Обычно они начинаются с символа решетки ( #
) и продолжаются до конца строки. [2]
Shebang , или hash-bang, — это особый вид комментария, который система использует для определения интерпретатора, который следует использовать для выполнения файла. Shebang должен быть первой строкой файла и начинаться с " "#!
. [2] В операционных системах типа Unix символы, следующие за #!
префиксом " ", интерпретируются как путь к исполняемой программе, которая будет интерпретировать скрипт. [3]
Скрипт оболочки может предоставить удобную вариацию системной команды, в которой специальные настройки среды, параметры команды или постобработка применяются автоматически, но таким образом, чтобы новый скрипт по-прежнему мог действовать как полностью обычная команда Unix .
Одним из примеров может служить создание версии ls — команды для вывода списка файлов, с присвоением ей более короткого имени команды l
, которое обычно сохраняется в каталоге пользователя bin
как , а также с предварительно заданным набором параметров команды по умолчанию./home/username/bin/l
#!/bin/sh LC_COLLATE = C ls -FCas " $@ "
Здесь первая строка использует shebang для указания того, какой интерпретатор должен выполнить остальную часть скрипта, а вторая строка создает список с параметрами для индикаторов формата файла, столбцов, всех файлов (ни один не пропущен) и размера в блоках. Устанавливает LC_COLLATE=C
порядок сортировки по умолчанию, чтобы не складывать верхний и нижний регистр вместе, не смешивать dotfiles-a
с обычными именами файлов как побочный эффект игнорирования пунктуации в именах (dotfiles обычно отображаются только при использовании параметра like ), а "$@"
заставляет любые параметры, заданные для l
, передаваться в качестве параметров в ls, так что все обычные параметры и другой синтаксис, известный ls, по-прежнему могут использоваться.
Затем пользователь может просто использовать l
для наиболее часто используемого короткого списка.
Другим примером скрипта оболочки, который можно использовать в качестве ярлыка, может быть вывод списка всех файлов и каталогов в заданном каталоге.
#!/bin/шпрозрачныйls -аль
В этом случае скрипт оболочки начнется с обычной стартовой строки #!/bin/sh . После этого скрипт выполнит команду clear , которая очищает терминал от всего текста перед переходом к следующей строке. Следующая строка обеспечивает основную функцию скрипта. Команда ls -al выводит список файлов и каталогов, которые находятся в каталоге, из которого запускается скрипт. Атрибуты команды ls можно изменить в соответствии с потребностями пользователя.
Скрипты оболочки позволяют автоматически выполнять несколько команд, которые вводятся вручную в интерфейсе командной строки, и не нужно ждать, пока пользователь запустит каждый этап последовательности. Например, в каталоге с тремя файлами исходного кода C, вместо того, чтобы вручную запускать четыре команды, необходимые для сборки из них финальной программы, можно вместо этого создать скрипт для оболочек, совместимых с POSIX , здесь названный build
и сохраненный в каталоге с ними, который будет компилировать их автоматически:
#!/bin/sh printf 'компиляция...\n'
cc -c foo.c cc -c bar.ccc -c qux.ccc -o myprog foo.o bar.o qux.o printf 'готово.\n'
Скрипт позволял пользователю сохранять редактируемый файл, приостанавливать редактор, а затем просто запускать его ./build
для создания обновленной программы, тестировать ее и возвращаться в редактор. Однако с 1980-х годов или около того скрипты такого типа были заменены утилитами вроде make , которые специализируются на сборке программ.
Простые пакетные задания не являются чем-то необычным для изолированных задач, но использование циклов оболочки, тестов и переменных обеспечивает гораздо большую гибкость для пользователей. Скрипт POSIX sh для преобразования изображений JPEG в изображения PNG, где имена изображений указываются в командной строке — возможно, с помощью подстановочных знаков — вместо того, чтобы каждое имя было указано в скрипте, может быть создан с помощью этого файла, обычно сохраняемого в файле типа/home/username/bin/jpg2png
#!/bin/sh для jpg ; do # использовать $jpg вместо каждого указанного имени файла, по очереди png = ${ jpg %.jpg } .png # создать версию PNG имени файла, заменив .jpg на .png printf 'converting "%s" ...\n' " $jpg " # вывести информацию о статусе пользователю, запустившему скрипт if convert " $jpg " jpg.to.png ; then # использовать convert (предоставленный ImageMagick) для создания PNG во временном файле mv jpg.to.png " $png " # если это сработало, переименовать временное изображение PNG в правильное имя else # ...иначе пожаловаться и выйти из скрипта printf > & 2 'jpg2png: error: failed output saved in "jpg.to.png".\n' exit 1 fi # конец тестовой конструкции "if" done # конец цикла "for" printf 'all conversions successful\n' # сообщить пользователю хорошие новости
Затем команду jpg2png
можно запустить для всего каталога, полного изображений JPEG, всего лишь/home/username/bin/jpg2png *.jpg
Многие современные оболочки также предоставляют различные функции, обычно встречающиеся только в более сложных языках программирования общего назначения , такие как конструкции потока управления, переменные, комментарии , массивы, подпрограммы и т. д. С такими функциями можно писать достаточно сложные приложения в виде скриптов оболочки. Однако они по-прежнему ограничены тем фактом, что большинство языков оболочек имеют слабую или не имеют никакой поддержки систем типизации данных, классов, потоков, сложной математики и других общих полноценных языковых функций, а также, как правило, намного медленнее, чем скомпилированный код или интерпретируемые языки, написанные с целью повышения скорости.
Стандартные инструменты Unix sed и awk предоставляют дополнительные возможности для программирования оболочки; Perl также может быть встроен в скрипты оболочки, как и другие языки сценариев, такие как Tcl . Perl и Tcl также поставляются с графическими инструментами.
К языкам сценариев, обычно встречающимся в установках операционных систем UNIX, Linux и POSIX-совместимых, относятся:
ksh
) в нескольких возможных версиях, таких как ksh88, Korn Shell '93 и другие.sh
), одна из старейших ракушек, до сих пор широко используемаяcsh
)bash
)tclsh
, оболочка, которая является основным компонентом языка программирования Tcl/Tk .Оболочки C и Tcl имеют синтаксис, весьма схожий с синтаксисом указанных языков программирования, а оболочки Korn и Bash являются разработками оболочки Bourne, которая основана на языке ALGOL с добавлением элементов ряда других. [4] С другой стороны, различные оболочки и инструменты, такие как awk , sed , grep и BASIC , Lisp , C и т. д., внесли свой вклад в язык программирования Perl . [5]
Другие оболочки, которые могут быть доступны на компьютере или для загрузки и/или покупки, включают:
ash
)nu
)msh
)zsh
особенно распространенная улучшенная KornShell)tcsh
).Сопутствующие программы, такие как оболочки на основе Python , Ruby , C , Java , Perl , Pascal , Rexx и т. д. в различных формах, также широко доступны. Другая довольно распространенная оболочка — Old shell ( osh
), на странице руководства которой указано, что она «является улучшенным, обратно совместимым портом стандартного командного интерпретатора из Sixth Edition UNIX». [6]
Так называемые удаленные оболочки, такие как
rsh
)ssh
)на самом деле являются всего лишь инструментами для запуска более сложной оболочки на удаленной системе и не имеют никаких характеристик, свойственных «оболочке».
Было введено много мощных скриптовых языков для задач, которые слишком велики или сложны для комфортного выполнения с помощью обычных скриптов оболочки, но для которых преимущества скрипта желательны, а накладные расходы на разработку полнофункционального, скомпилированного языка программирования были бы невыгодны. Специфика того, что отличает скриптовые языки от языков программирования высокого уровня, часто является источником споров, но, вообще говоря, скриптовый язык — это тот, который требует интерпретатора.
Скрипты оболочки часто служат начальной стадией разработки программного обеспечения и часто впоследствии подвергаются преобразованию в другую базовую реализацию, чаще всего в Perl , Python или C . Директива интерпретатора позволяет полностью скрыть детали реализации внутри скрипта, а не отображать их в виде расширения имени файла, и обеспечивает бесшовную повторную реализацию на разных языках без влияния на конечных пользователей.
Хотя файлы с расширением «.sh» обычно являются скриптами оболочки, большинство скриптов оболочки не имеют расширения имени файла. [7] [8] [9] [10]
Возможно, самое большое преимущество написания скрипта оболочки заключается в том, что команды и синтаксис точно такие же, как те, которые вводятся напрямую в командной строке. Программисту не нужно переключаться на совершенно другой синтаксис, как это было бы, если бы скрипт был написан на другом языке или если бы использовался компилируемый язык.
Часто написание скрипта оболочки происходит намного быстрее, чем написание эквивалентного кода на других языках программирования. К многочисленным преимуществам относятся простой выбор программы или файла, быстрый запуск и интерактивная отладка. Скрипт оболочки может использоваться для обеспечения последовательности и связи принятия решений вокруг существующих программ, а для скриптов среднего размера отсутствие этапа компиляции является преимуществом. Интерпретативный запуск упрощает написание отладочного кода в скрипт и его повторный запуск для обнаружения и исправления ошибок. Неопытные пользователи могут использовать скрипты для настройки поведения программ, а скрипты оболочки предоставляют некоторые ограниченные возможности для многопроцессорной обработки.
С другой стороны, скрипты оболочки склонны к дорогостоящим ошибкам. Непреднамеренные ошибки при наборе текста, такие как rm -rf * /
(вместо предполагаемого rm -rf */
), являются фольклором в сообществе Unix; один лишний пробел преобразует команду из той, которая удаляет все подкаталоги, содержащиеся в текущем каталоге, в ту, которая удаляет все из корневого каталога файловой системы . Подобные проблемы могут превратить cp
и mv
в опасное оружие, а неправильное использование >
перенаправления может удалить содержимое файла. Это становится еще более проблематичным из-за того, что многие команды UNIX отличаются в названии всего одной буквой: cp
, cd
, dd
, df
, и т. д.
Другим существенным недостатком является низкая скорость выполнения и необходимость запуска нового процесса почти для каждой выполненной команды оболочки. Когда работа скрипта может быть выполнена путем настройки конвейера , в котором эффективные команды фильтра выполняют большую часть работы, замедление смягчается, но сложный скрипт обычно на несколько порядков медленнее, чем обычная скомпилированная программа, которая выполняет эквивалентную задачу.
Существуют также проблемы совместимости между различными платформами. Ларри Уолл , создатель Perl , написал знаменитую фразу: «Проще портировать оболочку, чем скрипт оболочки». [11]
Аналогично, более сложные сценарии могут столкнуться с ограничениями самого языка сценариев оболочки; ограничения затрудняют написание качественного кода, а расширения различных оболочек для устранения проблем с исходным языком оболочки могут усугубить проблемы. [12]
Многие недостатки использования некоторых скриптовых языков вызваны недостатками синтаксиса или реализации языка и не обязательно вызваны использованием текстовой командной строки; существует ряд оболочек, использующих другие языки программирования оболочек или даже полноценные языки, такие как Scsh (который использует Scheme ).
Различные языки сценариев могут иметь много общих элементов, в основном из-за того, что они основаны на POSIX, и некоторые оболочки предлагают режимы для эмуляции различных оболочек. Это позволяет адаптировать скрипт оболочки, написанный на одном языке сценариев, к другому.
Одним из примеров этого является Bash, который предлагает ту же грамматику и синтаксис, что и оболочка Bourne, а также обеспечивает режим, совместимый с POSIX. [13] Таким образом, большинство скриптов оболочки, написанных для оболочки Bourne, могут быть запущены в BASH, но обратное может быть неверным, поскольку BASH имеет расширения, которых нет в оболочке Bourne. Таким образом, эти функции известны как башизмы. [14]
Программное обеспечение для взаимодействия, такое как 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-подобными. [15]
В дополнение к вышеупомянутым инструментам, некоторые функции POSIX и OS/2 могут использоваться с соответствующими подсистемами среды операционной системы Windows NT вплоть до Windows 2000. Третья, 16-битная подсистема, часто называемая подсистемой MS-DOS, использует Command.com, предоставляемый этими операционными системами, для запуска вышеупомянутых пакетных файлов MS-DOS. [16]
Консольные альтернативы 4DOS , 4OS2 , FreeDOS , 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 позволяют программам shell/batch вызывать такие инструменты, как KiXtart , QBasic , различные реализации BASIC , Rexx , Perl и Python , Windows Script Host и его установленные движки. В Unix и других системах, совместимых с POSIX , awk и sed используются для расширения возможностей обработки строк и чисел в скриптах оболочки. Tcl , Perl, Rexx и Python имеют графические наборы инструментов и могут использоваться для кодирования функций и процедур для сценариев оболочки, которые представляют собой узкое место скорости (C, Fortran, язык ассемблера и т. д. все еще намного быстрее), а также для добавления функциональности, недоступной в языке оболочки, такой как сокеты и другие функции подключения, сложная обработка текста, работа с числами, если вызывающий сценарий не имеет таких возможностей, самописный и самомодифицирующийся код, такие методы, как рекурсия , прямой доступ к памяти, различные типы сортировки и многое другое, которые трудно или невозможно реализовать в основном сценарии, и т. д. Visual Basic для приложений и VBScript можно использовать для управления и связи с такими вещами, как электронные таблицы, базы данных, программы со сценариями всех типов, телекоммуникационное программное обеспечение, инструменты разработки, графические инструменты и другое программное обеспечение, к которому можно получить доступ через компонентную объектную модель .
на самом деле является языком программирования: в ней есть переменные, циклы, принятие решений и т. д.
того, чтобы использовать расширение файла для сценариев оболочки, предпочтительнее оставить имя файла без расширения и позволить интерпретатору определить тип, просматривая shebang(#!).
Скриптам оболочки не требуется специальное расширение файла, поэтому оставьте расширение пустым (или вы можете добавить расширение .sh, если предпочитаете, но это не обязательно.