シェルスクリプトを書いているとき、私は自分の時間のほとんど(特にデバッグ時)を引数処理に費やしていることに気付くことがよくあります。私が作成または保守しているスクリプトの多くは、入力の解析とサニタイズの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)サニタイズ後に私のbashスクリプトの残りの部分からアクセスできるbashよりも強力なものでCLI解析を有効にする既存の(Pythonが望ましい)ユーティリティはありますか? ?私が気付いていない問題や落とし穴、またはより良い解決策はありますか?実装を共有してみませんか?
1つの(非常に中途半端な)アイデア:
#!/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
2行のコードと、期待する引数の簡潔な説明、そして実際のスクリプトの動作について説明します。たぶん私は頭がおかしいのかもしれませんが、それは私が今しなければならないことよりもずっといいようです。
シェルスクリプトの引数の解析や、CLI引数の簡単な解析に関するこのwikiページのようなものを見てきましたが、これらのパターンの多くは不格好でエラーが発生しやすいと感じており、特にシェルスクリプトを作成するたびに再実装する必要はありません。 Python、Javaなどには、このような優れた引数処理ライブラリがあります。