A veces no entiendo la sintaxis de un comando:
# mysql -d test
mysql: unknown option '-d'
# echo $?
2
Lo intento de nuevo y lo hago bien:
# mysql --database test
Welcome to the MySQL monitor.
mysql >
...
¿Cómo evito que el primer comando, con un código de error diferente a 0, ingrese al historial?
bash
command-history
Adam Matan
fuente
fuente

La única manera que puedo pensar para hacer esto sería utilizar
history -den$PROMPT_COMMAND. El problema con este o cualquier enfoque es que es imposible saber si un comando salió con un error o se completó con éxito con un código de salida distinto de cero.fuente
Es bueno tener el último comentario incorrecto para corregirlo, pero poco después se convierte en basura potencialmente confusa.
Mi enfoque es de dos pasos: almacenar comandos que fallan cuando lo hacen y eliminarlos en algún momento posterior.
Almacenar comandos que fallan cuando lo hacen:
trap command signalsse ejecutacommandcuando uno de ellossignalsestá "elevado".$(command), ejecutacommandy captura su salida.Cuando el comando falla, este fragmento de código captura el número de historial del último comando guardado en el historial y lo almacena en una variable para su eliminación futura.
Simple, pero funciona incorrectamente con
HISTCONTROLyHISTIGNORE: cuando el comando no se guarda en el historial debido a una de las variables, el número de historial del último comando guardado en el historial es el comando anterior; entonces, si un comando incorrecto no se guarda en el historial, el comando anterior se eliminará.Versión un poco más complicada, que funciona correctamente en ese caso:
Elimine los comandos almacenados más tarde:
Explicación:
Al salir de Bash, para cada número de historial único, elimine la entrada de historial correspondiente,
luego borre
FAILED_COMMANDSpara no eliminar comandos que heredaron números de historial de comandos ya eliminados.Si está seguro de que
FAILED_COMMANDSestará libre de duplicados, puede iterar sobre él(es decir, escribir
for i in $FAILED_COMMANDS). Sin embargo, si espera que no se ordene de mayor a menor (en este caso, siempre lo es), reemplácelouniqconsort -rnu.Los números de historial
FAILED_COMMANDSdeben ser únicos y ordenados de mayor a menor, porque cuando elimina la entrada, los números de los siguientes comandos se desplazan, es decir. cuando emitehistory -d 2, la tercera entrada se convierte en la segunda, la cuarta se convierte en la tercera, etc.Debido a que, al utilizar este código, no se puede llamar de forma manual
history -d <n>, donde
nes menor o igual al mayor número almacenado enFAILED_COMMANDSy esperar que el código funcione correctamente.
Es probablemente una buena idea conectar
exit_handleraEXIT, pero también se puede llamar en cualquier momento anterior.fuente