Ś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?


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ę.

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.