Suivre certains paramètres sur une commande

10

Disons que j'ai une commande git branch(toujours avec quelques mots) par exemple.

Ce que je veux, c'est garder une trace de quand cette commande est exécutée avec des arguments. Par exemple, si j'exécute la commande git branch developsans erreur, je souhaite enregistrer developsur un fichier.

J'ai essayé d'écraser la commande git sur mon .bash_profile, quelque chose comme ceci:

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

Mais ça ne marche pas bien. Est-ce qu'il y a un moyen de faire ça?

jherran
la source
selon votre exemple (git branch develop) vous voulez vérifier si "$ #" est "2" et non "3"? ... (2 paramètres à la fonction git)
Olivier Dulac
C'était une erreur, mais le code n'est qu'un exemple
jherran
D'accord. J'ai ajouté des remarques supplémentaires sous la (bonne) réponse de Stéphane. mes remarques peuvent ne pas être applicables (je pense au .txt comme un fichier journal, mais cela pourrait être autre chose qui ne peut pas contenir de dates?)
Olivier Dulac

Réponses:

18

Vous avez ici quelques problèmes:

  • votre gitfonction s'appelle récursivement au lieu de la gitcommande d' origine .
  • vous utilisez sans $@guillemets, ce qui n'a aucun sens
  • vous laissez d' autres variables sans guillemets , demandant au shell de les diviser + de les globaliser.
  • vous utilisez echopour des données arbitraires .
  • vous perdez l'état de sortie de la gitcommande d' origine .
  • vous écrasez votre fichier journal à chaque appel.
  • vous placez des définitions de fonctions dans votre ~/.bash_profilequi sont destinées à personnaliser votre session de connexion, pas votre shell et ne sont normalement pas lues par des appels sans connexion bash.

Vous voudriez quelque chose comme:

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

C'est:

  • citez vos variables,
  • utiliser commandpour exécuter la git commande ,
  • enregistrer l'état de sortie de gitdans une variable locale et le retourner à la sortie,
  • utiliser >>au lieu de >pour la redirection vers le fichier journal.
  • utiliser printfau lieu de echo.
  • et mettez-le à la ~/.bashrcplace (en vous assurant que votre ~/.bash_profilesourcing ~/.bashrccar les bashshells de connexion ne sont pas lus ~/.bashrcpar défaut (un bashbug / une erreur)). Sauf si vous souhaitez exporter cette gitfonction (avec export -f git) au cas où vous souhaiteriez également que les bashscripts qui appellent gitappellent cette fonction.
Stéphane Chazelas
la source
1
Explication incroyable et fonctionne comme un charme. Merci beaucoup.
jherran
+1 pour une très bonne réponse. Mais l'op peut avoir besoin de changer le chèque en [ "$#" -eq 2 ], selon son exemple. Et ce pourrait être une bonne idée d'ajouter également la date à "tacked_parameters.txt". Et j'irais pour le cas général (c'est-à-dire, pas seulement le suivi des 2e paramètres lorsque 2 paramètres, mais le suivi des paramètres): Je me débarrasserais du si, et aurais printf '%s: %s\n' "$(date '+%Y-%m-%dT%H:%M:%S')" "$0 $*":? (c.-à-d., affichez la commande + tous les paramètres (notez que vous perdez toujours des informations, par exemple, quel paramètre avait des séparateurs internes, le cas échéant). Date de fermeture portable de la norme iso8601)
Olivier Dulac