bash HISTSIZE vs. HISTFILESIZE?

174

¿Cuál es la diferencia en HISTSIZEcontra HISTFILESIZE?

Se usan para extender el historial de bash más allá de las 500 líneas predeterminadas.

Parece que hay falta de claridad aquí y en otros foros sobre por qué ambos son necesarios. ( Ejemplo 1 , Ejemplo 2 , Ejemplo 3 ).

arturomp
fuente

Respuestas:

289

Respuesta corta:

HISTSIZE es el número de líneas o comandos que se almacenan en la memoria en una lista de historial mientras su sesión de bash está en curso.

HISTFILESIZE es el número de líneas o comandos que (a) están permitidos en el archivo de historial en el momento de inicio de una sesión, y (b) se almacenan en el archivo de historial al final de su sesión de bash para usar en futuras sesiones.

Observe la distinción entre file: en el disco y list: en la memoria.

Respuesta larga:

Toda la información anterior + algunos ejemplos:

Ejemplo 1 : HISTFILESIZE=10yHISTSIZE=10

  1. Empiezas tu sesión.
  2. Su HISTFILE (archivo que almacena su historial de comandos bash) se trunca para contener HISTFILESIZE = 10 líneas.
  3. Escribes 50 líneas.
  4. Al final de sus 50 comandos, solo los comandos 41 a 50 están en su lista de historial, cuyo tamaño está determinado por HISTSIZE = 10.
  5. Termina su sesión.
  6. Suponiendo histappendque no esté habilitado, los comandos 41 a 50 se guardan en su HISTFILE, que ahora tiene los 10 comandos que tenía al principio más los 10 comandos recién escritos.
  7. Su HISTFILE se trunca para contener HISTFILESIZE = 10 líneas.
  8. Ahora tiene 10 comandos en su historial: los últimos 10 que acaba de escribir en la sesión que acaba de terminar.
  9. Cuando comienza una nueva sesión, comienza de nuevo en 1 con un HISTFILE de HISTFILESIZE = 10.

Ejemplo 2 : HISTFILESIZE=10yHISTSIZE=5

  1. Empiezas tu sesión.
  2. Su HISTFILE (archivo que almacena su historial de comandos bash) se trunca para contener como máximo HISTFILESIZE = 10 líneas.
  3. Escribes 50 líneas.
  4. Al final de sus 50 comandos, solo los comandos 46 a 50 están en su lista de historial, cuyo tamaño está determinado por HISTSIZE = 5.
  5. Termina su sesión.
  6. Suponiendo histappendque no esté habilitado, los comandos 46 a 50 se guardan en su HISTFILE, que ahora tiene los 10 comandos que tenía al principio más los 5 comandos recién escritos.
  7. Su HISTFILE se trunca para contener HISTFILESIZE = 10 líneas.
  8. Ahora tiene 10 comandos en su historial: 5 de una sesión anterior y los últimos 5 que acaba de escribir en la sesión que acaba de terminar.
  9. Cuando comienza una nueva sesión, comienza de nuevo en 1 con un HISTFILE de HISTFILESIZE = 10.

Ejemplo 3 : HISTFILESIZE=5yHISTSIZE=10

  1. Empiezas tu sesión.
  2. Su HISTFILE (archivo que almacena su historial de comandos bash) se trunca para contener como máximo HISTFILESIZE = 5 líneas.
  3. Escribes 50 líneas.
  4. Al final de sus 50 comandos, solo los comandos 41 a 50 están en su lista de historial, cuyo tamaño está determinado por HISTSIZE = 10.
  5. Termina su sesión.
  6. Suponiendo histappendque no esté habilitado, los comandos 41 a 50 se guardan en su HISTFILE, que ahora tiene los 5 comandos que tenía al principio más los 10 comandos recién escritos.
  7. Su HISTFILE se trunca para contener HISTFILESIZE = 5 líneas.
  8. Ahora tiene 5 comandos en su historial: los últimos 5 que acaba de escribir en la sesión que acaba de terminar.
  9. Cuando comienza una nueva sesión, comienza de nuevo en el paso 1 con un HISTFILE de HISTFILESIZE = 5.

Información de elixir_sinari :

