Rastrear ciertos parámetros en algún comando

10

Digamos que tengo un comando git branch(siempre con un par de palabras), por ejemplo.

Lo que quiero es hacer un seguimiento de cuándo se ejecuta este comando con argumentos. Por ejemplo, si ejecuto el comando git branch developsin errores, quiero guardar developen un archivo.

Traté de sobrescribir el comando git en mi .bash_profile, algo como esto:

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

Pero parece que no funciona bien. ¿Hay alguna forma de hacer esto?

jherran
fuente
de acuerdo con su ejemplo (desarrollo de git branch), ¿desea verificar si "$ #" es "2" y no "3"? ... (2 parámetros para la función git)
Olivier Dulac
Fue un error, pero el código es solo un ejemplo
jherran
Okay. Agregué comentarios adicionales debajo de la respuesta (buena) de Stephane. mis comentarios pueden no ser aplicables (pienso en el .txt como un archivo de registro, pero ¿podría ser algo más que no puede tener fechas?)
Olivier Dulac

Respuestas:

18

Tienes algunos problemas aquí:

  • su gitfunción se llama a sí misma recursivamente en lugar del gitcomando original .
  • estás usando sin $@comillas, lo que no tiene ningún sentido
  • está dejando otras variables sin comillas , pidiéndole al shell que las divida + glob.
  • estás usando echopara datos arbitrarios .
  • estás perdiendo el estado de salida del gitcomando original .
  • está sobrescribiendo su archivo de registro en cada invocación.
  • está poniendo definiciones de funciones en su ~/.bash_profileque está destinado a personalizar su sesión de inicio de sesión, no su shell y normalmente no se lee mediante bashinvocaciones sin inicio de sesión .

Querrías algo como:

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

Es decir:

  • cita tus variables,
  • usar commandpara ejecutar el git comando ,
  • guardar el estado de salida de giten una variable local y devolverlo al salir,
  • use en >>lugar de >para la redirección al archivo de registro.
  • usar en printflugar de echo.
  • y póngalo en su ~/.bashrclugar (asegurándose de que su ~/.bash_profilefuente sea, ~/.bashrcya que los bashshells de inicio de sesión no se leen ~/.bashrcpor defecto (un basherror / error)). A menos que desee exportar esa gitfunción (con export -f git) en caso de que también desee bashscripts que llamen gitpara llamar a esa función.
Stéphane Chazelas
fuente
1
Increíble explicación y funciona como un encanto. Muchas gracias.
jherran
+1 para una muy buena respuesta. Pero el operador puede necesitar cambiar el cheque a [ "$#" -eq 2 ], según su ejemplo. Y podría ser una buena idea agregar también la fecha a "tacked_parameters.txt". E iría por el caso general (es decir, no solo el seguimiento de los 2º parámetros cuando hay 2 parámetros, sino el seguimiento de cualquier parámetro): ¿Me desharía del if y tengo printf '%s: %s\n' "$(date '+%Y-%m-%dT%H:%M:%S')" "$0 $*":? (es decir, muestre el comando + todos los parámetros (tenga en cuenta que aún pierde algo de información, por ejemplo, qué parámetro tiene intra-separadores, si los hay). Fecha portátil cercana al estándar iso8601)
Olivier Dulac