Śledź określone parametry na niektórych poleceniach

10

Powiedzmy, że mam na przykład polecenie git branch(zawsze z kilkoma słowami).

Chcę śledzić, kiedy to polecenie jest wykonywane z argumentami. Na przykład, jeśli wykonam polecenie git branch developbez błędów, chcę zapisać developplik.

Próbowałem zastąpić polecenie git na moim .bash_profile, coś takiego:

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

Ale wydaje się, że to nie działa dobrze. Czy jest na to sposób?

Jherran
źródło
zgodnie ze swoim przykładem (git branch develop) chcesz sprawdzić, czy „$ #” to „2”, a nie „3”? ... (2 parametry funkcji git)
Olivier Dulac
To był błąd, ale kod jest tylko przykładem
Jherran
ok. Dodałem dodatkowe uwagi pod (dobrą) odpowiedzią Stephane'a. moje uwagi mogą nie mieć zastosowania (myślę o .txt jako pliku dziennika, ale może to być coś innego, co nie może zawierać dat?)
Olivier Dulac

Odpowiedzi:

18

Masz tutaj kilka problemów:

  • twoja gitfunkcja wywołuje się rekurencyjnie zamiast oryginalnej gitkomendy.
  • używasz bez $@cudzysłowu, co nie ma żadnego sensu
  • jesteś pozostawiając inne zmienne nienotowanego , prosząc powłokę do rozdzielania + glob im.
  • jesteś korzystania echoz dowolnych danych .
  • tracisz status wyjścia z pierwotnego gitpolecenia.
  • zastępujesz plik dziennika przy każdym wywołaniu.
  • umieszczasz w niej definicje funkcji, ~/.bash_profilektóre mają na celu dostosowanie sesji logowania, a nie powłoki i zwykle nie są odczytywane przez bashwywołania niezalogowane.

Chcesz coś takiego:

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

To jest:

  • podaj swoje zmienne,
  • użyj, commandaby uruchomić git polecenie ,
  • zapisz status wyjścia gitw zmiennych lokalnych i zwróć go przy wyjściu,
  • użyj >>zamiast >do przekierowania do pliku dziennika.
  • użyj printfzamiast echo.
  • i ~/.bashrczamiast tego umieść to w swoim katalogu (upewniając się, że ~/.bash_profilepozyskujesz, ~/.bashrcponieważ bashpowłoki logowania ~/.bashrcdomyślnie nie czytają ( bashbłąd / błąd). Chyba że chcesz wyeksportować tę gitfunkcję (z export -f git) w przypadku, gdy chcesz także bashskryptów gitwywołujących tę funkcję.
Stéphane Chazelas
źródło
1
Niesamowite wyjaśnienie i działa jak urok. Dziękuję Ci bardzo.
jherran
+1 za bardzo dobrą odpowiedź. Ale operacja może wymagać zmiany czeku na [ "$#" -eq 2 ], zgodnie z jego przykładem. Dobrym pomysłem może być także dodanie daty do „tacked_parameters.txt”. I pójdę za ogólnym przypadku (czyli nie tylko śledzić z 2. parametrów przy 2 parametry, ale śledzić wszelkie parametry): Chciałbym pozbyć się wtedy i posiadają: printf '%s: %s\n' "$(date '+%Y-%m-%dT%H:%M:%S')" "$0 $*"? (tzn. pokaż polecenie + wszystkie parametry (zauważ, że wciąż tracisz informacje, na przykład, który parametr miał intra-separatory, jeśli taki istnieje). Przenośna data zbliżona do standardu iso8601)
Olivier Dulac