Cómo sobrecargar un comando de linux


1

Cada vez que el usuario escribe git commit -a,
quiero ejecutarlo en mi propio script,
A continuación, ejecute el comando original git commit.. y haz que se ejecute como lo haría normalmente.


Si esto fuera posible, sería un gran riesgo para la seguridad.
— cmbuckley

Respuestas:



2

Si quieres que tu "gancho" no se limite solo a git pero necesitas hacer que funcione con cualquier ejecutable, puedes usar alias

alias git='myhackyscript.sh'

entonces myhackyscript.sh puede parecer

#!/bin/bash

# save params
params=("$@")

# do what i want to do
do_something

# launch git 
git "${params[@]}"

myhackyscript.sh debe ser almacenado en un $PATH carpeta como /usr/bin/


¿Cómo se vuelve a adjuntar al comando git "real"?
— Binny Zupnick

Mira la última línea. Llamará a git con sus parámetros tomados del comando shell.
— Davide Berra

¿Llamará al git original, o llamará al nuevo alias?
— Binny Zupnick

Se llamará el git original. No caerás en una recursión.
— Davide Berra

Los alias no se expanden en un shell no interactivo. Pruébate
— Davide Berra

0

Puede definir una función de shell que invoque un script personalizado que luego pasa cosas al comando git original:

git() {
  case $1 in
    commit)
      echo "WUFF"
      ;;
  esac
  \git "$@"
}

Poner esta función en uno de los archivos RC de su shell (por ejemplo, ~/.profile o /etc/profile en el caso de sh / bash / ksh shells) estará disponible después del siguiente inicio de sesión. Por supuesto, puedes obtener mucho más elaboare que esto. Además, es posible que desee echar un vistazo a la git-sh-setup(1) y git-rev-parse(1) páginas de manual, en particular la sección sobre parseopt.


Usted puede source ~/.profile para actualizar el shell actual con la nueva función,
— iiSeymour

Claro, y en Mac es suficiente con abrir una nueva pestaña / terminal. Pero el método de cierre de sesión / inicio de sesión es a prueba de balas ;-)

Esto se debe a que cada nueva terminal / pestaña invoca un nuevo shell, por lo que todos los archivos de configuración relevantes, como ~/.bashrc será leído. source ~/.bashrc estarán a prueba de balas para actualizar el shell actual con los cambios.
— iiSeymour

0

Si creas un script ls en un lugar como ~/bin que se encuentra en el path antes de /bin/ls su script será ejecutado en su lugar.

user@wopr /home/user/bin/: $ cat ls
#!/bin/bash

echo "Security Breached!"

# Run original command
/bin/ls "$@"

Ahora al listar archivos el mensaje Security Breached! siempre se muestra.

user@wopr /home/user/bin/: $ ls
Security Breached!
ls file.sh file myscript.sh

user@wopr /home/user/bin/: $ which ls
/home/user/bin/ls

Debe tener en cuenta los directorios en su path y quién puede escribir en esos directorios.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.