Самый универсальный язык сценариев для Linux?

24

Мы пишем сценарии для систем Linux, были некоторые споры о том, какой язык сценариев Linux наиболее универсален для использования. Bash, SH, Posix? Какая?

Жиль "ТАК - перестань быть злым"
источник
3
Я предполагаю sh.
Блендер
У вас есть список целевых дистрибутивов? Или обязательные / желательные дистрибутивы, на которых он должен работать?
4
«ш»? Что за "ш"? Оболочка Томсона? оболочка Борна? bash, ksh, pdksh, ash, zsh как в /bin/shсистеме X или Y ? Спецификация POSIX sh, спецификация SUSv3, SUSv4 sh, спецификация LSB sh? «ш» само по себе ничего не значит.
Стефан Шазелас
1
если это для сборок программного обеспечения и установки сценариев, вы можете проверить Autotools, который пытается решить проблемы компиляции между системами.
Ложь Райану
1
@sch Наиболее переносимое общее пересечение, «очевидно». В случае, если люди, незнакомые с оболочками Unix, будут введены в заблуждение вашим комментарием, спецификация POSIX реализуется почти всеми современными оболочками, которые осмеливаются называться по имени sh, и несоответствующими, shкоторые не являются древними и редкими в наше время (например, Борн). Можно вычеркнуть постоянно растущий список расширений и вариаций, но если цель является «универсальной» или переносимостью, нужно идти в противоположном направлении. Ответ Жиля охватывает детали более подробно.
jw013

Ответы:

38

В каждой unix-подобной операционной системе есть две среды программирования, которые являются Turing-Complete и могут вызывать другие программы: awk и sh , семейство оболочек Bourne / POSIX. AWK ориентирован на обработку текста (он дополняет более специализированные утилиты), тогда как sh ориентирован на то, чтобы быть связующим языком для объединения программ. Sh - это универсальный язык сценариев для Linux и всего мира Unix.

Стандарт POSIX определяет обязательные функции самого sh и связанных утилит. Большинство unix-подобных систем соответствуют стандарту POSIX 1003.1-2004 (он же Single Unix v3, он же выпуск 6, посвященный спецификации Open Group Base); последней версией этого стандарта является POSIX 1003.1-2008 (он же Single Unix v4, он же выпуск 7, посвященный спецификации Open Group Base).

Каждая Linux и Unix или Unix-подобная система имеет оболочку в стиле Борна /bin/sh, а любая неантикварная система имеет POSIX-совместимую оболочку (исключая случайную ошибку). Каждая современная Unix-подобная система (включая Linux) поддерживает shebangs , поэтому она автоматически запускает сценарии, /bin/shесли первая строка #!/bin/sh. Существуют системы POSIX, которые shрасположены в другом месте (как правило, уровни эмуляции в ОС, о которых вы даже не думаете, что они действительно похожи на Unix).

Встраиваемые системы Linux могут иметь урезанную систему BusyBox , которая не поддерживает все функции POSIX. BusyBox имеет большое количество опций времени компиляции для размещения систем небольшого размера, поэтому сложно заранее знать, чего ожидать, вам нужно адаптировать свои скрипты для конкретного устройства. BusyBox - наиболее распространенная реализация sh и различных утилит; Еще одна проблема, с которой вы можете столкнуться - это чрезвычайно ограниченная оболочка в Android (более поздние версии менее анемичны).

Не встроенные системы Linux почти всегда имеют либо dash, либо bash as /bin/sh. Dash - это небольшая и быстрая оболочка, которая реализует чуть больше, чем функции POSIX. Bash - это большая оболочка с большим количеством функций.

Во встроенных системах Linux почти всегда установлен Bash как /bin/bash. Следовательно, для переносимости в не встроенных системах Linux вы можете предположить, что bash доступен. В число полезных дополнительных функций bash входят массивы, возможность удобного управления точечными файлами, pipestatusпеременная для получения статуса возврата всех команд в конвейере, дополнительные операторы сравнения для времени файлов и (в последних версиях) сопоставление регулярных выражений. ,

