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.

Binny Zupnick
fuente
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/

Davide Berra
fuente
¿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.

Michael Wild
fuente
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.

iiSeymour
fuente