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 -d
en$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 signals
se ejecutacommand
cuando uno de ellossignals
está "elevado".$(command)
, ejecutacommand
y 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
HISTCONTROL
yHISTIGNORE
: 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_COMMANDS
para no eliminar comandos que heredaron números de historial de comandos ya eliminados.Si está seguro de que
FAILED_COMMANDS
estará 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ácelouniq
consort -rnu
.Los números de historial
FAILED_COMMANDS
deben 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
n
es menor o igual al mayor número almacenado enFAILED_COMMANDS
y esperar que el código funcione correctamente.
Es probablemente una buena idea conectar
exit_handler
aEXIT
, pero también se puede llamar en cualquier momento anterior.fuente