Одной из характеристик программирования оболочки является то, что вы используете не только shпрограмму, но и ряд утилит . Большинство утилит для работы с файлами и обработки текста в Linux - это GNU coreutils (во встроенных системах они обычно от BusyBox).

Если вам нужна мобильность помимо Linux, лучше всего придерживаться POSIX. В других вариантах Unix может не быть установлен bash (bash является частью стандартной установки на OSX, но является дополнительным пакетом на * BSD и в большинстве коммерческих приложений). Почти все варианты Unix, кроме Linux и OSX (т. Е. * BSD и коммерческие версии), имеют некоторую версию оболочки Korn , по крайней мере, pdksh . Многие из удобных расширений bash взяты из ksh, поэтому может быть полезно написать сценарии, которые могут работать под обоими, но обнаружение, где bash или ksh расположены в неизвестной системе, может быть немного трудным.

Оболочка не может делать все. Если вам нужен более сложный язык, два наиболее распространенных варианта - это Perl и Python (все остальное далеко позади как язык сценариев Unix). Perl является традиционным языком сценариев, и немногим не встроенным системам Linux его не хватает, но Python набирает силу (отчасти благодаря тому, что он является рекомендуемым языком сценариев для Ubuntu). В мире, отличном от Linux, Perl является частью базовой установки на OSX и OpenBSD; это необязательно, но очень часто устанавливается во FreeBSD, и необязательно, но часто устанавливается в NetBSD.

Жиль "ТАК - перестань быть злым"
источник
1
"частично усилено ..." Это и является обязательным требованием в системах Fedora и RHEL.
Игнасио Васкес-Абрамс
В основном согласен со всем этим. Просто несколько разных акцентов: * некоторые дистрибутивы основаны на BusyBox, но не обязательно встроены (я использую один, Alpine). (Конечно, ответ действительно говорят «почти всегда».) * BSDs являются большой класс Unix-подобных систем , в которых вы не можете предположить , Баш по умолчанию. * Dash может делать почти все, что может Bash, просто иногда требуется больше внимания. * Если вам нужен более сложный язык, да, Perl и Python являются наиболее распространенными вариантами, но awk еще более распространен и подходит для многих целей. Это также обычно недооценивается. Но он легче, чем Perl и Python.
dubiousjim
2
Впрочем, справедливое предупреждение - FreeBSD удалила Perl из установки по умолчанию некоторое время назад. Кроме того, я не знаю ни одного другого дистрибутива, у которого нет Perl в базовой установке.
TC1
@ TC1 Perl всегда был необязательным в NetBSD. Это в базовой системе на OpenBSD.
Жиль "ТАК - перестань быть злым"
@dubiousjim Только Linux (не встроенный или достаточно хороший пример на практике) и OSX имеют bash при установке по умолчанию; * BSD имеют pdksh или mksh, а коммерческие подразделения имеют ATT ksh.
Жиль "ТАК - перестань быть злым"
11

В наличии заказа:

  1. sh, но придерживайтесь указанных в POSIX средств.
  2. bash, но не забудьте явно указать его в шебанге, иначе вы можете получить тире.
  3. Python. Почти все используют это.
  4. Perl. Но вы можете написать это.

После этого никому нет до этого дела, потому что вы ничего не можете сделать с ними.

Игнасио Васкес-Абрамс
источник
10
Я бы поставил PERL перед python, он установлен по умолчанию в большинстве систем Linux.
Тердон
4
Perl # 3. И вы можете написать это, бонус! :)
Уоррен Янг
2
Я согласен с @ignacio perl # 4 и python # 3. Причина очевидна. Я думаю, что Python - это эволюция Perl.
Багавадхар
5
@ashwin: Нет, python не является эволюцией или даже не похож на Perl. Perl - это язык системных администраторов для системных администраторов. Python - это язык программистов для программистов. Эта разница имеет решающее значение. Они оба имеют свое применение, и хотя в сценариях использования может быть много совпадений, для некоторых задач perl - лучший выбор, а для других - явно превосходнее python.
Cas
1
Ruby и PHP были вдохновлены Perl. Python является результатом физического эксперимента, в котором они создали анти-Perls в суперколлайдере. (Я ничего не имею против Python. Плюсы и минусы, плюсы и минусы.)
Уоррен Янг
4

