The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Посоветуйте, чем в шелл разбирать _длинные_ аргументы скрипта?, !*! And, 04-Май-20, 18:46  [смотреть все]
Знаю про getopt и про "while ${1} ; do shift ; done" - https://stackoverflow.com/questions/192249/how-do-i-parse-co...

Если именя аргумента длинное, то без документации и литературного творчества в коде скрипта сразу ясно для чего аргумент.

Getops не умеет работать с длинными именами аргументов. Хочу без магичности и волшебности имён в виде одной буквы. Чтобы по имени аргумента было чётко ясно для чего аргумент.

Чем сделать, чтобы как в Python Argparse задать число параметров, группы аргументов и т.д. Можно написать "while ; do shift ; done", но хочется большего.

  • Посоветуйте, чем в шелл разбирать _длинные_ аргументы скрипта?, !*! Licha Morada, 20:12 , 04-Май-20 (1)

    > Если именя аргумента длинное, то без документации и литературного творчества в коде
    > скрипта сразу ясно для чего аргумент.

    Когда я путаюсь в аргументах своих скриптов, то начинаю задавать параметры через переменные окружения.

    > Getops не умеет работать с длинными именами аргументов. Хочу без магичности и
    > волшебности имён в виде одной буквы. Чтобы по имени аргумента было
    > чётко ясно для чего аргумент.

    Бывает встроенная getopts, а бывает отдельная getopt. Вроде, последняя умеет длинные аргументы.
    $ which getopts
    $ which getopt
    /usr/bin/getopt

    > Чем сделать, чтобы как в Python Argparse задать число параметров, группы аргументов
    > и т.д. Можно написать "while ; do shift ; done", но
    > хочется большего.

    Кроме того, возможно, вы приблизились к границе применимости шелл скрипта как инструмента.


    • Посоветуйте, чем в шелл разбирать _длинные_ аргументы скрипта?, !*! And, 20:49 , 04-Май-20 (2)
      Спасибо!

      Оказалось, команды три (Bash, BSD, GNU), и две с одинаковым именем (у BSD и GNU), и из двух с одинаковым именем одна только работает с длинными именами - https://stackoverflow.com/questions/402377/using-getopts-to-...

      Видимо, мне надо смотреть

      man 8 getopt
      man 1 getopt
      less /usr/share/doc/util-linux/examples/getopt-parse.bash


      P.S.

      > Когда я путаюсь в аргументах своих скриптов, то начинаю задавать параметры через
      > переменные окружения.

      Глобальные переменные в коде труднее проследить. А шелл, как язык, от ошибок защищает слабее остальных.

      Аргументы ком.строки переданы в одной точке и ни в каком ином месте их значения невозможно изменить. Если до вызова скрипта аргументы неожиданны, то автоматически скрипт не виноват. Если значения неожиданны внутри скрипта, то виноват только сам скрипт, но никак не родительский процесс.

      Сильно упрощает.

      > Кроме того, возможно, вы приблизились к границе применимости шелл скрипта как инструмента.

      Совершенно верно, Вы правы. Есть особенности. Цель - разворачивать конфигурацию на минимальной системе.

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

      А вот по работе очень шелл критикую и не рекомендую. Кроме как 10-20 строк.

      • Посоветуйте, чем в шелл разбирать _длинные_ аргументы скрипта?, !*! Licha Morada, 21:38 , 04-Май-20 (3)

        > Оказалось, команды три (Bash, BSD, GNU), и две с одинаковым именем (у
        > BSD и GNU), и из двух с одинаковым именем одна только
        > работает с длинными именами - https://stackoverflow.com/questions/402377/using-getopts-to-...

        О как.


        >> Когда я путаюсь в аргументах своих скриптов, то начинаю задавать параметры через
        >> переменные окружения.
        > Глобальные переменные в коде труднее проследить.

        Смотря как использовать.
        Если читать переменные окружения из тех мест где понадобится (откуда попало), то да.
        Если их считывать, проверять на достаточность и непротиворечивость, выставлять все необходимые внутренние флаги в самом начале выполнения, примерно там-же где иначе проводился бы парсинг аргументов, то разница незначительна.


        > Цель - разворачивать конфигурацию на минимальной системе.

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

        Подобную задачу решаем. Типичное выполнение в 2 приёма. Сначала по SCP заливаем несколько файлов, потом по SSH запускаем выполнение. Пишем лог на удалённой машине и паралельно ловим STDOUT от SSH. Например, скрипт первым делом проверяет, на правильной ли машине его запустили и ругается если не. Вообще, 90% кода может быть проверками. Такой недо-Ansible без зависимостей.

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

  • Посоветуйте, чем в шелл разбирать _длинные_ аргументы скрипта?, !*! Аноним, 02:02 , 14-Май-20 (4)
    Применимость передачи данных через переменные окружения (как впрочем и через аргументы) очень ограничена, не забывайте это учитывать. На каких-то системах это может быть 100кб, на других всего 20кб (и в них должен уложиться весь environ, как я понимаю). А ещё случается так, что приложение неспособно принимать сколько-нибудь значимые объёмы информации. В моём случае ядро обещало мне 2000кб, на практике оказалось всего 120кб.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру