stringtranslate.com

Скрипт оболочки

Редактирование скрипта оболочки FreeBSD для настройки ipfirewall

Скрипт оболочки — это компьютерная программа, разработанная для запуска в оболочке 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 также поставляются с графическими инструментами.

Типичные языки сценариев POSIX

К языкам сценариев, обычно встречающимся в установках операционных систем UNIX, Linux и POSIX-совместимых, относятся:

Оболочки C и Tcl имеют синтаксис, весьма схожий с синтаксисом указанных языков программирования, а оболочки Korn и Bash являются разработками оболочки Bourne, которая основана на языке ALGOL с добавлением элементов ряда других. [4] С другой стороны, различные оболочки и инструменты, такие как awk , sed , grep и BASIC , Lisp , C и т. д., внесли свой вклад в язык программирования Perl . [5]

Другие оболочки, которые могут быть доступны на компьютере или для загрузки и/или покупки, включают:

Сопутствующие программы, такие как оболочки на основе Python , Ruby , C , Java , Perl , Pascal , Rexx и т. д. в различных формах, также широко доступны. Другая довольно распространенная оболочка — Old shell ( osh), на странице руководства которой указано, что она «является улучшенным, обратно совместимым портом стандартного командного интерпретатора из Sixth Edition UNIX». [6]

Так называемые удаленные оболочки, такие как

на самом деле являются всего лишь инструментами для запуска более сложной оболочки на удаленной системе и не имеют никаких характеристик, свойственных «оболочке».

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

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

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

Скрипты оболочки часто служат начальной стадией разработки программного обеспечения и часто впоследствии подвергаются преобразованию в другую базовую реализацию, чаще всего в 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 можно использовать для управления и связи с такими вещами, как электронные таблицы, базы данных, программы со сценариями всех типов, телекоммуникационное программное обеспечение, инструменты разработки, графические инструменты и другое программное обеспечение, к которому можно получить доступ через компонентную объектную модель .

Смотрите также

Ссылки

  1. ^ Керниган, Брайан В .; Пайк, Роб (1984), "3. Использование оболочки", Среда программирования UNIX , Prentice Hall, Inc., стр. 94, ISBN 0-13-937699-2Оболочка на самом деле является языком программирования: в ней есть переменные, циклы, принятие решений и т. д.
  2. ^ ab Джонсон, Крис (2009). Программирование Pro Bash: написание скриптов для оболочки Linux. Apress. ISBN 9781430219989. Получено 27 сентября 2019 г. .
  3. ^ "exec(3p) – Руководство программиста POSIX" . Получено 24.07.2020 .
  4. ^ Оболочки Unix на примере, стр. 7-10,
  5. ^ Программирование на Perl, 5-е издание, предисловие
  6. ^ "osh - manned.org". manned.org . Получено 2019-01-16 .
  7. ^ Роббинс, Арнольд; Ханна, Элберт; Лэмб, Линда (2008). Изучение редакторов vi и Vim. "O'Reilly Media, Inc.". стр. 205. ISBN 9781449313258.
  8. ^ Исттом, Чак (2012). Essential Linux Administration:: A Comprehensive Guide for Beginners. Course Technology/Cengage Learning. стр. 228. ISBN 978-1435459571.
  9. ^ Кумари, Синни (23 ноября 2015 г.). Linux Shell Scripting Essentials. Packt Publishing Ltd. ISBN 9781783552375. Получено 7 мая 2017 г. Вместо того, чтобы использовать расширение файла для сценариев оболочки, предпочтительнее оставить имя файла без расширения и позволить интерпретатору определить тип, просматривая shebang(#!).
  10. ^ Тейлор, Дэйв; Перри, Брэндон (16 декабря 2016 г.). Wicked Cool Shell Scripts, 2-е издание: 101 скрипт для Linux, OS X и UNIX-систем. No Starch Press. ISBN 9781593276027. Получено 7 мая 2017 г. . Скриптам оболочки не требуется специальное расширение файла, поэтому оставьте расширение пустым (или вы можете добавить расширение .sh, если предпочитаете, но это не обязательно.
  11. Ларри Уолл (4 января 1991 г.). «Нахождение последнего аргумента». Группа новостей : comp.unix.shell . Получено 5 января 2023 г.
  12. ^ Кристиансен, Том. «Программирование CSH считается вредным».
  13. ^ «Основные отличия от оболочки Борна».
  14. ^ «24 башизма, которых следует избегать в скриптах оболочки, совместимых с POSIX». 18 мая 2022 г.
  15. ^ MSDN [ недостаточно конкретны для проверки ]
  16. ^ Комплект ресурсов рабочей станции Windows NT 4

Внешние ссылки