Обычно я бы сказал sh.... но так как вы указали Linux, я скажу bash- он гарантированно будет в каждой системе Linux (ну, исключая неясные педантично крошечные, которые фетишизируют минимализм :).

Если вам не нужно заботиться о переносимости не из Linux (и если вам не нужно работать на крошечных дистрибутивах или во встроенных устройствах Linux, таких как маршрутизаторы с пластиковыми коробками), то вы также можете использовать значительные улучшения, которые это предлагает по равнине sh. В противном случае используйте sh.

После того, как bashsh), следующий самый «универсальный» язык сценариев для Linux будет некоторый диалект awk- обычно или mawkили gawk. Если вы придерживаетесь простого awk и избегаете gawkism, ваш скрипт должен нормально работать практически на любой системе Linux (он может отсутствовать на крошечных дистрибутивах или встроенных устройствах). Большинство систем Linux будут иметь и то, mawkи другое gawk, но в некоторых дистрибутивах (например, Debian) mawkустановлено по умолчанию, и вы должны установить gawkсебя, если хотите.

Дальше будет perl. AFAIK, базовый язык Perl установлен по умолчанию на всех распространенных дистрибутивах Linux, что делает его хорошим выбором. Еще более к счастью, существует очень небольшая несовместимость версий с выпусками perl5 (хотя perl 5.12 или, возможно, 5.14, наконец-то нашли способ удалить некоторые неясные функции, которые устарели в течение примерно 15 лет ... достаточное предупреждение, чтобы не использовать их), так что если ваш стиль кодирования не является действительно странным, и вы не хотите игнорировать более чем десятилетние предупреждения «не делайте этого», ваши Perl-скрипты будут работать нормально где угодно. Язык является надежным и мощным , и может делать все , что awkи sedможет сделать , и многое другое. С небольшим усилием это может сделать вещи, которыеshтрадиционно хорошо подходит для этого (например, запуск внешних команд и использование / передача вывода). Стандартные библиотеки Perl также довольно обширны и охватывают не только основы.

Единственный недостаток perl заключается в том, что существует также огромная библиотека модулей CPAN, позволяющая делать практически все, о чем вы только можете подумать (и многое другое, что может вам никогда не понадобиться) - и не все из них будут доступны в каждой системе с perl. , Они, как правило, очень высокого качества, поэтому легко привыкнуть к их использованию, но если вы их используете, вам нужно убедиться, что они установлены. Многие модули CPAN предварительно упакованы для Linux, а остальные легко устанавливаются с помощью инструмента cpan (или dh-make-perlв debian / ubuntu / etc, чтобы превратить модуль CPAN в пакет .deb).

Я хотел бы сказать pythonследующее, но я действительно не могу. В Python есть что-то, что может понравиться, но он не включен по умолчанию во многих системах Linux, и, честно говоря, его совместимость с версиями (как для самого Python, так и для его якобы «стандартных» библиотек) является полной ошибкой. Некоторые дистрибутивы прилагают отличные усилия, чтобы разобраться в беспорядке, а некоторые нет. Также не помогает тот факт, что python в основном является языком, написанным для программистов программистами (в отличие от sysadmins), и они, кажется, не думают, что система, в которой будет установлен их код, вообще важна… их код действительно супер особенный, поэтому им не нужно заниматься скучными вещами, такими как интеграция в существующие системы.

(Не поймите неправильно из моего сарказма здесь - мне действительно нравится Python как язык, я просто ненавижу тот факт, что управление версиями и зависимостями - это PITA. Это похоже на 20 с лишним лет назад, до эпохи ручного поиска неизвестного. кусочки кода и патчи, чтобы что-то скомпилировать и запустить на проприетарном * nix)

саз
источник
Я знаю, что это старый пост, но лучший способ обойти это - указать, какая версия в шебанге (например /usr/bin/python2, /usr/bin/python3).
Исия Медоуз
1

