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:
error_handler() {
FAILED_COMMANDS="$(history | tail -1l | cut -c -5) $FAILED_COMMANDS"
}
trap error_handler ERR
trap command signals
s'exécute command
lorsque l'un des signals
est "levé".
$(command)
, exécute command
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
et HISTIGNORE
- 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:
debug_handler() {
LAST_COMMAND=$BASH_COMMAND;
}
error_handler() {
local LAST_HISTORY_ENTRY=$(history | tail -1l)
# if last command is in history (HISTCONTROL, HISTIGNORE)...
if [ "$LAST_COMMAND" == "$(cut -d ' ' -f 2- <<< $LAST_HISTORY_ENTRY)" ]
then
# ...prepend it's history number into FAILED_COMMANDS,
# marking the command for deletion.
FAILED_COMMANDS="$(cut -d ' ' -f 1 <<< $LAST_HISTORY_ENTRY) $FAILED_COMMANDS"
fi
}
trap error_handler ERR
trap debug_handler DEBUG
Supprimez les commandes stockées un peu plus tard:
exit_handler() {
for i in $(echo $FAILED_COMMANDS | tr ' ' '\n' | uniq)
do
history -d $i
done
FAILED_COMMANDS=
}
trap exit_handler EXIT
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), remplacez uniq
par sort -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 émettez history -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.