Код оболочки Unix, который достаточно переносим для запуска на всех оболочках - PullRequest
3 голосов
/ 25 октября 2010

Может кто-нибудь, пожалуйста, дайте мне знать руководство по кодированию вместе с примерами кода сценариев оболочки Unix, используя которые код может выполняться на большинстве текущих оболочек, таких как ksh, bash, csh и т. Д. В большинстве случаев написан мой код для кш не будет работать на нормальном ш. Я хочу сделать мой код максимально переносимым. Большая часть моего кода будет посвящена [ifs, elifs] и [whiles, fors] и захвату кода возврата дочерней оболочки (которая в основном будет работать со сценариями SQL, для которых я хочу получить некоторые коды возврата, такие как количество обработанных строк, коды возврата, коды ошибок скрипта SQL).

Также может ли кто-нибудь сообщить мне, какой специфичный для оболочки код можно легко перенести в другие оболочки? Может кто-нибудь указать мне правильные учебники и / или образцы кодов?

Ответы [ 8 ]

13 голосов
/ 25 октября 2010

Получите для себя 7-е издание Руководства программиста Unix (том 1) и запрограммируйте в нотацию оболочки (Bourne), описанную там. Вы можете фактически перейти на оболочку System V (Bourne), если найдете соответствующее руководство; у него есть несколько дополнительных функций, таких как функции, которых не было в оболочке 7-го издания, и они практически доступны везде. (Это очень консервативная позиция, но она даст вам максимальную переносимость.)

Другая проблема заключается в выборе используемых вами команд и опций, которые вы используете для этих команд. Например, GNU grep имеет множество полезных опций, которые недоступны в других местах. GNU sed также имеет расширения, недоступные в других местах. Если вы напишите свой сценарий оболочки для использования этих расширений, ваш код будет непереносимым, даже если все оболочки будут правильно понимать синтаксис.

Я рекомендую знать, что стандарт POSIX является портативным. Большинство функций POSIX обычно поддерживаются большинством систем, но каждая система обычно добавляет некоторые дополнительные опции и функции, которые не всегда широко доступны. Обратите внимание, что оболочка POSIX имеет некоторые особенности, в частности, $(...) подстановка команд вместо обратных тиков, которых вы не имели в исходных оболочках Bourne. Вам придется решить, стоит ли ясность, которую приносит более современная нотация, (номинальной) потери переносимости.

Кроме того, правила оболочки Autoconf сосредоточены на максимальной переносимости. Однако в результате получается довольно неестественная версия сценариев оболочки, не в последнюю очередь потому, что она должна взаимодействовать с макропроцессором m4, что приводит к некоторым дополнительным ограничениям.


Обратите внимание, что по существу невозможно написать переносимые сценарии оболочки, которые будут работать с семейством оболочек Bourne / Korn / POSIX и семейством C Shell. Есть сильных аргументов для заключения "вы не должны писать скрипты в оболочке C".

4 голосов
/ 25 октября 2010

Краткий ответ для переносимости - написать сценарии для наименьшего общего знаменателя, который является оболочкой Борна (sh), и избежать оболочки C, которая имеет несовместимый синтаксис и серьезные ограничения .Оболочка Bourne должна быть общедоступной, и для нее написаны большинство сценариев запуска и администрирования системы.

Все возможности, которые вы указали в качестве требований, доступны в sh.Одной из основных вещей, которая отсутствует, является поддержка массивов, но это можно обойти.

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

2 голосов
/ 25 октября 2010

почему бы не написать свои скрипты на Perl или Python?

1 голос
/ 25 октября 2010

Получите себя Начинайте писать сценарии Portable Shell и посмотрите, что скажет автор.

0 голосов
/ 26 октября 2010

Вы можете использовать Loker для проверки синтаксического соответствия стандарту POSIX.

0 голосов
/ 26 октября 2010

У меня есть несколько ссылок отсюда: http://www.pixelbeat.org/programming/shell_script_mistakes.html#portability

0 голосов
/ 25 октября 2010

Существует также учебное пособие по написанию сценариев оболочки Bourne / Bash Стива Паркера, например Крис Ф. А. Джонсон, «Рецепты создания сценариев оболочки: подход к решению проблемы».

Для проверки максимальной переносимости вы можете использовать bournesh.

http://freshmeat.net/projects/bournesh/

0 голосов
/ 25 октября 2010

Есть некоторые разговоры о переносимости между оболочками в Bash Hackers Wiki . Посмотри, поможет ли это.

...