stringtranslate.com

Сценарий оболочки

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

Сценарий оболочки — это компьютерная программа , предназначенная для запуска оболочкой Unix , интерпретатором командной строки . [1] Различные диалекты сценариев оболочки считаются языками сценариев . Типичные операции, выполняемые сценариями оболочки, включают манипулирование файлами, выполнение программы и печать текста. Сценарий, который настраивает среду, запускает программу и выполняет всю необходимую очистку или протоколирование, называется оболочкой .

Этот термин также используется в более общем смысле для обозначения автоматизированного режима запуска оболочки операционной системы; каждая операционная система использует определенное имя для этих функций, включая пакетные файлы (поток MSDos-Win95, OS/2 ), командные процедуры (VMS) и сценарии оболочки ( поток Windows NT и сторонние производные, такие как 4NT — статья находится в cmd. exe ), а операционные системы мэйнфреймов связаны с рядом терминов.

Оболочки, обычно присутствующие в Unix и Unix-подобных системах, включают оболочку Korn , оболочку Bourne и GNU Bash . Хотя операционная система Unix может иметь другую оболочку по умолчанию, например Zsh в macOS , эти оболочки обычно присутствуют для обратной совместимости.

Возможности

Комментарии

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

Настраиваемый выбор языка сценариев

Shebang или hash-bang — это особый вид комментария, который система использует, чтобы определить , какой интерпретатор использовать для выполнения файла. Шебанг должен быть первой строкой файла и начинаться с " #!". [2] В Unix-подобных операционных системах символы после #!префикса « » интерпретируются как путь к исполняемой программе, которая будет интерпретировать сценарий. [3]

Ярлыки

Сценарий оболочки может представлять собой удобный вариант системной команды, в котором автоматически применяются специальные настройки среды, параметры команды или постобработка, но таким образом, чтобы новый сценарий продолжал действовать как совершенно обычная команда Unix .

Одним из примеров может быть создание версии ls , команды для вывода списка файлов, присвоение ей более короткого имени команды l, которое обычно сохраняется в binкаталоге пользователя как , и предварительно заданного набора параметров команды по умолчанию./home/username/bin/l

#!/bin/sh LC_COLLATE = C  ls  -FCas " $@ " 

Здесь в первой строке используется шебанг, чтобы указать, какой интерпретатор должен выполнить остальную часть сценария, а вторая строка составляет список с параметрами для индикаторов формата файла, столбцов, всех файлов (ни один не пропущен) и размера в блоках. Устанавливает LC_COLLATE=Cпорядок сортировки по умолчанию, чтобы не складывать прописные и строчные буквы вместе, не смешивать точечные файлы с обычными именами файлов, что является побочным эффектом игнорирования знаков препинания в именах (точечные файлы обычно отображаются только в том случае, если -aиспользуется опция Like), и "$@"вызывает любые параметры. задано lдля передачи в качестве параметров в ls, так что все обычные параметры и другой синтаксис, известный ls, по-прежнему можно использовать.

Затем пользователь может просто использовать lнаиболее часто используемый краткий список.

Другим примером сценария оболочки, который можно использовать в качестве ярлыка, может быть печать списка всех файлов и каталогов в заданном каталоге.

#!/бин/шпрозрачныйлс  -ал

В этом случае сценарий оболочки будет начинаться с обычной стартовой строки #!/bin/sh . После этого скрипт выполняет команду Clear , которая очищает терминал от всего текста перед переходом к следующей строке. Следующая строка предоставляет основную функцию скрипта. Команда ls -al выводит список файлов и каталогов, находящихся в каталоге, из которого запускается сценарий. Атрибуты команды ls можно изменить в соответствии с потребностями пользователя.

Пакетные задания

Сценарии оболочки позволяют автоматически выполнять несколько команд, которые можно было бы ввести вручную в интерфейсе командной строки, без необходимости ждать, пока пользователь активирует каждый этап последовательности. Например, в каталоге с тремя файлами исходного кода C вместо того, чтобы вручную запускать четыре команды, необходимые для сборки из них окончательной программы, можно вместо этого создать сценарий для POSIX -совместимых оболочек, названный здесь buildи хранящийся в каталоге с ними. , который скомпилирует их автоматически:

#!/bin/sh printf 'компиляция...\n'
cc -c foo.c   cc  -c  бар.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 " # выводить информацию о статусе пользователю, выполняющему скрипт, если конвертировать " $jpg " jpg.to.png ; then # используйте команду Convert (предоставленную ImageMagick) для создания PNG во временном файле mv jpg.to.png " $png " # если это сработало, переименуйте временное изображение PNG в правильное имя else # ...в противном случае сообщите и выйдите из сценария printf > & 2 'jpg2png: error: неудачный вывод сохранен в "jpg.to.png".\n' exit 1 fi # завершение тестовой конструкции "if" сделано # завершение цикла "for" printf 'все преобразования успешны\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), на странице руководства которой указано, что она «представляет собой расширенный, обратно совместимый порт стандартного командного интерпретатора из шестого издания 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 для UNIX), оболочка Hamilton C , 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), OS/ 2 cmd.exe и 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 для приложений и VBScript можно использовать для управления и взаимодействия с такими вещами, как электронные таблицы, базы данных, программы со сценариями всех типов, телекоммуникационное программное обеспечение, инструменты разработки, графические инструменты и другое программное обеспечение, доступ к которому можно получить через объектную модель компонентов .

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

Рекомендации

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

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