Какой на сегодняшний день лучший (переносимый и поддерживаемый) язык сценариев оболочки?

Я знаю, что на этот вопрос в прошлом были начаты «религиозные» войны, и может быть не один правильный ответ. Но после работы с ksh и csh в течение последних 3-4 лет и преодоления боли переноса с одного на другой или применения общей логики к нескольким версиям (читайте как устаревший код), если я пишу новый скрипт, я пошел бы на кш, но по принуждению, а не по выбору. Есть ли лучший вариант, кроме ksh/csh? Также что-то, что можно переносить между Unix (Solaris/HP/IBM/FreeBSD) и Linux (и, если я не прошу слишком многого, или это имеет смысл для всех разновидностей Linux)

Жду предложений...

Мир :) Деванг Камдар


person Devang Kamdar    schedule 19.05.2009    source источник
comment
Имейте в виду, что ksh почти является надстройкой Posix-Shell. Различия незначительны и незаметны (например, порядок приоритета по умолчанию для встроенных -v- определяемых пользователем функций). Я использую ksh для интерактивной работы, но пишу скрипты на (posix)sh.   -  person Stan Graves    schedule 20.04.2010


Ответы (6)


Я бы предложил старый добрый sh, который доступен везде.

Также стоит отметить, что переносимость касается не только оболочки, но и других команд, используемых в скрипте, таких как awk, grep, ps или echo.

person mouviciel    schedule 19.05.2009
comment
Определенно придерживайтесь POSIX-совместимого подмножества функций для команд. По крайней мере, в дистрибутивах, производных от Debian, вы можете получить справочные страницы POSIX как manpages-posix{-dev}, а затем вы можете получить доступ (например) к справочной странице POSIX awk через man 1posix awk. - person porges; 19.05.2009
comment
Вы должны заметить, что переносимость не означает автоматически POSIX. Переносимый скрипт работает на большинстве /bin/sh, даже если это означает, что POSIX строго не соблюдается. Единственный пример оболочки с поведением, отличным от POSIX (но «переносимым»), о котором я сейчас могу думать, это, возможно, sh от Sun. - person TheBonsai; 19.05.2009
comment
Еще один стандарт, о котором стоит упомянуть, — это Single Unix Specification. - person mouviciel; 19.05.2009
comment
Я думаю, что sh - довольно безопасный способ, но, как указал Стивен Дарлингтон ниже, у него может быть не так много дружественных функций... На данный момент я хотел бы отказаться от всех предложений, что если вы не изменяете существующий скрипт , нет причин кодировать новый в оболочке. Альтернативы Perl/Python/Ruby имеют смысл, поскольку они будут в значительной степени переносимы естественным образом, и скорость здесь не должна быть большой проблемой — спасибо сообщению TheMarko за этот свежий взгляд :) - person Devang Kamdar; 19.05.2009
comment
Хотя портативность важна; вопрос также содержал ремонтопригодность в качестве ключевого слова, которое вы полностью проигнорировали. sh сценарии НЕ поддерживаются. Они часто полагаются на хаки, чтобы попытаться сделать то, что вам нужно, потому что POSIX sh или Bourne просто не предоставляют необходимых функций. Я рекомендую bash, если вам нужны сценарии оболочки, и perl/python/ruby, если вы можете позволить себе зависимость. - person lhunath; 19.05.2009
comment
sh-скрипты ремонтопригодны так же, как исходный код C: пишите их с учетом удобства сопровождения. Я уже использовал TDD в сценариях оболочки. - person mouviciel; 19.05.2009
comment
Но как проверить, соответствуют ли синтаксису и семантике сценарий оболочки придерживается POSIX? - person mceo; 27.04.2016

Если вы действительно хотите, чтобы он был переносимым (я не знаю, поддерживается ли какой-либо сценарий оболочки), я бы указал #!/bin/sh и протестировал с помощью тире и, если возможно, другие оболочки.

person Matthew Flaschen    schedule 19.05.2009
comment
Производные от Debian также будут иметь сценарий checkbashims в пакете 'devscripts', который будет проверять несовместимое с sh поведение в сценариях. - person porges; 19.05.2009

Я ожидаю, что BASH будет самой распространенной оболочкой на данный момент, поскольку она используется по умолчанию для многих дистрибутивов Linux (она может работать даже в Windows с cygwin, но, вероятно, это верно и для других оболочек). Альтернативой может быть не использование самой оболочки для сценариев, а использование одного из языков сценариев, таких как perl, python, ruby,...

person TheMarko    schedule 19.05.2009
comment
Я имел в виду, что использование perl/python и т. д. для сценариев действительно имеет смысл :) - person Devang Kamdar; 19.05.2009

Я обычно использую кш. Я считаю, что это хороший компромисс между функциями и мобильностью. Он есть (или доступна совместимая версия) на большинстве Linux-компьютеров и Solaris. Давно я не пользовался HP-UX (к счастью), но я почти уверен, что там он тоже был доступен.

Если все машины, которые вам нужно поддерживать, современные, bash может быть вариантом. Solaris 10 поставляется с копией. Это значение по умолчанию на большинстве машин Linux.

Ваш наименьший общий знаменатель будет Bourne (sh), так что стоит подумать, если переносимость является вашей главной задачей. Однако в нем отсутствуют некоторые из более удобных функций ksh и bash.

По-прежнему стоит избегать использования csh/tcsh для сценариев. Программирование на Csh считается вредным — это старая идея, но все еще актуальная. .

person Stephen Darlington    schedule 19.05.2009
comment
Я читал это (Программирование Csh считается вредным) раньше ... Это действительно очень хорошая статья ... Спасибо, что поделились - person Devang Kamdar; 19.05.2009
comment
ksh является почти надстройкой над оболочкой Posix и до сих пор остается моим выбором интерактивной оболочки. Я также потратил много времени на HP-UX, и ksh — лучшая оболочка, доступная на некоторых старых версиях. Если бы я начал с Linux, я бы, вероятно, использовал bash. - person Stan Graves; 20.04.2010

Мой ответ будет perl.

Делает ли все, что 'sh' 'bash' и т. д., более изящным и элегантным образом.

Кроме того, он на самом деле более портативный. Данная версия Perl очень стабильна на всех платформах. Между дистрибутивами Linux, Solaris и AIX нет существенных различий, тогда как перенос сценариев оболочки между этими платформами представляет собой настоящую головную боль.

И это работает на всех платформах Windows! Если вы избегаете обратных кавычек и "system()", у вашего скрипта есть хорошие шансы на запуск.

person James Anderson    schedule 19.05.2009

Питон! Попробуйте iPython, усовершенствованный интерпретатор Python. Также: Python для системного администрирования Unix и Linux.

Вы можете писать отличные портативные сценарии, и это весело.

person ShawnMilo    schedule 19.05.2009