Сценарий оболочки
Эта статья нуждается в дополнительных цитатах для проверки . ( февраль 2014 г. ) |
Сценарий оболочки — это компьютерная программа, предназначенная для запуска оболочкой 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
используется), и "$@"
вызывает любые параметры, заданные для l
для передачи в качестве параметров в ls, чтобы можно было использовать все обычные параметры и другой синтаксис, известный ls.
Затем пользователь может просто использовать l
для наиболее часто используемого короткого списка.
Другим примером сценария оболочки, который можно использовать в качестве ярлыка, может быть печать списка всех файлов и каталогов в заданном каталоге.
#!/bin/sh
clear
ls -al
В этом случае сценарий оболочки будет начинаться с обычной стартовой строки #!/bin/sh . После этого скрипт выполняет команду Clear , которая очищает терминал от всего текста перед переходом к следующей строке. Следующая строка предоставляет основную функцию скрипта. Команда ls -al выводит список файлов и каталогов, находящихся в каталоге, из которого запускается сценарий. Атрибуты команды ls можно изменить в соответствии с потребностями пользователя.
Пакетные задания
[ редактировать ]Сценарии оболочки позволяют автоматически выполнять несколько команд, которые можно было бы ввести вручную в интерфейсе командной строки, без необходимости ждать, пока пользователь активирует каждый этап последовательности. Например, в каталоге с тремя файлами исходного кода C вместо того, чтобы вручную запускать четыре команды, необходимые для сборки из них окончательной программы, можно вместо этого создать сценарий для POSIX -совместимых оболочек, названный здесь build
и хранить в каталоге с ними, что автоматически скомпилирует их:
#!/bin/sh
printf 'compiling...\n'
cc -c foo.c
cc -c bar.c
cc -c qux.c
cc -o myprog foo.o bar.o qux.o
printf 'done.\n'
Сценарий позволит пользователю сохранить редактируемый файл, приостановить работу редактора, а затем просто запустить ./build
создать обновленную программу, протестировать ее и затем вернуться в редактор. Однако примерно с 1980-х годов сценарии этого типа были заменены утилитами, такими как make , которые специализируются на создании программ.
Обобщение
[ редактировать ]Простые пакетные задания не являются чем-то необычным для изолированных задач, но использование циклов оболочки, тестов и переменных обеспечивает пользователям гораздо большую гибкость. С помощью этого файла можно создать сценарий POSIX sh для преобразования изображений JPEG в изображения PNG, где имена изображений указываются в командной строке (возможно, с помощью подстановочных знаков) вместо того, чтобы каждое из них было указано в сценарии. Обычно он сохраняется в файле типа /home/username/bin/jpg2png
#!/bin/sh
for jpg; do # use $jpg in place of each filename given, in turn
png=${jpg%.jpg}.png # construct the PNG version of the filename by replacing .jpg with .png
printf 'converting "%s" ...\n' "$jpg" # output status info to the user running the script
if convert "$jpg" jpg.to.png; then # use convert (provided by ImageMagick) to create the PNG in a temp file
mv jpg.to.png "$png" # if it worked, rename the temporary PNG image to the correct name
else # ...otherwise complain and exit from the script
printf >&2 'jpg2png: error: failed output saved in "jpg.to.png".\n'
exit 1
fi # the end of the "if" test construct
done # the end of the "for" loop
printf 'all conversions successful\n' # tell the user the good news
The jpg2png
Затем команду можно запустить для всего каталога, полного изображений JPEG, всего лишь /home/username/bin/jpg2png *.jpg
Программирование
[ редактировать ]Многие современные оболочки также предоставляют различные функции, обычно встречающиеся только в более сложных языках программирования общего назначения , такие как конструкции потока управления, переменные, комментарии , массивы, подпрограммы и так далее. Имея такие возможности, можно писать достаточно сложные приложения в виде сценариев оболочки. Однако они по-прежнему ограничены тем фактом, что большинство языков оболочки практически не поддерживают системы типизации данных, классы, многопоточность, сложную математику и другие общие полнофункциональные функции языка, а также, как правило, намного медленнее, чем скомпилированный код или написанные интерпретируемые языки. со скоростью как целью производительности.
Стандартные инструменты Unix sed и awk предоставляют дополнительные возможности для программирования оболочки; Perl также может быть встроен в сценарии оболочки, как и другие языки сценариев, такие как Tcl . Perl и Tcl также поставляются с наборами графических инструментов.
Типичные языки сценариев POSIX
[ редактировать ]Языки сценариев, обычно встречающиеся в установках операционных систем, совместимых с UNIX, Linux и POSIX, включают:
- КорнШелл (
ksh
) в нескольких возможных версиях, таких как ksh88, Korn Shell '93 и других. - Оболочка Борна (
sh
), один из старейших снарядов, до сих пор распространенных в использовании. - Оболочка C (
csh
) - GNU Баш (
bash
) tclsh
, оболочка, которая является основным компонентом языка программирования Tcl/Tk .- Желанием является оболочка Tcl/Tk на основе графического интерфейса.
Оболочки C и Tcl имеют синтаксис, очень похожий на синтаксис указанных языков программирования, а оболочки Korn и Bash являются развитием оболочки Bourne, основанной на языке ALGOL с добавленными элементами ряда других. [ 4 ] С другой стороны, различные оболочки, а также такие инструменты, как awk , sed , grep , BASIC , Lisp , C и т. д., внесли свой вклад в язык программирования Perl . [ 5 ]
Другие оболочки, которые могут быть доступны на компьютере или для загрузки и/или покупки, включают:
- Оболочка Альмквиста (
ash
) - PowerShell (
msh
) - Z оболочка (
zsh
, особенно распространенный улучшенный KornShell) - Компания Tenex C Shell (
tcsh
).
сопутствующие программы, такие как оболочки на основе Python , Ruby , C , Java , Perl , Pascal , Rexx Также широко доступны и т. д. в различных формах. Еще одна распространенная оболочка — Oldshell ( osh
), на странице руководства которого указано, что это «расширенный обратно совместимый порт стандартного интерпретатора команд из шестого издания 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 для 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 можно использовать для управления и взаимодействия с такими вещами, как электронные таблицы, базы данных, программы со сценариями всех типов, телекоммуникационное программное обеспечение, инструменты разработки, графические инструменты и другое программное обеспечение, доступ к которому можно получить через объектную модель компонентов .
См. также
[ редактировать ]- Код клея
- Директива интерпретатора
- Символ Шебанга (#!)
- оболочки Unix
- PowerShell
- Хост сценариев Windows
Ссылки
[ редактировать ]- ^ Керниган, Брайан В .; Пайк, Роб (1984), «3. Использование оболочки», Среда программирования UNIX , Prentice Hall, Inc., стр. 94, ISBN 0-13-937699-2 ,
Оболочка на самом деле является языком программирования: в ней есть переменные, циклы, принятие решений и так далее.
- ^ Jump up to: а б Джонсон, Крис (2009). Программирование Pro Bash: написание сценариев для оболочки Linux . Апресс. ISBN 9781430219989 . Проверено 27 сентября 2019 г.
- ^ «exec(3p) — Руководство программиста POSIX» . Проверено 24 июля 2020 г.
- ^ Оболочки Unix на примере, стр. 7-10,
- ^ Программирование на Perl, 5-е издание, предисловие
- ^ «Ош — manned.org» . Manned.org . Проверено 16 января 2019 г.
- ^ Роббинс, Арнольд; Ханна, Эльберт; Лэмб, Линда (2008). Изучение редакторов vi и Vim . «О'Рейли Медиа, Инк.». п. 205. ИСБН 9781449313258 .
- ^ Исттом, Чак (2012). Essential Linux Administration:: Комплексное руководство для начинающих . Курсовая технология/Cengage Learning. п. 228. ИСБН 978-1435459571 .
- ^ Кумари, Синни (23 ноября 2015 г.). Основы создания сценариев оболочки Linux . Packt Publishing Ltd. ISBN 9781783552375 . Проверено 7 мая 2017 г.
Вместо использования расширения файла для сценариев оболочки предпочтительнее оставить имя файла без расширения и позволить интерпретатору определить тип, просмотрев shebang(#!).
- ^ Тейлор, Дэйв; Перри, Брэндон (16 декабря 2016 г.). Wicked Cool Shell Scripts, 2-е издание: 101 сценарий для систем Linux, OS X и UNIX . Нет крахмального пресса. ISBN 9781593276027 . Проверено 7 мая 2017 г.
Скриптам оболочки не требуется специальное расширение файла, поэтому оставьте расширение пустым (или вы можете добавить расширение .sh, если хотите, но это не обязательно).
- ^ Ларри Уолл (4 января 1991 г.). «Нахождение последнего аргумента» . Группа новостей : comp.unix.shell . Проверено 5 января 2023 г.
- ^ Кристиансен, Том. «Программирование Csh считается вредным» .
- ^ «Основные отличия от Bourne Shell» .
- ^ «24 Bashism, которых следует избегать в POSIX-совместимых сценариях оболочки» . 18 мая 2022 г.
- ^ MSDN [ недостаточно конкретно, чтобы проверить ]
- ^ Комплект ресурсов для рабочей станции Windows NT 4
Внешние ссылки
[ редактировать ]- Введение в программирование в командной оболочке Грега Гебеля
- Учебное пособие по написанию сценариев оболочки UNIX/Linux от Стива Паркера
- Руководство по написанию сценариев оболочки (Apple)
- На что следует обратить внимание при написании переносимых сценариев оболочки Питера Сибаха
- Бесплатные книги по написанию сценариев Unix Shell
- Начинающие/BashScripting , Ubuntu Linux