Tieni traccia di alcuni parametri su alcuni comandi


10

Diciamo che ho un comando git branch(sempre con un paio di parole) per esempio.

Quello che voglio è tenere traccia di quando questo comando viene eseguito con argomenti. Ad esempio, se eseguo il comando git branch developsenza errori, voglio salvare developsu un file.

Ho provato a sovrascrivere il comando git sul mio .bash_profile, qualcosa del genere:

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

Ma sembra che non funzioni bene. C'è un modo per fare questo?


secondo il tuo esempio (sviluppo git branch) vuoi verificare se "$ #" è "2" e non "3"? ... (2 parametri per la funzione git)
Olivier Dulac,

È stato un errore, ma il codice è solo un esempio
jherran del

ok. Ho aggiunto ulteriori commenti sotto la (buona) risposta di Stephane. le mie osservazioni potrebbero non essere applicabili (penso al .txt come a un file di registro, ma potrebbe essere qualcos'altro che non può contenere date?)
Olivier Dulac,

Risposte:


18

Hai qualche problema qui:

  • la tua gitfunzione si chiama ricorsivamente al posto del gitcomando originale .
  • stai usando un $@non quotato che non ha alcun senso
  • stai lasciando le altre variabili non quotate , chiedendo alla shell di dividerle + glob.
  • stai usando echoper dati arbitrari .
  • stai perdendo lo stato di uscita del gitcomando originale .
  • stai sovrascrivendo il tuo file di registro ad ogni invocazione.
  • stai inserendo definizioni di funzioni ~/.bash_profileche hanno lo scopo di personalizzare la sessione di accesso, non la shell e normalmente non vengono lette da bashinvocazioni senza accesso .

Vorresti qualcosa del tipo:

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

Questo è:

  • cita le tue variabili,
  • usare commandper eseguire il git comando ,
  • salvare lo stato di uscita di gitin una variabile locale e restituirlo all'uscita,
  • utilizzare >>anziché >per il reindirizzamento al file di registro.
  • utilizzare printfinvece di echo.
  • e inseriscilo ~/.bashrcinvece nel tuo (assicurandoti che ~/.bash_profilesia di provenienza ~/.bashrcpoiché le bashshell di login non leggono ~/.bashrcdi default (un bashbug / malfunzionamento)). A meno che non si desideri esportare quella gitfunzione (con export -f git) nel caso in cui si desideri bashche anche gli script che chiamano gitchiamino quella funzione.

1
Spiegazione incredibile e funziona come un fascino. Grazie mille.
jherran,

+1 per un'ottima risposta. Ma potrebbe essere necessario modificare il controllo in op [ "$#" -eq 2 ], secondo il suo esempio. E potrebbe essere una buona idea aggiungere anche la data a "tacked_parameters.txt". E preferirei il caso generale (vale a dire, non solo la traccia dei secondi parametri quando 2 parametri, ma tenere traccia di tutti i parametri): mi sbarazzerei dell'if e avrei printf '%s: %s\n' "$(date '+%Y-%m-%dT%H:%M:%S')" "$0 $*":? (ad esempio, mostra il comando + tutti i parametri (nota che perdi ancora alcune informazioni, ad esempio quali parametri hanno degli intra-separatori, se ce ne sono). Data portatile vicino allo standard iso8601)
Olivier Dulac
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.