Пользовательская конфигурация сценария оболочки. Лучшие практики?

13

Я пишу сценарий оболочки с несколькими переменными, которые должны быть настроены пользователем. Там будет установщик для загрузки и настройки скрипта, возможно, задавая ряд вопросов. Рассматриваемый скрипт предназначен для других разработчиков.

Это может быть реализовано несколькими способами:

  1. Используйте заполнители в самом скрипте и используйте sedдля их замены во время установки (что-то вроде этого: /programming/415677/how-to-replace-placeholder-in-a-text-file )

    • Плюсы: все определения переменных содержатся в скрипте. Скрипт легко загрузить вручную и настроить переменные для пользователей, которые предпочитают редактор над установщиком.

    • Минусы: Трудно перенастроить переменные через установщик, как только они появятся. Если я не создам более сложное регулярное выражение, которое будет подвержено ошибкам.

  2. Используйте файл конфигурации , в основном другой сценарий оболочки с назначениями, и используйте его sourceдля включения. (И, вероятно, поместите это в ~/.scriptname? Основной сценарий скопирован в /usr/local/bin)

    • Плюсы: легко перенастроить скрипт. Можно даже добавить параметр для этого из основного сценария (возможно, будет работать и в первом решении, но редактирование сценария из себя не очень хорошая идея)

    • Минусы: сценарий теперь зависит от двух файлов, и пользователь должен запустить установщик для файла конфигурации, который будет создан. Это может быть решено автоматической генерацией файла конфигурации, если он не существует. Но поиск внешнего файла конфигурации все еще будет более обременительным для пользователей, которые просто хотят скачать сценарий, отредактировать его и покончить с этим.

Кроме того, несколько опций относительно того, как конфигурация должна управляться пользователем после установки:

  1. Git, как
    $ myscript config server.host example.org $ myscript config server.proxypath / home / johndoe / proxy $ myscript config server.httppath / home / johndoe / web

  2. Интерактивная
    $ myscript config
    Введите имя хоста сервера: example.org
    Введите путь к прокси на сервере: / home / johndoe / proxy
    Введите путь к каталогу http на сервере: / home / johndoe / web

  3. getopts с длинными параметрами
    $ myscript --host example.org --proxypath / home / johndoe / proxy --httppath / home / johndoe / web

  4. Простой
    $ myscript config example.org / home / johndoe / proxy / home / johndoe / web

Есть ли другие способы сделать это, что вы бы рассмотреть?
Любые лучшие практики, что-нибудь элегантное?

Чарли Руденстол
источник
2
Я не сомневаюсь, что вы можете написать сценарий оболочки, который делает все это, но вопрос в том, почему вы хотите написать что-то настолько сложное, как это требует установщика в сценарии оболочки. В любом случае, посмотрите, как система конфигурации ядра Linux управляет своим файлом конфигурации.
Что ж. Сценарий «установщика» будет только загружать реальный скрипт, копировать его в нужное место и задавать ряд вопросов для конфигурации (3-4 переменных). Таким образом, я могу дать пользователям единую командную строку, добавив скрипт установки и направив его в / bin / sh. Конечно, я мог пропустить установщик и просто добавить параметр 'install' в основной скрипт. Может быть, лучшее решение, что вы думаете?
Чарли Руденстол
«но вопрос в том, почему вы хотите написать что-то настолько сложное», вот этот сценарий: github.com/charlie-rudenstal/depo Я пытаюсь сократить количество шагов, которые должны выполнять новые пользователи, особенно во время установка. Также необходимо выполнить автоматическую настройку требуемого сервера.
Чарли Руденстол

Ответы:

6

Что бы я ожидал от вменяемой программы (сценарий оболочки или нет):

  • Мне никогда не приходилось изменять исполняемый файл, чтобы просто настроить его. Это не ядро ​​ОС.
  • Я могу передать любой параметр с помощью командной строки. Это необходимо для каждой части информации, которая не имеет разумного значения по умолчанию. Единственным исключением является пароль, который требует интерактивного ввода.
  • При желании я могу передать параметр, используя переменную окружения.
  • Я могу записать настройки в файл конфигурации, и этот файл будет использоваться, если он присутствует под известным именем или явно указан при использовании двух методов выше.
  • Файл конфигурации использует те же имена настроек и синтаксис, что и командная строка.
