Supprimer les dernières N lignes de l'historique bash

40

Lors du collage accidentel d'un fichier dans le shell, une tonne d'entrées non-sens laides sont insérées dans l'historique bash. Existe-t-il un moyen propre de supprimer ces entrées? Évidemment, je pourrais fermer le shell et éditer le .bash_historyfichier manuellement, mais peut-être qu’une sorte d’API serait disponible pour modifier l’historique du shell actuel?

ThiefMaster
la source

Réponses:

36

Vous pouvez utiliser history -d offsetbuiltin pour supprimer une ligne spécifique de l'historique du shell actuel ou history -cpour effacer tout l'historique.

Ce n'est pas vraiment pratique si vous souhaitez supprimer une plage de lignes, car il ne faut qu'un argument comme argument, mais vous pouvez l'envelopper dans une fonction avec une boucle.

rmhist() {
    start=$1
    end=$2
    count=$(( end - start ))
    while [ $count -ge 0 ] ; do
        history -d $start
        ((count--))
    done
}

Appelez ça avec rmhist first_line_to_delete last_line_to_delete. (Numéros de ligne en fonction du résultat de history.)

(Utilisez history -wpour forcer une écriture dans le fichier d'historique.)

Tapis
la source
1
Puisque l'OP a demandé la suppression des N dernières lignes, ce script devrait être modifié en procédant de la manière suivante: tot_lines=$(history | wc -l)puis en répétant history -d $(( tot_lines - $1 )).
PlasmaBinturong
2
Au lieu de $(history | wc -l), il y a la variable $HISTCMDqui peut être utilisée.
PlasmaBinturong
29

Juste cette ligne dans l'invite de commande aidera.

for i in {1..N}; do history -d START_NUM; done

Où START_NUM est la position de départ de l'entrée dans l'historique. N est le nombre d'entrées à supprimer.

ex: for i in {1..50}; do history -d 1030; done

utilisateur2982704
la source
3
Je me demande pourquoi ce n'est pas déjà une fonction intégrée. «l'histoire» est un très vieil outil.
Petr Gladkikh
sert très bien son but, mais cette commande peut être vue dans l'histoire :)
Rajeev Akotkar
askubuntu.com/a/978276/22866 a un bon moyen de supprimer la commande "delete from history" de l'histoire :-)
HanSooloo
0

La réponse de user2982704 a presque fonctionné pour moi, mais pas tout à fait. Je devais faire une petite variation comme celle-ci.

En supposant que mon historique est à 1000 et que je veux supprimer les 50 dernières entrées

start=1000

for i in {1..50}; do count=$((start-i)); history -d $count; done
aberpaul
la source