¿Cuánto duran los contenidos del archivo .bash_history?

11

¿Cómo puedo modificar el contenido de mi bash_historyarchivo? ¿Qué valores o variables controlan cuánto dura el historial? ¿Hay alguna otra cosa que pueda cambiar para proporcionar un mejor control de mi historial de BASH?

nbro
fuente
2
No creo que este archivo esté controlado por el tiempo, sino por el tamaño final del archivo. Vea aquí: ¿Hay alguna forma de establecer el tamaño de la lista de historial en bash en más de 5000 líneas? . Entonces el env. variables HISTSIZEy HISTFILESIZEson las únicas superficies de control que tiene para controlar la cantidad de historial que se mantiene.
slm

Respuestas:

12

Hay dos variables que controlan el tamaño del historial:

HISTFILESIZE El número máximo de líneas contenidas en el archivo de historial. Cuando a esta variable se le asigna un valor, el archivo de historial se trunca, si es necesario, para contener no más que ese número de líneas eliminando las entradas más antiguas. El archivo de historial también se trunca a este tamaño después de escribirlo cuando sale un shell. Si el valor es 0, el archivo de historial se trunca a tamaño cero. Los valores no numéricos y los valores numéricos inferiores a cero inhiben el truncamiento. El shell establece el valor predeterminado en el valor de HISTSIZE después de leer los archivos de inicio.

y

HISTSIZE El número de comandos para recordar en el historial de comandos (ver HISTORIAL a continuación). Si el valor es 0, los comandos no se guardan en la lista del historial. Los valores numéricos inferiores a cero dan como resultado que cada comando se guarde en la lista del historial (no hay límite). El shell establece el valor predeterminado en 500 después de leer los archivos de inicio.

Estas dos variables le permiten controlar el comportamiento de su historial. Básicamente, HISTSIZEes el número de comandos guardados durante su sesión actual y HISTFILESIZEes el número de comandos que se recordarán en todas las sesiones. Así por ejemplo:

$ echo $HISTSIZE 
10
$ echo $HISTFILESIZE 
5
$ history | wc
     10      29     173

En el ejemplo anterior, dado que HISTSIZEse establece en 10, historydevuelve una lista de 10 comandos. Sin embargo, si cierra sesión y luego vuelve a iniciar sesión, historysolo devolverá 5 comandos porque HISTFILESIZEestá configurado en 5. Esto se debe a que, una vez que sale de su sesión, sus HISTFILESIZElíneas de su historial se guardan en su archivo de historial ( ~/.bash_historyde forma predeterminada, pero controlado por HISTFILE) En otras palabras, los comandos se agregan HISTFILEhasta que llegue a las $HISTFILESIZElíneas en ese punto, cada línea posterior agregada significa que se eliminará el primer comando del archivo.

Puede establecer los valores de estas variables en su ~/.profile(o ~/.bash_profilesi ese archivo existe). No los establezca en su ~/.bashrcprimer lugar porque no tienen nada que establecer allí y, en segundo lugar, porque eso provocaría un comportamiento diferente en los shells de inicio de sesión y no inicio de sesión, lo que puede ocasionar otros problemas .

Otras variables útiles que le permiten ajustar el comportamiento de su historial son:

  • HISTIGNORE: Esto le permite ignorar ciertos comandos comunes que rara vez son de interés. Por ejemplo, podría establecer:

    export HISTIGNORE="pwd:df:du"

    Eso haría que cualquier comando a partir de pwd, dfo duque se ignoran y no se guarda en su historia.

  • HISTCONTROL: Este te permite elegir cómo funciona el historial. Personalmente, lo configuré en lo HISTCONTROL=ignoredupsque hace que guarde comandos duplicados solo una vez. Otras opciones son ignorespaceignorar los comandos que comienzan con espacios en blanco y erasedupsque provocan que todas las líneas anteriores que coincidan con la línea actual se eliminen de la lista del historial antes de que esa línea se guarde. ignorebothes la abreviatura de ignorespace e ignoredups.

  • HISTTIMEFORMAT: Esto le permite configurar el formato de hora del archivo de historial. Vea la respuesta de Pandya o lea man bashpara más detalles.


Para más ajustes, tiene:

  • La histappendopción bash. Esto se puede configurar ejecutando shopt -s histappendo agregando ese comando a su ~/.bashrc. Si esta opción está configurada

    la lista de historial se agrega al archivo nombrado por el valor de la variable HISTFILE cuando el shell sale, en lugar de sobrescribir el archivo.

    Esto es muy útil ya que le permite combinar las historias de diferentes sesiones (piense en diferentes terminales, por ejemplo).

  • El historycomando tiene dos opciones útiles:

    • history -a : hace que el último comando se escriba automáticamente en el archivo de historial

    • history -r : importa el archivo de historial a la sesión actual.

    Podría, por ejemplo, agregar estos dos comandos a su PROMPT_COMMAND(que se ejecuta cada vez que su shell muestra el indicador, por lo que cada vez que inicia un nuevo shell y después de cada comando que ejecuta en él):

    export PROMPT_COMMAND='history -a;history -r;'

    Combinados, se aseguran de que cualquier nueva terminal que abra importará inmediatamente el historial de cualquier otra sesión de shell. El resultado es un historial común en todas las terminales / sesiones de shell.