9000
источник
Отличный совет. Будет ли это ваш предпочтительный заказ? (1) Проверить переданные настройки в командной строке (2) Проверить настройку в .scriptnameConfig в том же каталоге (3) Проверить настройку в переменной окружения (4) Проверить настройку в .scriptnameConfig в ~ / .scriptnameConfig (5) Использовать по умолчанию сеттинг
Чарли Руденстол
«Файл конфигурации использует те же имена настроек и синтаксис, что и в командной строке». - Как это должно выглядеть? Я собирался использовать синтаксис присваивания для обычных сценариев оболочки: SETTING = VALUE. Разве команда как синтаксис не будет чувствовать себя немного странно внутри файла конфигурации?
Чарли Руденстол
Посмотрите, как mountили sshразрешить вам использовать один и тот же синтаксис в командной строке и в конфигурации. Вам не нужно полностью копировать синтаксис командной строки; вместо '--foo = bar' вы можете использовать 'foo = bar'. Если бы вместо этого вы использовали BarOption: Foo, это было бы гораздо менее удобно: необходимость помнить, если регистр значим, какое ключевое слово принимается в файле, а какое в командной строке, и невозможность скопировать-вставить рабочую команду строка в конфигурационный файл только с косметическим редактированием.
9000
3

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

  1. Ищите файл конфигурации. Если он существует, прочитайте все его настройки в словарь / справочную таблицу.
  2. Разбор именованных аргументов командной строки. Для каждого предоставленного аргумента переопределите значение, загруженное из файла конфигурации, если оно существует. Для любого аргумента, не переданного в командной строке и не в конфигурации, используйте значение по умолчанию.
  3. Выполнить основную функцию скрипта
  4. Если файл конфигурации не существует, запишите в него переданные и / или значения по умолчанию.

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

В моем последнем случае я также записал значения по умолчанию в [DEFAULT]раздел в верхней части файла конфигурации, а затем имел раздел для каждой «среды» с соответствующими переопределениями для каждого. «Среда» является первым безымянным параметром в сценарии. Таким образом, в этом случае параметры выбираются как встроенные параметры по умолчанию -> файл конфигурации по умолчанию -> значение раздела файла конфигурации -> параметр командной строки . Дополнительный параметр командной строки дает возможность перезаписать существующую конфигурацию значением последнего запуска. Этот файл конфигурации записывается в текущий каталог, поэтому он применяется для каждого проекта и может быть зафиксирован с остальной частью кода. Любой другой, проверяющий тот же проект, будет начинать с той же конфигурации.

Мэтт С
источник
«Дополнительный параметр командной строки дает возможность перезаписать существующую конфигурацию значением последнего запуска». Это интересный подход. Удобный способ объединить параметры с конфигурацией.
Чарли Руденстол
+1, также я бы порекомендовал установить значения по умолчанию в default.configфайле, расположенном в том же каталоге, что и скрипт, а затем поискать файл конфигурации ~/.scriptnameдля переопределения этих значений. Таким образом, каждое значение имеет допустимое значение по умолчанию, и его легче поддерживать.
Аарон
2

Редактирование заполнителей подвержено ошибкам.

Я бы пошел с использованием файла конфигурации.

Ваше беспокойство по поводу зависимости справедливо, однако я не помню, чтобы использовалось слишком много инструментов, состоящих из одного файла. Так что теоретически вы правы, но практически все должно быть вполне нормально.

Третий вариант , чтобы сделать программное обеспечение конфигурации написать новую подогнанную версию, которая специфична для выбранных опций и параметров. Это может быть сложнее написать и проверить, конечно :)

Без шансов
источник