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?

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.)


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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.