terdon
fuente
2

El tamaño predeterminado del archivo de historial es de 500 líneas. Una vez que el archivo .bash_history alcanza las 500 líneas, las primeras entradas se eliminan para dejar espacio a las líneas más nuevas, como en FIFO. Puede cambiar esto cambiando el valor de la variable HISTFILESIZEque por defecto tiene el valor 500.

Poner un HISTFILESIZE=10000en su .bashrc aumentará el número de líneas que el archivo de historial puede contener a 10000, lo que aumenta la vida útil de su contenido.

Sree
fuente
2
nota: si aumenta HISTSIZEel límite, considere cambiar HISTFILEtambién. Si ejecuta bash --norc HISTSIZEvolverá al valor predeterminado, truncando su HISTFILEsalida.
llua
Gracias, @llua. Del mismo modo, si su sistema /etc/bash.bashrcestablece un HISTFILESIZE(o tal vez HISTSIZE; no he comprobado cuál), entonces Bash parece truncarse .bash_historyen el punto que lee /etc/bash.bashrc(o al menos en algún momento antes de que su nuevo límite se establezca en sus propios archivos de inicio de Bash). Para evitar esto, nuevamente, configure el suyo HISTFILEpara que su historial real vaya allí y no en el .bash_historyarchivo que Bash está truncando.
Chris Povirk
(¡Pero no lo hagas export, ya que hacerlo lo haría visible para cualquier niño conchas, que luego podría verse truncado en lugar de hacerlo .bash_history!)
Chris Povirk
0

Lea man bashpara obtener más detalles sobre la historia de bash como:

HISTCONTROL
       Una lista de valores separados por dos puntos que controlan cómo se guardan los comandos en la lista del historial.
       Si la lista de valores incluye ignorespace, las líneas que comienzan con un carácter de espacio son
       no guardado en la lista del historial. Un valor de ignoredups provoca líneas que coinciden con las anteriores
       la entrada del historial no se guardará. Un valor de ignoreboth es la abreviatura de ignorespace y
       ignoredups. Un valor de borrados hace que todas las líneas anteriores que coincidan con la línea actual
       se eliminará de la lista del historial antes de guardar esa línea. Cualquier valor que no esté en lo anterior
       La lista se ignora. Si HISTCONTROL no está configurado o no incluye un valor válido, todas las líneas
       leído por el analizador de shell se guardan en la lista del historial, sujeto al valor de HISTIG‐
       NORE La segunda línea y las siguientes de un comando compuesto de varias líneas no se prueban,
       y se agregan al historial independientemente del valor de HISTCONTROL.
Archivo Histórico
       El nombre del archivo en el que se guarda el historial de comandos (ver HISTORIAL a continuación). El valor por defecto
       el valor es ~ / .bash_history. Si no está configurado, el historial de comandos no se guarda cuando sale un shell.
HISTFILESIZE
       El número máximo de líneas contenidas en el archivo de historial. Cuando se asigna esta variable
       un valor, el archivo de historial se trunca, si es necesario, para contener no más que ese número
       de líneas eliminando las entradas más antiguas. El archivo de historial también se trunca a este tamaño.
       después de escribirlo cuando sale un shell. Si el valor es 0, el archivo de historial se trunca en
       tamaño cero Los valores no numéricos y los valores numéricos inferiores a cero inhiben el truncamiento. los
       shell establece el valor predeterminado en el valor de HISTSIZE después de leer los archivos de inicio.
HISTIGNORE
       Una lista de patrones separados por dos puntos utilizados para decidir qué líneas de comando se deben guardar en
       La lista de la historia. Cada patrón está anclado al comienzo de la línea y debe coincidir
       la línea completa (no se agrega '*' implícito). Cada patrón se prueba contra la línea
       después de aplicar los controles especificados por HISTCONTROL. Además del caparazón normal
       caracteres de coincidencia de patrones, `& 'coincide con la línea del historial anterior. `& 'se puede escapar
       usando una barra invertida; la barra invertida se elimina antes de intentar una coincidencia. El segundo y
       las líneas posteriores de un comando compuesto de varias líneas no se prueban y se agregan a
       historia independientemente del valor de HISTIGNORE.
HISTSIZE
       El número de comandos para recordar en el historial de comandos (ver HISTORIAL a continuación). Si el
       el valor es 0, los comandos no se guardan en la lista del historial. Valores numéricos menores que cero
       da como resultado que cada comando se guarde en la lista del historial (no hay límite). La cáscara
       establece el valor predeterminado en 500 después de leer los archivos de inicio.
HISTTIMEFORMAT
       Si esta variable se establece y no es nula, su valor se usa como una cadena de formato para strftime (3)
       para imprimir la marca de tiempo asociada con cada entrada del historial que muestra el historial
       incorporado. Si se establece esta variable, las marcas de tiempo se escriben en el archivo de historial para que puedan
       ser preservado en las sesiones de shell. Esto usa el carácter de comentario del historial para distinguir
       marcas de tiempo guish de otras líneas de la historia.

En particular HISTFILESIZEy HISTSIZEque estás buscando y te ayuda.

Pandya
fuente