bash HISTSIZE vs HISTFILESIZE?


174

Quelle est la différence entre HISTSIZEvs. HISTFILESIZE?

Ils sont utilisés pour étendre l'historique de bash au-delà des 500 lignes par défaut.

Il semble y avoir un manque de clarté ici et dans d'autres forums sur les raisons pour lesquelles ils sont tous deux nécessaires. ( Exemple 1 , Exemple 2 , Exemple 3 ).

Réponses:


289

Réponse courte:

HISTSIZE est le nombre de lignes ou de commandes stockées en mémoire dans une liste d'historique pendant que votre session bash est en cours.

HISTFILESIZE est le nombre de lignes ou de commandes qui (a) sont autorisées dans le fichier d'historique au démarrage d'une session, et (b) sont stockées dans le fichier d'historique à la fin de votre session bash pour une utilisation dans les sessions futures.

Notez la distinction entre file: sur disque - et list: en mémoire.

Longue réponse:

Toutes les infos ci-dessus + quelques exemples:

Exemple 1 : HISTFILESIZE=10etHISTSIZE=10

  1. Vous démarrez votre session.
  2. Votre HISTFILE (fichier qui stocke votre historique de commandes bash), est tronqué pour contenir HISTFILESIZE = 10 lignes.
  3. Vous écrivez 50 lignes.
  4. À la fin de vos 50 commandes, seules les commandes 41 à 50 sont dans votre liste d'historique, dont la taille est déterminée par HISTSIZE = 10.
  5. Vous terminez votre session.
  6. En supposant que ce histappendn'est pas activé, les commandes 41 à 50 sont enregistrées dans votre HISTFILE qui contient maintenant les 10 commandes qu'il contenait au début plus les 10 commandes nouvellement écrites.
  7. Votre HISTFILE est tronqué pour contenir HISTFILESIZE = 10 lignes.
  8. Vous avez maintenant 10 commandes dans votre historique - les 10 dernières que vous venez de taper dans la session que vous venez de terminer.
  9. Lorsque vous démarrez une nouvelle session, vous recommencez à 1 avec un HISTFILE de HISTFILESIZE = 10.

Exemple 2 : HISTFILESIZE=10etHISTSIZE=5

  1. Vous démarrez votre session.
  2. Votre HISTFILE (fichier qui stocke votre historique de commandes bash), est tronqué pour contenir au plus HISTFILESIZE = 10 lignes.
  3. Vous écrivez 50 lignes.
  4. À la fin de vos 50 commandes, seules les commandes 46 à 50 sont dans votre liste d'historique, dont la taille est déterminée par HISTSIZE = 5.
  5. Vous terminez votre session.
  6. En supposant que ce histappendn'est pas activé, les commandes 46 à 50 sont enregistrées dans votre HISTFILE qui a maintenant les 10 commandes qu'il contenait au début plus les 5 commandes nouvellement écrites.
  7. Votre HISTFILE est tronqué pour contenir HISTFILESIZE = 10 lignes.
  8. Vous avez maintenant 10 commandes dans votre historique - 5 d'une session précédente et les 5 dernières que vous venez de taper dans la session que vous venez de terminer.
  9. Lorsque vous démarrez une nouvelle session, vous recommencez à 1 avec un HISTFILE de HISTFILESIZE = 10.

Exemple 3 : HISTFILESIZE=5etHISTSIZE=10

  1. Vous démarrez votre session.
  2. Votre HISTFILE (fichier qui stocke votre historique de commandes bash), est tronqué pour contenir au plus HISTFILESIZE = 5 lignes.
  3. Vous écrivez 50 lignes.
  4. À la fin de vos 50 commandes, seules les commandes 41 à 50 sont dans votre liste d'historique, dont la taille est déterminée par HISTSIZE = 10.
  5. Vous terminez votre session.
  6. En supposant que ce histappendn'est pas activé, les commandes 41 à 50 sont enregistrées dans votre HISTFILE qui a maintenant les 5 commandes qu'il contenait au début plus les 10 commandes nouvellement écrites.
  7. Votre HISTFILE est tronqué pour contenir HISTFILESIZE = 5 lignes.
  8. Vous avez maintenant 5 commandes dans votre historique - les 5 dernières que vous venez de taper dans la session que vous venez de terminer.
  9. Lorsque vous démarrez une nouvelle session, vous recommencez à l'étape 1 avec un HISTFILE de HISTFILESIZE = 5.

Infos de elixir_sinari :

Le «fichier» d'historique n'est pas mis à jour lorsque vous tapez les commandes. Les commandes sont stockées dans une "liste" séparément (accessible par la commande historique). Le nombre de ces commandes stockées est contrôlé par la valeur HISTSIZE. Lorsque le shell (interactif) se termine, les dernières lignes $ HISTSIZE sont copiées / ajoutées à $ HISTFILE à partir de cette "liste". Si HISTFILESIZE est défini, alors après cette opération, il est garanti que seules les lignes $ HISTFILESIZE (les plus récentes) existent dans $ HISTFILE. Et quand le shell démarre, la "liste" est initialisée à partir de $ HISTFILE jusqu'à un maximum de commandes $ HISTSIZE.

