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", но хочется большего.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по времени | RSS]


1. "Посоветуйте, чем в шелл разбирать _длинные_ аргументы скрипта?"  +/
Сообщение от Licha Morada (ok), 04-Май-20, 20:12 

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

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

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

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

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

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


Ответить | Правка | Наверх | Cообщить модератору

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

Оказалось, команды три (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 строк.

Ответить | Правка | Наверх | Cообщить модератору

3. "Посоветуйте, чем в шелл разбирать _длинные_ аргументы скрипта?"  +/
Сообщение от Licha Morada (ok), 04-Май-20, 21:38 

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

О как.


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

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


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

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

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

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

Ответить | Правка | Наверх | Cообщить модератору

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

5. "Посоветуйте, чем в шелл разбирать _длинные_ аргументы скрипта?"  +/
Сообщение от Аноним (4), 14-Май-20, 02:04 
Даже не так, приложение при этом не смогло прожевать больше 60кб.
Ответить | Правка | Наверх | Cообщить модератору

6. "Посоветуйте, чем в шелл разбирать _длинные_ аргументы скрипта?"  +/
Сообщение от Licha Morada (ok), 14-Май-20, 03:20 
В данном случае, передача данных через переменные окружения рассматривается как альтернатива передачи тех-же данных, но в параметрах командной строки.
Если данных так много, что мы вылезаем за пределы применимости переменных окружения, то мы тем более вылезаем за пределы применимости командной строки и вопрос можно закрывать.
Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




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

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