Кто-нибудь знает какие-либо ресурсы, которые рассказывают о передовых методах или шаблонах проектирования для сценариев оболочки (sh, bash и т. Д.)?
design-patterns
bash
shell
user14437
источник
источник
Ответы:
Я написал довольно сложные сценарии оболочки, и мое первое предложение - «не». Причина в том, что довольно легко совершить небольшую ошибку, которая мешает вашему сценарию или даже делает его опасным.
Тем не менее, у меня нет других ресурсов, чтобы передать вас, кроме моего личного опыта. Вот то, что я обычно делаю, это излишне, но имеет тенденцию быть твердым, хотя и очень многословным.
мольба
заставить ваш скрипт принимать длинные и короткие опции. будьте осторожны, потому что есть две команды для разбора опций, getopt и getopts. Используйте getopt, чтобы избежать проблем.
Другим важным моментом является то, что программа всегда должна возвращать ноль, если завершается успешно, ненулевой, если что-то пошло не так.
Вызовы функций
Вы можете вызывать функции в bash, просто не забудьте определить их перед вызовом. Функции похожи на скрипты, они могут возвращать только числовые значения. Это означает, что вам нужно придумать другую стратегию для возврата строковых значений. Моя стратегия состоит в том, чтобы использовать переменную с именем RESULT для хранения результата и возвращать 0, если функция выполнена правильно. Кроме того, вы можете вызвать исключения, если вы возвращаете значение, отличное от нуля, а затем установить две «переменные исключения» (мои: EXCEPTION и EXCEPTION_MSG), первая из которых содержит тип исключения, а вторая - сообщение, читаемое человеком.
Когда вы вызываете функцию, параметры функции присваиваются специальным переменным $ 0, $ 1 и т. Д. Я предлагаю вам поместить их в более значимые имена. объявите переменные внутри функции как локальные:
Склонные к ошибкам ситуации
В bash, если не указано иное, в качестве пустой строки используется неустановленная переменная. Это очень опасно в случае опечатки, так как неправильно введенная переменная не будет сообщена, и она будет оценена как пустая. использование
чтобы этого не случилось. Будьте осторожны, потому что, если вы сделаете это, программа будет прерываться каждый раз, когда вы оцениваете неопределенную переменную. По этой причине единственный способ проверить, не определена ли переменная, заключается в следующем:
Вы можете объявить переменные только для чтения:
Модульность
Вы можете достичь "Python как" модульности, если вы используете следующий код:
Затем вы можете импортировать файлы с расширением .shinc со следующим синтаксисом
импорт "AModule / ModuleFile"
Который будет искать в SHELL_LIBRARY_PATH. Поскольку вы всегда импортируете в глобальное пространство имен, не забудьте поставить префикс перед всеми вашими функциями и переменными, иначе вы рискуете столкновением имен. Я использую двойное подчеркивание в качестве точки питона.
Кроме того, поместите это как первое, что в вашем модуле
Объектно-ориентированного программирования
В bash вы не можете заниматься объектно-ориентированным программированием, если не создадите достаточно сложную систему распределения объектов (я думал об этом. Это выполнимо, но безумно). На практике, однако, вы можете выполнять «одноэлементное программирование»: у вас есть один экземпляр каждого объекта и только один.
Что я делаю: я определяю объект в модуль (см. Запись модуляризации). Затем я определяю пустые переменные (аналогично переменным-членам), функцию инициализации (конструктор) и функции-члены, как в этом примере кода
Улавливание и обработка сигналов
Я нашел это полезным для ловли и обработки исключений.
Советы и подсказки
Если что-то не работает по какой-либо причине, попробуйте изменить порядок кода. Порядок важен и не всегда интуитивно понятен.
даже не рассматривайте возможность работы с tcsh. он не поддерживает функции и вообще ужасен.
Надеюсь, это поможет, хотя, пожалуйста, обратите внимание. Если вам приходится использовать то, что я написал здесь, это означает, что ваша проблема слишком сложна, чтобы ее можно было решить с помощью shell. используйте другой язык. Я должен был использовать это из-за человеческих факторов и наследия.
источник
getopt
противgetopts
?getopts
является более переносимым и работает в любой оболочке POSIX. Тем более что вопрос состоит в том, чтобы использовать лучшие практики оболочки, а не только лучшие практики bash, я бы поддерживал соответствие POSIX для поддержки нескольких оболочек, когда это возможно.Взгляните на Advanced Bash-Scripting Guide, чтобы узнать больше о сценариях оболочки - не только Bash.
Не слушайте людей, говорящих вам смотреть на другие, возможно, более сложные языки. Если сценарии оболочки соответствуют вашим потребностям, используйте это. Вы хотите функциональность, а не фантазии. Новые языки предоставляют ценные новые навыки для вашего резюме, но это не поможет, если у вас есть работа, которую нужно выполнить, и вы уже знаете оболочку.
Как уже говорилось, для сценариев оболочки не так много «лучших практик» или «шаблонов проектирования». Разные варианты использования имеют разные ориентиры и смещения - как и любой другой язык программирования.
источник
Сценарий оболочки - это язык, предназначенный для управления файлами и процессами. Хотя он отлично подходит для этого, он не является языком общего назначения, поэтому всегда старайтесь склеивать логику из существующих утилит, а не воссоздавать новую логику в сценарии оболочки.
Помимо этого общего принципа, я собрал некоторые распространенные ошибки сценариев оболочки .
источник
В этом году (в 2008 году) на OSCON прошла отличная сессия, посвященная именно этой теме: http://assets.en.oreilly.com/1/event/12/Shell%20Scripting%20Craftsmanship%20Presentation%201.pdf
источник
Знайте, когда его использовать. Для быстрого и грязного склеивания команд все в порядке. Если вам нужно принять более чем несколько нетривиальных решений, циклы, что угодно, используйте Python, Perl и modularize .
Самая большая проблема с оболочкой часто заключается в том, что конечный результат выглядит просто как большой шарик грязи, 4000 линий удара и рост ... и вы не можете от него избавиться, потому что теперь от этого зависит весь ваш проект. Конечно, это началось с 40 строк прекрасного bash.
источник
Легко: использовать Python вместо сценариев оболочки. Вы получаете почти 100-кратное увеличение читабельности без необходимости усложнять то, что вам не нужно, и сохраняете возможность превращать части вашего скрипта в функции, объекты, постоянные объекты (zodb), распределенные объекты (пиро) почти без каких-либо дополнительный код
источник
используйте set -e, чтобы не пахать вперед после ошибок. Попробуйте сделать его совместимым, не полагаясь на bash, если вы хотите, чтобы он работал на not-linux.
источник
Чтобы найти «лучшие практики», посмотрите, как дистрибутивы Linux (например, Debian) пишут свои init-скрипты (обычно находятся в /etc/init.d).
Большинство из них без "bash-isms" и имеют хорошее разделение параметров конфигурации, библиотечных файлов и исходного форматирования.
Мой личный стиль - написать сценарий master-shellscript, который определяет некоторые переменные по умолчанию, а затем пытается загрузить («исходный») файл конфигурации, который может содержать новые значения.
Я стараюсь избегать функций, поскольку они имеют тенденцию усложнять сценарий. (Perl был создан для этой цели.)
Чтобы убедиться, что скрипт является переносимым, протестируйте его не только с помощью #! / Bin / sh, но также используйте #! / Bin / ash, #! / Bin / dash и т. Д. Вы скоро обнаружите специфический для Bash код.
источник
Или более старая цитата, похожая на ту, что сказал Хуан:
«Используйте perl. Вы хотите знать bash, но не использовать его».
К сожалению, я забыл, кто это сказал.
И да, я бы порекомендовал Python поверх Perl.
источник