Forum Linux.débutant [Résolu]Mon .bash_history n'ignore pas ce que je lui demande d'ignorer !

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes :
1
1
août
2017

Après avoir, il y a un moment, ajouté à .bashrc la ligne :

export HISTCONTROL=ignoreboth:erasedups

je me rends compte qu'il y a plein de commandes en double (voire en centuple !). Il est où le problème ? Quelqu'un a déjà eu ce souci ?

Accessoirement, auriez-vous une solution pour purger bash_history, je devrais m'en sortir mais j'ai un peu la flemme en ce moment ?

Merci.

  • # .

    Posté par  . Évalué à 2.

    export HISTCONTROL=ignoreboth:erasedups

    Je dirais que le « export » est en trop car ce n'est pas une variable d'environnement, mais je viens de tester et c'est ok.
    Si tu fais set | grep HISTCONTROL ça t'affiche bien HISTCONTROL=ignoreboth:erasedups ?

     

    Accessoirement, auriez-vous une solution pour purger bash_history

    rm ~/.bash_history -f
    ou pour garder les 100 dernières lignes :
    tail -n 100 ~/.bash_history > ~/.bash_history.tmp; mv ~/.bash_history.tmp ~/.bash_history -f
    Je n'ai pas trouvé de moyen simple de faire ça sans fichier temporaire (ça ne fonctionne que pour les petits fichiers, pas pour les gros, donc pas générique).

    • [^] # Re: .

      Posté par  (site web personnel) . Évalué à 1.

      Merci, oui la commande :

      set | grep HISTCONTROL
      

      ainsi que echo $HISTCONTROL, m'affichent bien HISTCONTROL=ignoreboth:erasedups. C'est pour ça que je ne comprends pas. Le coup de l'export je l'ai trouvé dans pas mal de tutos, et ça me semblait plutôt logique, mais j'accepte ton explication.

      Ah et quand je parlais de purger le bash_history, je voulais dire : supprimer les entrées en double (ça m'apprendra à mal m'exprimer).

      « Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. »

  • # purger le bash_history

    Posté par  (site web personnel) . Évalué à 1.

    J'ai le même souci avec HISTCONTROL=ignoreboth:erasedups, je n'ai jamais trouvé de solution :-/

    Pour la question de "purger le bash_history" j'avais trouvé cette commande qui supprime les doublons en gardant l'ordre de l'historique :
    cat .bash_history |awk '!x[$0]++'>history_uniq.txt

    wind0w$ suxX, GNU/Linux roxX!

    • [^] # Re: purger le bash_history

      Posté par  . Évalué à 2.

      cat .bash_history |awk '!x[$0]++'>history_uniq.txt

      Et ça marche? J'ai déjà un peu joué avec awk, mais la je n'arrive pas à comprendre ce que le script fait…

      Sinon, pourquoi passer par un cat? Il suffirait de faire awk '!x[$0]++' -- .bash_history > history_uniq.txt non?

  • # nettoyer bash_history

    Posté par  (site web personnel) . Évalué à 1.

    Bonjour.
    J'ai fait un script Python que je fais lancer à chaque démarrage de mon ordi et qui efface les doublons dans .bash_history

    Il y a peut-être plus simple mais il fait le boulot comme prévu :

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    # UN SCRIPT POUR SIMPLIFIER LE FICHIER .BASH_HISTORY
    
    # importation des modules utiles :
    from __future__ import print_function
    import os
    import io
    
    # le fichier .bash_history :
    THE_FILE = os.path.join(os.path.expanduser('~'), '.bash_history')
    #print('THE_FILE:', THE_FILE)
    
    try:
        # on lit le fichier :
        oldLines = []
        theFile = io.open(THE_FILE, 'rt', encoding='utf-8')
        oldLines = theFile.readlines()
        theFile.close()
        # on le retourne pour garder les derniers appels en priorité :
        oldLines.reverse()
    
        newLines = []
        for line in oldLines:
            # on ne récupère que les lignes non vides et pas déjà là :
            if (line != '') and (line not in newLines):
                newLines.append(line)
                #print(line)
        #print(newLines)
        # on retourne pour remettre dans l'ordre historique :
        newLines.reverse()
    
        # on récrit le fichier :
        theFile = io.open(THE_FILE, 'wt', encoding='utf-8')
        for line in newLines:
            theFile.write(line)
        theFile.close()
    except:
        print('ERROR')
    

    O-

  • # pas testé, mais

    Posté par  . Évalué à 3.

    le erasedups doit probablement effacer les lignes en doubles
    ex : tu fais 2 ou 3 fois ls il n'en garde qu'un
    tu fais par compte ls puis cp a b puis ls
    il va considéré les 2 lscomme n'etant pas des doublons car il y a un CP entre les deux.

    • [^] # Re: pas testé, mais

      Posté par  . Évalué à 2.

      Autrement dit, il se contenterait de faire un sort -u .bash_history > .bash_history?

      • [^] # Re: pas testé, mais

        Posté par  . Évalué à 3.

        non car le sort va les classer par ordre alphabetique
        alors que history le classe par "ancienneté"

        • [^] # Re: pas testé, mais

          Posté par  . Évalué à 2.

          Éxact… marrant, me semblait que le -u évitait le tri, je devais confondre avec uniq :S

      • [^] # Re: pas testé, mais

        Posté par  . Évalué à 4.

        sort -u .bash_history > .bash_history.tmp ; mv .bash_history.tmp .bash_history

        sinon tu vides le fichier (le shell va « recréer » le fichier pour rediriger la sortie avant d'exécuter sort).

        • [^] # Re: pas testé, mais

          Posté par  (site web personnel) . Évalué à 1.

          sort -u .bash_history > .bash_history.tmp ; mv .bash_history.tmp .bash_history

          Ah ben merci, ça marche !
          Du coup j'ai ajouté cette ligne dans mon .bashrc comme ça à chaque connexion elle fait le ménage :>

          « Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. »

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.