Я бы посоветовал следовать ksh93 или даже POSIX, и вы всегда можете использовать bash / zsh для запуска.

И дистрибутив на основе Debian по умолчанию использует mawk, а не gawk. Так что да, избегайте добавления gawk, так как mawk работает намного быстрее.

Моя вина
источник
0

Не баш. Пишите в ближний к POSIX ш, как тире или пепел. Это будет наиболее универсальным. Я не думаю, что есть что-то еще, что даже близкий конкурент. (И это кажется мне фактическим вопросом, а не «мнением», как жалуется один из комментаторов.)

Если вам нужно что-то более мощное, чем sh (например, если вам нужны реальные ассоциативные массивы), используйте awk. (Избегайте расширений gawk. Существует много версий awk, но в основном есть общее ядро.) Это должно быть доступно почти так же широко, как и sh.

dubiousjim
источник
1
awk-on-Linux является универсальным gawk; Я не могу придумать ни одного дистрибутива, у которого есть другой вариант по умолчанию.
Игнасио Васкес-Абрамс
5
Какие варианты Linux не поддерживают bash?
Джонатан Леффлер
1
Конечно, bashможет быть установлен и запущен на (почти) любой Linux-системе, но многие пользователи Debian будут устанавливать только dashи предпочитают не устанавливать bash.
Уильям Перселл
6
@WilliamPursell Пакет bash помечен как Essential в Debian (т. Е. Для удаления необходимо пройти через обручи, с достаточным количеством предупреждений о том, что это повлияет на вашу систему). Bash практически универсален для не встроенных систем Linux.
Жиль "ТАК - перестань быть злым"
1
@JonathanLeffler: наоборот, встроенные могут иметь только Busybox.
Механическая улитка
0

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

  1. ш
  2. AWK
  3. Perl (я еще не видел * nix без него, включая BSD)

Хотя Python звучит как хороший язык, я не использовал ни одну ОС, поставляемую с ним, в базовой установке, хотя, видимо, Ubuntu, может быть?

Earlz
источник
0

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

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

Я могу вспомнить несколько сценариев и упомянуть некоторые полезные для них инструменты.

FTP-файлы туда-сюда; обработать их; отправлять уведомления по электронной почте; и так далее

В этом случае было бы лучше придерживаться оболочки (например, Bash) и использовать различные утилиты (например ftp, cronи mail). Это типичный пример использования во многих крупных компаниях.

Быстрая обработка текста

Еще раз, оболочка. Утилиты нравится grep, awk, sed, pasteи другие очень удобны в этом случае.

Сложение

В области C / C ++ универсальным инструментом для этого является make. Мир Java предпочитает Apache ANT.

Развертывание и удаленное управление

Либо оболочка, либо Python. Например, scpи rsync, соответственно, было бы весьма полезно при копировании файла (ов) или синхронизации файлов.

Python, с другой стороны, имеет очень полезный модуль с именем fabric. Это было бы полезно для более сложных операций, например, для копирования файлов, остановки какого-либо процесса, настройки сервера и аналогичным образом. Кроме того, Python также предоставляет модуль, pipкоторый может решить указанные зависимости путем загрузки и установки соответствующих пакетов.

(Обратите внимание, что в приведенных выше предложениях основное внимание уделяется не функциям оболочки , а скорее различным доступным утилитам.)

Барун
источник
-1

Извините, Perl отсутствует в базе FreeBSD, NetBSD или DragonflyBSD. OpenBSD имеет Perl в базовой установке. В настоящее время OS X является сертифицированным UNIX и на некотором уровне может рассматриваться как своего рода вариант BSD, в основе которого лежат Perl, Python и Ruby.

Многие проприетарные UNIXen не имеют Perl в своей базе, например Solaris, AFAIK или HP-UX или IBM AIX тоже ...

Марко В.
источник
Ваше утверждение о том, что в Solaris отсутствует Perl, неверно. Perl является обязательным основным компонентом Solaris по крайней мере с 2005 года (Solaris 10).
Jlliagre