GNU/Linux >> Tutoriales Linux >  >> Linux

Comportamiento extraño del historial de bash cuando se ejecutan varias sesiones

Solución 1:

Para comprender el comportamiento del historial de bash, primero debe saber lo siguiente:

  1. Está el historial en el archivo de historial.
  2. Existe la historia en la memoria de un proceso bash.
  3. El historial en la memoria de un proceso bash no está sincronizado con el historial en la memoria de ningún otro proceso bash.
  4. El historial en la memoria de un proceso bash no se sincroniza con el historial en el archivo, a menos que se solicite explícitamente o durante algún evento específico (ver más abajo).

Con la configuración predeterminada, el ciclo de vida de una sesión bash con respecto al historial es el siguiente:

  1. Durante el inicio, bash leerá el archivo de historial. El contenido del archivo histórico ahora está en la memoria del proceso bash.
  2. Durante el uso normal, solo se manipula el historial en la memoria.
  3. Durante el apagado, el historial en la memoria se escribe en el archivo de historial, sobrescribiendo cualquier contenido anterior del archivo de historial.

El comportamiento aparentemente no determinista que ha observado se debe principalmente a que el contenido del archivo de historial siempre es el historial de la última sesión de bash cerrada, y bash solo lee el archivo de historial durante el inicio.

Lea el manual de bash para obtener una explicación más detallada del proceso de inicio y apagado.

Tenga en cuenta que con la configuración predeterminada me refiero a la configuración predeterminada de bash. Su distribución podría haber proporcionado un .bashrc (o /etc/bash.bashrc ) que modifican este comportamiento.

Habilitando la opción de shell histappend puede decirle a bash que agregue en lugar de sobrescribir el archivo de historial. Puede habilitar histappend usando el comando shopt -s histappend . Para tener esta opción siempre habilitada tienes que poner el comando en tu .bashrc (u otro archivo de inicialización). Lea más sobre el shopt comando en el manual de bash

Tenga en cuenta que habilitar histappend no reducirá mucho el comportamiento aparentemente no determinista. Esto se debe a que cada sesión de bash todavía tiene su propia historia en la memoria. Es posible tener un historial de bash mayormente sincronizado. Hay una guía sobre cómo hacer que cada proceso bash tenga un historial mayormente sincronizado en un hilo en el desbordamiento de la pila.

usando el comando integrado history puede decirle explícitamente a bash que lea el historial del archivo a la memoria, o que escriba de la memoria al archivo. Por ejemplo:history -r leerá el contenido del archivo y lo agregará al historial en la memoria. history -w escribirá el historial actual de la memoria al archivo, sobrescribiendo el contenido anterior. Esto es básicamente lo que sucede durante el apagado. Más información sobre el history comando en el manual de bash

Para completar, aquí hay una lista de las variables internas que modifican el comportamiento del historial:

  • HISTFILE :el archivo para leer y escribir el historial.
  • HISTFILESIZE :el número máximo de líneas para el archivo de historial.
  • HISTSIZE :el número máximo de líneas para el historial en la memoria.
  • HISTCONTROL , HISTIGNORE , HISTTIMEFORMAT :no relevante para esta discusión. Lea el manual de bash para más detalles.

Solución 2:

http://www.gnu.org/software/bash/manual/bashref.html#Using-History-Interactively

Es posible que pueda manipular cómo se escribe el archivo de historial con uno de los terminales, es decir, ejecute "history -a" o "history -w" en el terminal en el que desea guardar el historial y luego "history -r" en los otros terminales. Depende de lo que quieras hacer.


Linux
  1. ¿Por qué se produce un error en el aviso de Bash cuando examino el historial?

  2. Historial de Bash:¿Conflicto de configuración de "ignorados" y "borrados" con el historial común en todas las sesiones?

  3. .bash_profile no se obtiene cuando se ejecuta Su?

  4. ¿Actualizar el historial de Bash en otras terminales al salir de una terminal?

  5. ¿Limpieza automática del historial de bash?

Cómo usar los comandos del historial de Bash

Comando de historial en Linux (Bash History)

Evitar que un script bash se ejecute simultáneamente

¿Conservar el historial de Bash en varias ventanas de terminal?

¿Confirmar automáticamente al ejecutar scripts de Bash?

¿Cómo mantengo mi historial de bash entre sesiones?