El "archivo" del historial no se actualiza a medida que escribe los comandos. Los comandos se almacenan en una "lista" por separado (se accede mediante el comando de historial). El número de estos comandos almacenados se controla mediante el valor HISTSIZE. Cuando el shell (interactivo) sale, las últimas líneas $ HISTSIZE se copian / anexan a $ HISTFILE desde esa "lista". Si se establece HISTFILESIZE, luego de esta operación, se garantiza que solo existan líneas $ HISTFILESIZE (más recientes) en $ HISTFILE. Y cuando se inicia el shell, la "lista" se inicializa desde $ HISTFILE hasta un máximo de $ HISTSIZE comandos.

Y de la man bashpágina:

El valor de la variable HISTSIZE se usa como el número de comandos para guardar en una lista de historial. Se guarda el texto de los últimos comandos HISTSIZE (predeterminado 500). (...)

Al inicio, el historial se inicializa desde el archivo nombrado por la variable HISTFILE (predeterminado ~ / .bash_history). El archivo nombrado por el valor de HISTFILE se trunca, si es necesario, para que no contenga más que el número de líneas especificado por el valor de HISTFILESIZE. (...) Cuando sale un shell interactivo, las últimas líneas $ HISTSIZE se copian de la lista del historial a $ HISTFILE. Si la opción de shell histappend está habilitada (consulte la descripción de shopt en COMANDOS DE CONSTRUCCIÓN DE SHELL a continuación), las líneas se agregan al archivo de historial; de lo contrario, el archivo de historial se sobrescribe. Si HISTFILE no está configurado, o si el archivo de historial no se puede escribir, el historial no se guarda. (...) Después de guardar el historial, el archivo de historial se trunca para que no contenga más que HISTFILESIZE líneas. Si HISTFILESIZE no está configurado,

arturomp
fuente
27
+1 ¡Esta respuesta es impresionantemente completa! Aunque un poco demasiado, creo. La mayoría de la gente no llegará al final. Creo que deberías considerar resumirlo
slezica
22
@slezica No estoy de acuerdo con la segunda parte de tu comentario: llegué al final y puedo decir que toda la información en la respuesta es útil. El hecho de que algunas personas sean demasiado flojas para leer algunas líneas no debería justificar la eliminación de información útil para las demás.
Bastien
1
@Bastien suponiendo que eres un analizador de viñetas, no tendrás dificultades para leer esto.
Pithikos
66
Mire, mi disco duro es de 1 TB y está en gran parte vacío, y tengo una gran cantidad de ciclos de CPU inactivos y RAM, y quiero guardar la mayor cantidad de historial de bash que sea razonablemente posible, así que cuando necesito buscar ese estúpido comando no tengo ' No corro en dos años, sé que está en mi historia de bash. Para hacerlo más concreto, digamos hasta 50 MB de historial de bash. ¿Qué valores me recomiendan?
CivFan
2
@Matthew lo siento, no lo sé!
arturomp
6

Sobre la base de lo que arturomp ha dicho y en un esfuerzo por aclararlo un poco.

Asumiendo que tienes 2000 años de historia ...

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

Puede reducir lo que se muestra con HISTSIZE

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

Ahora, no importa cuántos comandos escriba, solo se registrarán los últimos 5.

~$ 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

Podemos ver claramente que nuestro primer comando ("ABC") no está en el historial ya que solo se registraron los últimos 5 comandos.

Ahora, el historial total se almacena en un archivo ( .bash_history) y puede modificar el tiempo que tarda este archivo con HISTFILESIZE. Por ejemplo con un 2033 HISTFILESIZE, en mi caso tendría esto:

~$ history
    1  fghfghdf
    2  gegege
    3  gege
   ..  ..
 2028  HISTSIZE=5
 2029  GGH
 2030  GSDHFG
 2031  JFDR
 2032  ABSDDS
 2033  AHFGHFD
Pithikos
fuente
3
¿Qué valores recomendaría si quiero que todo el historial de todos los terminales concurrentes se guarde en el historial de bash, para siempre ? En otras palabras, guarde todo, siempre, y nunca elimine nada.
CivFan
10
@CivFan: Establecer HISTSIZE=-1y HISTFILESIZE=-1.
M. Dudley
2
Esto está muy mal. Establecerlo en -1 borrará todo.
Brendan Byrd
3
@BrendanByrd La bashpágina del manual dice: Non-numeric values and numeric values less than zero inhibit truncationpero no tuve el coraje de comprobar si esto es cierto porque no quiero perder mi historia :-)
SebMa
3
@SebMa Cambié mi configuración a HISTSIZE='INFINITY'y HISTFILESIZE='ANDBEYOND'. Como no son numéricos, guardan todo. ¡Gracias por el consejo!
Connor