Historial de Bash ilimitado [cerrado]

350

Quiero que mi .bash_historyarchivo sea ilimitado. Por ejemplo, siempre puedo regresar y ver cómo construí / configuré algo, o qué fue ese ingenioso comando, o cómo algún comando rompió algo hace semanas. ¿Cómo cambio esta configuración?

Francis Haart
fuente
1
Bash es un lenguaje de programación y no se trata de programación.
NeilG

Respuestas:

307

Establezca HISTSIZEy HISTFILESIZEen .bashrc a una cadena vacía:

HISTSIZE= 
HISTFILESIZE=

En bash 4.3 y versiones posteriores también puedes usar HISTSIZE=-1 HISTFILESIZE=-1:

n.  Setting HISTSIZE to a value less than zero causes the history list to be
    unlimited (setting it 0 zero disables the history list).

o.  Setting HISTFILESIZE to a value less than zero causes the history file size
    to be unlimited (setting it to 0 causes the history file to be truncated
    to zero size).
Lri
fuente
12
(export PROMPT_COMMAND = 'history -a') puede vaciar comandos para bash history inmediatamente.
cruelcage
3
Establecer HISTSIZE= HISTFILESIZE=resultados en deshabilitar completamente el historial de bash, al menos para mí.
Philipp Ludwig
55
La configuración de @PhilippLudwig HISTSIZE=-1 HISTFILESIZE=-1deshabilitó mi historial, mientras que HISTSIZE= HISTFILESIZE=hice el truco. CentOS 7 aquí.
Seether
1
@PhilippLudwig, creo que más de lo HISTSIZE= HISTFILESIZE=que deberíasexport HISTSIZE= export HISTFILESIZE=
Matzz
3
@Seether La respuesta dice claramente "En bash 4.3 y posterior ...". CentOS 7 tiene bash 4.2.x.
villapx
426

Después de muchas iteraciones grandes y feas y casos extraños a lo largo de los años, ahora tengo una sección concisa de mi .bashrc dedicada a esto.

Primero, debe comentar o eliminar esta sección de su .bashrc (predeterminado para Ubuntu). Si no lo hace, ciertos entornos (como ejecutar screensesiones) seguirán truncando su historial:

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

En segundo lugar, agregue esto al final de su .bashrc:

# Eternal bash history.
# ---------------------
# Undocumented feature which sets the size to "unlimited".
# http://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: cada comando se escribe 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 crece a 10 MB (lo que llevará mucho, mucho tiempo) no notará mucho efecto en el tiempo de inicio de bash.

fotinakis
fuente
1
@AquariusPower: pruebe lo que está exactamente arriba, deje el HISTFILESIZE=y en HISTSIZE=blanco en lugar de -1, y asegúrese de no tener ninguna otra declaración de esos parámetros en un .bashrc o .bash_profile o .profile.
fotinakis
2
culpable .bashrc, tuve esa configuración después en otro archivo cargado por .bashrc ..., ¡ahora funciona! ¡gracias!
Acuario Power
10
Agréguelo en mi sistema de bash estándar, y agregar el historial actual también es bueno, así que después de la configuración, ejecutecat ~/.bash_history >>~/.bash_eternal_history
Jean-Christophe Meillaud
2
Para retener el historial, inicie el archivo de historial con su historial actual.
Arthur
3
Muchas gracias: el hecho de que la configuración HISTFILESIZE(y posiblemente HISTSIZE) tendrá un efecto inmediato no puede exagerarse .
Attie
37

Como Jörg Beyer mencionó anteriormente, HISTSIZE y HISTFILESIZEson clave.

Además, definitivamente debe consultar la variable ambiental HISTCONTROL, que le permite hacer cosas interesantes como no almacenar comandos de historial duplicados (HISTCONTROL=erasedups ). No tiene sentido tener un historial ilimitado si tiene que navegar a través de cientos de líneas cd ..o similares.

Enlaces: aquí , y trabajando con bash history . Las preguntas frecuentes de bash Variable también valen la pena .

simont
fuente
13
Esas líneas de cd le dan contexto para los comandos emitidos. En realidad son increíblemente útiles. No puedo entender por qué alguien querría eliminarlos, a menos que la única forma en que use el historial sea pagándolo a través de un comando a la vez.
iconoclasta
@simont También uso la opción ignorespace con HISTCONTROL y luego la uso para cualquier cosa que no quiera escribir en el historial, como las contraseñas.
bigtunacan
66
Mantener las líneas en orden es muy útil si reutiliza secuencias de comandos. Por ejemplo, algunos Ctrl-rpersonajes Ctrl-o Ctrl-o Ctrl-o Ctrl-o. Es por eso que mantengo duplicados en la historia.
Stéphane Gourichon
1
@ StéphaneGourichon ¿ Ctrl-opara qué sirve ?
Ciprian Tomoiagă
44
@ CiprianTomoiagă Ctrl-oejecuta el comando en el indicador y muestra de inmediato el comando justo después del anterior en el historial. Una ventaja es que después de usar Ctrl-rpara encontrar un comando antiguo (posiblemente usando las flechas hacia arriba y hacia abajo para moverse a los comandos vecinos en el historial), es suficiente mantener Ctrlpresionado y presionar ovarias veces para ejecutar nuevamente una serie anterior de comandos, incluso en bucle infinito si tu quieres. Ver también GNU Readline - Wikipedia
Stéphane Gourichon
22

Hay (al menos) dos entornos relevantes aquí:

  • HISTSIZE: el número de entradas en el archivo de historial
  • HISTFILESIZE: el número de líneas en el archivo de historial

Creo que podemos estar de acuerdo en que el término ilimitado es a menudo el mismo que muy grande (¿o tiene almacenamiento ilimitado de archivos?). Tan solo establezca los valores muy grandes.

Jörg Beyer
fuente
23
"Cabe señalar que 1000000000 es solo igual al infinito para valores muy pequeños de infinito. - sepp2k" jajaja. Sí, estoy contento con pequeños valores de infinito (digamos, un mes de uso frecuente de terminal).
Francis Haart
66
un mes de uso terminal frecuente es una fracción infinitamente pequeña de infinito. Yo diría que toda una vida de uso frecuente de terminales equivale a un valor infinito muy muy muy pequeño. Pero toda una vida de uso frecuente de terminales es lo suficientemente bueno para mi historial de shell. ;)
iconoclasta
2
Las versiones anteriores de zsh al menos se bloquearán si configura HISTSIZE y / o HISTFILESIZE demasiado grande porque intenta preasignar suficiente memoria. Esto se volvió relevante al ejecutar herramientas que usan zsh como su shell (dbx por ejemplo).
Brian Vandenberg