Мы пишем сценарии для систем Linux, были некоторые споры о том, какой язык сценариев Linux наиболее универсален для использования. Bash, SH, Posix? Какая?
linux
shell
scripting
portability
Жиль "ТАК - перестань быть злым"
источник
источник
sh
./bin/sh
системе X или Y ? Спецификация POSIX sh, спецификация SUSv3, SUSv4 sh, спецификация LSB sh? «ш» само по себе ничего не значит.sh
, и несоответствующими,sh
которые не являются древними и редкими в наше время (например, Борн). Можно вычеркнуть постоянно растущий список расширений и вариаций, но если цель является «универсальной» или переносимостью, нужно идти в противоположном направлении. Ответ Жиля охватывает детали более подробно.Ответы:
В каждой 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.
источник
В наличии заказа:
После этого никому нет до этого дела, потому что вы ничего не можете сделать с ними.
источник
Обычно я бы сказал
sh
.... но так как вы указали Linux, я скажуbash
- он гарантированно будет в каждой системе Linux (ну, исключая неясные педантично крошечные, которые фетишизируют минимализм :).Если вам не нужно заботиться о переносимости не из Linux (и если вам не нужно работать на крошечных дистрибутивах или во встроенных устройствах Linux, таких как маршрутизаторы с пластиковыми коробками), то вы также можете использовать значительные улучшения, которые это предлагает по равнине
sh
. В противном случае используйтеsh
.После того, как
bash
(иsh
), следующий самый «универсальный» язык сценариев для 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
).Я бы посоветовал следовать ksh93 или даже POSIX, и вы всегда можете использовать bash / zsh для запуска.
И дистрибутив на основе Debian по умолчанию использует mawk, а не gawk. Так что да, избегайте добавления gawk, так как mawk работает намного быстрее.
источник
Не баш. Пишите в ближний к POSIX ш, как тире или пепел. Это будет наиболее универсальным. Я не думаю, что есть что-то еще, что даже близкий конкурент. (И это кажется мне фактическим вопросом, а не «мнением», как жалуется один из комментаторов.)
Если вам нужно что-то более мощное, чем sh (например, если вам нужны реальные ассоциативные массивы), используйте awk. (Избегайте расширений gawk. Существует много версий awk, но в основном есть общее ядро.) Это должно быть доступно почти так же широко, как и sh.
источник
bash
?bash
может быть установлен и запущен на (почти) любой Linux-системе, но многие пользователи Debian будут устанавливать толькоdash
и предпочитают не устанавливатьbash
.Я бы сказал, что наличие будет ранжироваться где-то в следующем порядке:
Хотя Python звучит как хороший язык, я не использовал ни одну ОС, поставляемую с ним, в базовой установке, хотя, видимо, Ubuntu, может быть?
источник
Я считаю, что эксперты здесь уже предоставили отличные предложения, которые должны помочь вам принять решение. Удобство и доступность различных оболочек были хорошо описаны в других постах.
С другой стороны, на вашем месте я бы также рассмотрел цель, которую хочу достичь с помощью сценариев. У каждого инструмента есть свои достоинства и недостатки. Поэтому, хотя я в основном использую Python, я не буду использовать это в каждом случае.
Я могу вспомнить несколько сценариев и упомянуть некоторые полезные для них инструменты.
FTP-файлы туда-сюда; обработать их; отправлять уведомления по электронной почте; и так далее
В этом случае было бы лучше придерживаться оболочки (например, Bash) и использовать различные утилиты (например
ftp
,cron
иmail
). Это типичный пример использования во многих крупных компаниях.Быстрая обработка текста
Еще раз, оболочка. Утилиты нравится
grep
,awk
,sed
,paste
и другие очень удобны в этом случае.Сложение
В области C / C ++ универсальным инструментом для этого является
make
. Мир Java предпочитает Apache ANT.Развертывание и удаленное управление
Либо оболочка, либо Python. Например,
scp
иrsync
, соответственно, было бы весьма полезно при копировании файла (ов) или синхронизации файлов.Python, с другой стороны, имеет очень полезный модуль с именем
fabric
. Это было бы полезно для более сложных операций, например, для копирования файлов, остановки какого-либо процесса, настройки сервера и аналогичным образом. Кроме того, Python также предоставляет модуль,pip
который может решить указанные зависимости путем загрузки и установки соответствующих пакетов.(Обратите внимание, что в приведенных выше предложениях основное внимание уделяется не функциям оболочки , а скорее различным доступным утилитам.)
источник
Извините, Perl отсутствует в базе FreeBSD, NetBSD или DragonflyBSD. OpenBSD имеет Perl в базовой установке. В настоящее время OS X является сертифицированным UNIX и на некотором уровне может рассматриваться как своего рода вариант BSD, в основе которого лежат Perl, Python и Ruby.
Многие проприетарные UNIXen не имеют Perl в своей базе, например Solaris, AFAIK или HP-UX или IBM AIX тоже ...
источник