Et de la man bashpage:

La valeur de la variable HISTSIZE est utilisée comme nombre de commandes à enregistrer dans une liste d'historique. Le texte des dernières commandes HISTSIZE (500 par défaut) est enregistré. (...)

Au démarrage, l'historique est initialisé à partir du fichier nommé par la variable HISTFILE (par défaut ~ / .bash_history). Le fichier nommé par la valeur de HISTFILE est tronqué, si nécessaire, pour ne pas contenir plus que le nombre de lignes spécifié par la valeur de HISTFILESIZE. (...) Quand un shell interactif se termine, les dernières lignes $ HISTSIZE sont copiées de la liste d'historique vers $ HISTFILE. Si l'option shell histappend est activée (voir la description de shopt sous SHELL BUILTIN COMMANDS ci-dessous), les lignes sont ajoutées au fichier historique, sinon le fichier historique est écrasé. Si HISTFILE n'est pas défini ou si le fichier d'historique n'est pas accessible en écriture, l'historique n'est pas enregistré. (...) Après avoir enregistré l'historique, le fichier d'historique est tronqué pour ne contenir pas plus de lignes HISTFILESIZE. Si HISTFILESIZE n'est pas défini,


27
+1 Cette réponse est incroyablement complète! Un peu trop, je pense. La plupart des gens n'atteindront pas la fin. Je pense que vous devriez envisager de le résumer
slezica

22
@slezica Je ne suis pas d'accord avec la deuxième partie de votre commentaire: j'en suis arrivé à la fin et je peux dire que chaque information contenue dans la réponse est utile. Le fait que certaines personnes soient trop paresseuses pour lire quelques lignes ne devrait pas justifier la suppression d'informations utiles pour les autres.
Bastien

1
@Bastien en supposant que vous êtes un analyseur à puces, vous n'aurez aucune difficulté à lire ceci.
Pithikos

6
Regardez, mon disque dur fait 1 To et en grande partie vide, et j'ai des tas de cycles CPU et de RAM inactifs, et je veux enregistrer autant d'historique de bash que raisonnablement possible - donc quand j'ai besoin de rechercher cette commande stupide, je n'ai pas. t couru en deux ans, je sais que c'est dans mon histoire bash. Pour le rendre plus concret, disons jusqu'à 50 Mo d'historique de bash. Quelles valeurs recommandez-vous?
CivFan

2
@Matthew désolé, je ne le sais pas!
arturomp

6

S'appuyant sur ce qu'a dit arturomp et dans un effort pour le rendre un peu plus clair.

En supposant que vous ayez une histoire longue de 2000 ans.

~$ history
    1  sdf
    2  fghdfgjf
    3  fghfghdf
   ..  ..
 2027  78
 2028  57
 2029  yu45u

Vous pouvez réduire ce qui vous est montré HISTSIZE

~$ HISTSIZE=5
~$ history
 2026  546
 2027  78
 2028  56
 2029  yu45u
 2030  HISTSIZE=5

Maintenant, quel que soit le nombre de commandes que vous saisissez, seules les 5 dernières seront enregistrées.

~$ ABC
~$ GGH
~$ GSDHFG
~$ JFDR
~$ ABSDDS
~$ AHFGHFD
<close terminal>
<open new terminal>
~$ history
    1  sdf
    2  fghdfgjf
    3  fghfghdf
   ..  ..
 2028  56
 2029  yu45u
 2030  HISTSIZE=5
 2031  GGH
 2032  GSDHFG
 2033  JFDR
 2034  ABSDDS
 2035  AHFGHFD

On voit clairement que notre première commande ("ABC") n'est pas dans l'historique puisque seules les 5 dernières commandes ont été enregistrées.

À présent, l'historique total est stocké dans un fichier ( .bash_history) et vous pouvez modifier la durée de ce fichier avec l'extension HISTFILESIZE. Par exemple avec un 2033 HISTFILESIZE, dans mon cas, j'aurais ceci:

~$ history
    1  fghfghdf
    2  gegege
    3  gege
   ..  ..
 2028  HISTSIZE=5
 2029  GGH
 2030  GSDHFG
 2031  JFDR
 2032  ABSDDS
 2033  AHFGHFD

3
Quelles sont les valeurs recommanderiez - vous si je veux tout l' histoire de tous les terminaux concurrents à enregistrer sur l'histoire bash, pour toujours ? En d'autres termes, enregistrez tout, toujours, et ne supprimez jamais rien.
CivFan

10
@CivFan: définissez HISTSIZE=-1et HISTFILESIZE=-1.
M. Dudley

2
C'est complètement faux. Le régler à -1 effacera tout.
Brendan Byrd

3
@BrendanByrd La bashpage de manuel dit: Non-numeric values and numeric values less than zero inhibit truncationmais alors je n'ai pas eu le courage de vérifier si cela est vrai parce que je ne veux pas perdre mon histoire :-)
SebMa

3
@SebMa J'ai changé mes paramètres en HISTSIZE='INFINITY'et HISTFILESIZE='ANDBEYOND'. Comme ils ne sont pas numériques, ils sauvegardent tout. Merci pour le conseil!
Connor
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.