¿Cómo: Ilimitado Bash / shell historia?


77

¿Hay una manera de definir una historia ilimitada en Bash?

Respuestas:


76

poner eso en .bashrc:

export HISTFILESIZE=
export HISTSIZE=

Ahí tienes historia ilimitada. Actualmente tengo 27000 entradas :)

De "man bash":

Si HISTFILESIZE no está establecido, no se realiza ningún truncamiento.

Eso significa que .bash_history nunca se trunca

También lo mismo parece aplicarse a HISTSIZE, aunque no pude encontrarlo documentado.

Otra característica interesante que voy a probar es la siguiente:

Si el HISTTIMEFORMAT la variable se establece, las marcas de tiempo se escriben en el archivo de historial, marcadas con el carácter de comentario de historial, por lo que pueden conservarse en las sesiones de shell.

Avísame si ya lo has probado ...


2
Esto en realidad no funciona en muchos casos y el historial de bash todavía se trunca. Vea mi respuesta a continuación para una solución más completa.
fotinakis

2
Advertencia: esto causa dolores de cabeza con gdb; si establece un HISTSIZE la variable lo tomará como un 0, lo que deshabilitará el tamaño del historial por completo.
Matteo Italia

1
notas: no necesitas export, HISTFILESIZE está en el número de líneas (no en bytes), y el archivo histórico El truncado ocurre cuando configuras la variable HISTFILESIZE (y cuando sale shell). Así que no lo configures dos veces en tu archivo de configuración con diferentes valores ...
vaab

@vaab: si no exporto HISTFILE, no puedo ver lo que mi histfile está usando "echo $ HISTFILE" en subshells, así que aunque no es necesario, puede ser útil y no hace ningún daño que pueda detectar.
Jeff Learman

39

(traspasando mi respuesta de https://stackoverflow.com/a/19533853/128597 )

Después de muchas iteraciones grandes y feas y casos extraños en los últimos años, ahora tengo una sección concisa de mi .bashrc dedicado a esto

Primero, debes comentar o elimina esta sección de tu .bashrc (por defecto para Ubuntu). Si no lo haces, entonces ciertos entornos (como correr screen sesiones) todavía truncará su historia:

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
# HISTSIZE=1000
# HISTFILESIZE=2000

Segundo, Agrega esto a la parte inferior de tu .bashrc:

# Eternal bash history.
# ---------------------
# Undocumented feature which sets the size to "unlimited".
# https://stackoverflow.com/questions/9457233/unlimited-bash-history
export HISTFILESIZE=
export HISTSIZE=
export HISTTIMEFORMAT="[%F %T] "
# Change the file location because certain bash sessions truncate .bash_history file upon close.
# http://superuser.com/questions/575479/bash-history-truncated-to-500-lines-on-each-login
export HISTFILE=~/.bash_eternal_history
# Force prompt to write history after every command.
# http://superuser.com/questions/20900/bash-history-loss
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"

Nota: todos los comandos se escriben inmediatamente después de ejecutarse, por lo que si accidentalmente pega una contraseña, no puede simplemente "matar -9 %%" para evitar la escritura del historial, deberá eliminarla manualmente.

También tenga en cuenta que cada sesión de bash cargará el archivo de historial completo en la memoria, pero incluso si su archivo de historial aumenta a 10 MB (lo que llevará un largo largo tiempo) no notará mucho efecto en su tiempo de inicio de bash.


4
El archivo histórico se trunca al establecer HISTFILESIZEEsta es la razón por la que debe eliminar cualquier evento que ocurra, excepto el que desee. También se truncará en la salida de shell (pero eso es lo que se espera). Y no deberías necesitar export.
vaab

3
@vaab Si no exportas, haciendo algo como bash --norc Truncará la historia de nuevo.
Yongwei Wu

1
yo suelo export HISTFILE="/home/$USER/hist/`uname -n``tty | tr '/' '-'`" para mantener el historial de shell separado por sesión (según el nombre de host y el nombre de tty). Por supuesto que tengo que crear el directorio ~ / hist primero.
Jeff Learman

2
Tenga en cuenta que es posible que desee verificar el valor de PROMPT_COMMAND y no adjuntarlo a ciegas repetidamente, ya que hará que su sistema se vuelva loco. Una comprobación nula o mejor aún una búsqueda de expansión de variable de shell es probablemente más segura.
dragon788

3
Uso esto para evitar el problema al que se refiere @ dragon788: PROMPT_COMMAND="${PROMPT_COMMAND:+${PROMPT_COMMAND} ;}history -a";
Brian Vandenberg

8

Incluido en ~ / .bashrc :

# append a session's history on shell exit
shopt -s histappend
export HISTFILESIZE=
export HISTSIZE=

Esta respuesta satisface los siguientes criterios:

  1. un historial maestro separado (ninguna sesión puede interrumpir tu historial)

  2. Escritura automática de historial (sin teclas de acceso rápido)

  3. Escrituras poco frecuentes (sin añadir después de cada comando)

fondo

En arranque interactivo, si $HISTFILESIZE se establece en un número, bash trunca $HISTFILE a ese numero En cierre interactivo, si la opción de shell histappend se establece, bash anexa $HISTSIZE líneas a $HISTFILE, de lo contrario se sobrescribe $HISTFILE.

consejos para OSX (Terminal)

Cada vez que se crea una pestaña en la Terminal, ~/.bash_profile es leído, lo que significa que bash no va a leer tu ~/.bashrc. Agregue la siguiente línea a su ~/etc/bash_profile:

# if bashrc has content, source it
[[ -s ~/.bashrc ]] && . ~/.bashrc

consejos para la pantalla

Si usa la pantalla, su archivo de configuración es ~ / .screenrc. Si desea que la pantalla registre el historial, solo debe configurarlo para que use un shell de inicio de sesión que generará sus archivos de inicio de bash (y registrará su historial).

# use bash, make it a login shell
defshell -bash

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.