一部のコマンドで特定のパラメーターを追跡する


10

たとえば、コマンドgit branch(常にいくつかの単語を含む)があるとします。

私が欲しいのは、このコマンドが引数付きで実行されたときを追跡することです。たとえば、git branch developエラーなしでコマンドを実行した場合develop、ファイルに保存します。

私のgitコマンドを.bash_profile次のように上書きしようとしました:

git () {
    if [ $# -eq 3 ]
    then
        git $@
        echo $2 > /path/tacked_parameters.txt
    else
        git $@
    fi
}

しかし、それはうまくいかないようです。これを行う方法はありますか?


あなたの例(gitブランチ開発)によれば、「$#」が「3」ではなく「2」であるかどうかを確認したいですか?...(git関数の2つのパラメーター)
Olivier Dulac

間違いでしたが、コードは一例にすぎません
jherran '12

OK。ステファンの(良い)回答の下に、さらにコメントを追加しました。私の発言が適用されない可能性があります(.txtはログファイルと考えていますが、日付を含めることができない別の何かである可能性がありますか?)
Olivier Dulac

回答:


18

ここにいくつかの問題があります:

  • git関数は、元のgitコマンドの代わりにそれ自体を再帰的に呼び出しています。
  • あなたは$@まったく意味をなさない引用符のないものを使用しています
  • あなたはしている引用符で囲まれていない他の変数を残して、それらをグロブ+スプリットにシェルを求め、。
  • あなたは任意のデータに使用echoしています
  • 元のgitコマンドの終了ステータスが失われます。
  • 呼び出しのたびにログファイルを上書きしています。
  • ~/.bash_profileシェルではなく、ログインセッションをカスタマイズするための関数定義をに入れており、通常、非ログインbash呼び出しでは読み取られません。

あなたは次のようなものが欲しいでしょう:

git() {
  if [ "$#" -eq 3 ]
  then
    local ret
    command git "$@"; ret=$?
    printf '%s\n' "$2" >> /path/tacked_parameters.txt
    return "$ret"
  else
    command git "$@"
  fi
}

あれは:

  • 変数を引用し、
  • コマンドcommandを実行するために使用し、git
  • の終了ステータスをgitローカル変数に保存し、終了時に返します。
  • 使用>>の代わりに、>ログファイルにリダイレクトするために。
  • printf代わりに使用してくださいecho
  • ~/.bashrc代わりにそれを入れてください(ログインシェルがデフォルトで読み取らないように、~/.bash_profileソースが読み込まれていることを確認してください(バグ/誤機能))。その関数を呼び出すために呼び出すスクリプトも必要な場合に備えて、(を使用して)その関数をエクスポートする場合を除きます。~/.bashrcbash~/.bashrcbashgitexport -f gitbashgit

1
驚くべき説明と魅力のように動作します。どうもありがとうございました。
jherran

非常に良い答えの+1。しかし、[ "$#" -eq 2 ]彼の例によれば、opはチェックをに変更する必要があるかもしれません。また、「tacked_pa​​rameters.txt」に日付を追加することもお勧めします。そして、私は一般的なケースに行きます(すなわち、2つのパラメータのときに2番目のパラメータを追跡するだけでなく、任意のパラメータを追跡します):私はifを取り除き、そして持っています:printf '%s: %s\n' "$(date '+%Y-%m-%dT%H:%M:%S')" "$0 $*"?(つまり、コマンド+すべてのパラメーターを表示します(たとえば、イントラセパレーターがある場合は、どのパラメーターにイントラセパレーターがあるかなど、まだ情報が失われていることに注意してください。iso8601標準に近いポータブル日付)
Olivier Dulac
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.