Использование Python для анализа сложных аргументов в сценарии оболочки

Когда я пишу сценарии оболочки, я часто трачу большую часть своего времени (, особенно на отладку ), связанную с обработкой аргументов. Многие скрипты, которые я пишу или поддерживаю, более чем на 80% состоят из разбора и очистки ввода. Я сравниваю это с моими скриптами Python, где argparse выполняет большую часть рутинной работы за меня и позволяет мне легко создавать сложные структуры опций и поведение по очистке/разбору строк.

Поэтому я бы хотел, чтобы Python выполнял эту тяжелую работу, а затем получал эти упрощенные и очищенные значения в своем сценарии оболочки, не беспокоясь о аргументах, указанных пользователем.

Чтобы привести конкретный пример, многие из сценариев оболочки, с которыми я работаю, были определены так, чтобы принимать их аргументы в определенном порядке. Вы можете позвонить start_server.sh --server myserver --port 80, но start_server.sh --port 80 --server myserverне работает сYou must specify a server to start.-это делает код синтаксического анализа намного проще, но едва ли он интуитивно понятен.

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

# script.sh -o -aR --dir /tmp/test --verbose

#!/bin/bash

args=$(order.py "$@")
# args is set to "-a --dir /tmp/test -o -R --verbose"

# simpler processing now that we can guarantee the order of parameters

Здесь есть некоторые очевидные ограничения, в частности то, что parse.pyне может отличить конечную опцию с аргументом от начала индексированных аргументов, но это не кажется таким уж ужасным.

Итак, вот мой вопрос:1)Существует ли какая-либо утилита (Python предпочтительно ), позволяющая анализировать CLI с помощью чего-то более мощного, чем bash,к которому затем может получить доступ остальная часть моего скрипта bash после санации, или 2)Кто-нибудь делал это раньше? Есть ли проблемы, подводные камни или лучшие решения, о которых я не знаю? Хотите поделиться своей реализацией?


Одна (очень наполовину -испеченная )идея:

#!/bin/bash

# Some sort of simple syntax to describe to Python what arguments to accept
opts='
"a", "append", boolean, help="Append to existing file"
"dir", str, help="Directory to run from"
"o", "overwrite", boolean, help="Overwrite duplicates"
"R", "recurse", boolean, help="Recurse into subdirectories"
"v", "verbose", boolean, help="Print additional information"
'

# Takes in CLI arguments and outputs a sanitized structure (JSON?) or fails
p=$(parse.py "Runs complex_function with nice argument parsing" "$opts" "$@")
if [ $? -ne 0 ]; exit 1; fi # while parse outputs usage to stderr

# Takes the sanitized structure and an argument to get
append=$(arg.py "$p" append)
overwrite=$(arg.py "$p" overwrite)
recurse=$(arg.py "$p" recurse)
verbose=$(arg.py "$p" verbose)

cd $(python arg.py "$p" dir)

complex_function $append $overwrite $recurse $verbose

Две строки кода вместе с краткими описаниями ожидаемых аргументов, и мы приступаем к реальному поведению скрипта. Может быть, я сумасшедший, но это кажется намного лучше, чем то, что я чувствую, что должен сделать сейчас.


Я видел Разбор аргументов сценария оболочки и такие вещи, как эта вики-страница простой разбор аргументов CLI , но многие из этих шаблонов кажутся неуклюжими и подверженными ошибкам, и мне не нравится повторно -реализую их каждый раз, когда пишу сценарий оболочки, особенно когда Python, Java и т. д. имеют такие хорошие библиотеки обработки аргументов.

8
задан Community 23 May 2017 в 11:46
поделиться