Parfois, je comprends mal la syntaxe d'une commande:
# mysql -d test
mysql: unknown option '-d'
# echo $?
2
J'essaye encore et je fais les choses correctement:
# mysql --database test
Welcome to the MySQL monitor.
mysql >
...
Comment empêcher la première commande, avec un code d'erreur différent de 0, d'entrer dans l'historique?
bash
command-history
Adam Matan
la source
la source
La seule façon de penser à cela serait d'utiliser
history -d
dans$PROMPT_COMMAND
. Le problème avec ceci ou n'importe quelle approche est qu'il est impossible de dire si une commande s'est terminée avec une erreur ou s'est terminée avec succès avec un code de sortie non nul.la source
Il est bon d'avoir le dernier commentaire incorrect pour le corriger, mais peu de temps après, cela devient des ordures potentiellement déroutantes.
Mon approche est en deux étapes: stocker les commandes qui échouent lorsqu'elles le font et les supprimer un peu plus tard.
Stockez les commandes qui échouent lorsqu'elles le font:
trap command signals
s'exécutecommand
lorsque l'un dessignals
est "levé".$(command)
, exécutecommand
et capture sa sortie.Lorsque la commande échoue, cet extrait de code capture le numéro d'historique de la dernière commande enregistrée dans l'historique et le stocke dans une variable pour une suppression future.
Simple, mais ne fonctionne pas correctement avec
HISTCONTROL
etHISTIGNORE
- lorsque la commande n'est pas enregistrée dans l'historique en raison de l'une des variables, le numéro d'historique de la dernière commande enregistrée dans l'historique est celui de la commande précédente; ainsi, si une commande incorrecte n'est pas enregistrée dans l'historique, la commande précédente va être supprimée.Version légèrement plus compliquée, qui fonctionne correctement dans ce cas:
Supprimez les commandes stockées un peu plus tard:
Explication:
Lorsque vous quittez Bash, pour chaque numéro d'historique unique, supprimez l'entrée d'historique correspondante,
puis désactivez
FAILED_COMMANDS
pour ne pas supprimer les commandes qui ont hérité des numéros d'historique des commandes déjà supprimées.Si vous êtes sûr qu'il
FAILED_COMMANDS
ne contiendra pas de doublons, vous pouvez simplement le répéter(c'est-à-dire écrire
for i in $FAILED_COMMANDS
). Si, cependant, vous vous attendez à ce qu'il ne soit pas trié du plus grand au plus petit (dans ce cas, il l'est toujours), remplacezuniq
parsort -rnu
.Les numéros d'historique
FAILED_COMMANDS
doivent être uniques et triés du plus grand au plus petit, car lorsque vous supprimez l'entrée, les numéros des commandes suivantes sont décalés, c'est-à-dire. lorsque vous émettezhistory -d 2
, la 3e entrée devient la 2e, la 4e devient la 3e, etc.Pour cette raison, lorsque vous utilisez ce code, vous ne pouvez pas appeler manuellement
history -d <n>
où
n
est plus petit ou égal au plus grand nombre stocké dansFAILED_COMMANDS
et vous attendre à ce que le code fonctionne correctement.
Il est probablement une bonne idée d'accrocher
exit_handler
àEXIT
, mais vous pouvez aussi l' appeler à tout moment plus tôt.la source