bash HISTSIZE vs. HISTFILESIZE?

Quelle est la différence entre HISTSIZE et HISTFILESIZE ?

ils sont utilisés pour étendre l'histoire 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 la raison pour laquelle ils sont tous les deux nécessaires. ( Exemple 1 , Exemple 2 , Exemple 3 ).

109
demandé sur arturomp 2013-10-18 20:43:37

2 réponses

courte réponse:

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

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

noter la distinction entre fichier - sur disque - et liste - en mémoire.

longue réponse:

Toutes les infos ci-dessus + quelques exemples:

HISTFILESIZE=10 et HISTSIZE=10

  1. vous commencez votre session.
    1. votre HISTFILE (fichier qui stocke l'historique de vos commandes bash), est tronqué pour contenir HISTFILESIZE=10 lignes.
  2. vous écrivez 50 lignes.
  3. à la fin de vos 50 commandes, seules les commandes 41 à 50 sont dans votre liste historique, dont la taille est déterminée par HISTSIZE=10.
  4. vous terminez votre séance.
    1. en supposant que histappend n'est pas activé, les commandes 41 à 50 sont sauvegardées dans votre fichier HISTFILE qui a maintenant les 10 commandes qu'il détenait au début plus les 10 commandes nouvellement écrites.
    2. votre HISTFILE est tronqué pour contenir HISTFILESIZE=10 lignes.
  5. Vous avez maintenant 10 commandes dans votre histoire - les 10 dernières que vous venez de taper dans la session vient de se terminer.
  6. lorsque vous commencez une nouvelle session, vous recommencez à 1 avec un HISTFILE de HISTFILESIZE=10.

HISTFILESIZE=10 et HISTSIZE=5

  1. vous commencez votre session.
    1. Votre HISTFILE (fichier qui stocke l'historique de vos commandes bash), est tronqué pour contenir au maximum HISTFILESIZE=10 lignes.
  2. vous écrivez 50 lignes.
  3. à la fin de vos 50 commandes, seules les commandes 46 à 50 sont dans votre liste historique, dont la taille est déterminée par HISTSIZE=5.
  4. vous terminez votre séance.
    1. en supposant que histappend n'est pas activé, les commandes 46 à 50 sont sauvegardées sur votre HISTFILE qui a maintenant les 10 commandes qu'il tenait au début plus les 5 commandes nouvellement écrites.
    2. votre HISTFILE est tronqué pour contenir HISTFILESIZE=10 lignes.
  5. 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.
  6. lorsque vous commencez une nouvelle session, vous recommencez à 1 avec un HISTFILE de HISTFILESIZE=10.

HISTFILESIZE=5 et HISTSIZE=10

  1. vous commencez votre session.
    1. votre HISTFILE (fichier qui stocke l'historique de vos commandes bash), est tronqué pour contenir au plus HISTFILESIZE=5 lignes.
  2. vous écrivez 50 lignes.
  3. à la fin de vos 50 commandes, seules les commandes 41 à 50 sont dans votre liste d'histoire, dont la taille est déterminée par HISTSIZE=10.
  4. vous terminez votre séance.
    1. en supposant que histappend n'est pas activé, les commandes 41 à 50 sont sauvegardées dans votre fichier HISTFILE qui a maintenant les 5 commandes qu'il détenait au début plus les 10 commandes nouvellement écrites.
    2. votre HISTFILE est tronqué pour contenir HISTFILESIZE=5 lignes.
  5. Vous avez maintenant 5 commandes dans votre histoire - les 5 dernières que vous venez de taper dans l' session que vous venez de terminer.
  6. lorsque vous commencez une nouvelle session, vous recommencez à l'étape 1 avec un HISTFILE de HISTFILESIZE=5.

les Infos de elixir_sinari :

L'histoire "fichier" n'est pas mis à jour à mesure que vous tapez les commandes. Le les commandes sont stockés dans une "liste" séparément (accessible par l'histoire commande.) Le nombre de ces commandes stockées est contrôlé par Valeur HISTSIZE. Quand le shell (interactif) sort, le dernier Les lignes $ HISTSIZE sont copiées / annexées à $HISTFILE à partir de cette "liste". Si HISTFILESIZE est défini, puis après cette opération, il est garanti que seules les lignes $HISTFILESIZE (les plus récentes) existent dans $ HISTFILE . Et lorsque le shell démarre, la "liste" est initialisée à partir de $HISTFILE jusqu'à un maximum de commandes $HISTSIZE.

et de la man bash page:

la valeur de la variable HISTSIZE est utilisé comme le nombre de commandes à sauvegarder dans une liste d'historique. Le texte des dernières commandes HISTSIZE (par défaut 500) 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. (...) Lorsqu'un shell interactif sort, les dernières lignes $ HISTSIZE sont copiés à partir de l'histoire liste de $HISTFILE. Si l'option de shell histappend est activée (voir la description de shopt sous les commandes de construction de SHELL ci-dessous), les lignes sont annexées au dossier historique, sinon le dossier historique est écrasé. Si HISTFILE n'est pas activé, ou si le fichier d'historique n'est pas n'est pas enregistré. (...) Après l'enregistrement de l'histoire, la fichier d'historique est tronquer ne pas contenir plus de lignes D'HISTFILESIZE. Si HISTFILESIZE n'est pas défini, aucune troncature n'est effectuée.

202
répondu arturomp 2013-10-18 16:43:37

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

supposez que vous avez 2000-quelque chose de longue histoire..

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

vous pouvez réduire ce que vous voyez avec HISTSIZE

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

maintenant, peu importe le nombre de commandes que vous tapez, 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

Nous pouvons clairement voir que notre première commande ("ABC") n'est pas dans l'histoire puisque seuls les 5 dernières commandes ont été enregistrées.

maintenant, l'historique total est stocké dans un fichier ( .bash_history ) et vous pouvez modifier combien de temps ce fichier obtient avec le 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
répondu Pithikos 2016-10-12 09:57:20