コマンドのパラメータを自動的に解析することは可能ですか?

コマンドのパラメータを自動的に解析することは可能ですか?

git clone次のようなラッパーを作成してコマンドを変更してローカルキャッシュを使用したいと思います。

  1. ストレージがキャッシュにない場合は複製します。
  2. 希望の場所にコピーしてください。

しかし、どのように解析しますか?git clonerepository値を取得するためのコマンドライン引数はマイナーなようですが、良い解決策が見つかりません。

これは、コマンドライン引数の構造が不足しているためです。一部はスイッチでも、一部は値などが続く場合もあります。gitこの場合、オプションの引数<repository>が後に続く可能性があるため、<directory>常に最後の引数を渡すことはできません。 CLIパラメータを辞書などのようにさらに構造化することができれば良いでしょう。

repository次のツールを使用してパラメータを自動的に取得できるように、ドキュメントに指定された構文を指定する方法はありますかgetopts

git注:私はコマンドを使用してリポジトリを自動的にダウンロードするためにJenkins、Buildoutなどのいくつかのツールを使用しているので、gitラッパーは最高のソリューションだと思います。

gitローカルのGitサーバー、URLの書き換えなど、試してみる特定のソリューションもあります。

答え1

コマンドの引数を繰り返してコマンド内でリポジトリを検索または検索し、URLを解析して@必要https://なものを抽出できます。

たとえば、Pythonでは次のようになります。


import sys

if len(sys.argv) > 1:
    for i in sys.argv:
        # Do whatever you want (parsing the URL...)

答え2

私はハッキングされたスクリプトを思い出しました。/usr/local/bin/gitそれはNicholasが述べたアイデアを使用します。最新バージョンのGitで提供されている機能を使用してください--reference-if-able--dissociate

#!/usr/bin/env bash

# The real executable is located at /usr/local/bin/tig.

command=$1

cache=$HOME/.cache/git/repositories

if [[ ! $command == "clone" ]]; then
    /usr/local/bin/tig "$@"
    exit
fi

caching=false

for argument in "${@:2}"; do
    case $argument in
        --reference | --reference-if-able)
            caching=false
            break
            ;;
        *[email protected]:*)
            caching=true
            [[ $argument == *.git ]] && argument=${argument%.git}
            folder=$cache/$argument
            ;;
    esac
done

if $caching; then
    echo "INFO: Using cache: $folder"
    /usr/local/bin/tig clone \
        --reference-if-able "$folder" --dissociate "${@:2}"
else
    /usr/local/bin/tig "$@"
fi

免責事項:これは開発目的にのみ使用されます。最善の方法は、Stephenが提案したように、GobletなどのGitプロキシサーバーを使用することです。

関連情報