GNU/Linux >> Tutoriales Linux >  >> Linux

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

En primer lugar, esto no es un duplicado de ningún hilo existente en SE. He leído estos dos subprocesos (primero, segundo) en un mejor historial de bash, pero ninguna de las respuestas funciona. Por cierto, estoy en Fedora 15.

Agregué lo siguiente a .bashrc archivo en el directorio del usuario (/home/aahan/), y no funciona. ¿Alguien tiene una pista?

HISTCONTROL=ignoredups:erasedups  # no duplicate entries
HISTSIZE=1000                     # custom history size
HISTFILESIZE=100000                 # custom history file size
shopt -s histappend                      # append to history, don't overwrite it
PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"  # Save and reload the history after each command finishes

De acuerdo, esto es lo que quiero con el historial de bash (prioridad):

  • no almacene duplicados, borre los existentes
  • compartir inmediatamente el historial con todos los terminales abiertos
  • añadir siempre el historial, no sobrescribirlo
  • almacenar comandos de varias líneas como un solo comando (que está desactivado de forma predeterminada)
  • ¿Cuál es el tamaño predeterminado del historial y el tamaño del archivo del historial?

Respuesta aceptada:

Este es realmente un comportamiento realmente interesante y confieso que he subestimado mucho la pregunta al principio. Pero primero los hechos:

1. Qué funciona

La funcionalidad se puede lograr de varias maneras, aunque cada una funciona de manera un poco diferente. Tenga en cuenta que, en cada caso, para que el historial se “transfiera” a otro terminal (actualizado), se debe presionar Enter en la terminal, donde quiere recuperar el historial.

  • opción 1:

     shopt -s histappend
     HISTCONTROL=ignoredups
     PROMPT_COMMAND="history -a; history -n; $PROMPT_COMMAND"
    

Esto tiene dos inconvenientes:

  1. Al iniciar sesión (abrir una terminal), el último comando del archivo de historial se lee dos veces en el búfer de historial de la terminal actual;
  2. Los búferes de diferentes terminales no permanecen sincronizados con el archivo de historial.
  • opción 2:

     HISTCONTROL=ignoredups
     PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
    

(Sí, no es necesario shopt -s histappend y sí, tiene que ser history -c en medio de PROMPT_COMMAND )
Esta versión también tiene dos inconvenientes importantes:

  1. El archivo de historial debe inicializarse. Tiene que contener al menos una línea no vacía (puede ser cualquier cosa).
  2. La history El comando puede dar una salida falsa; consulte a continuación.

[Editar] “Y el ganador es…”

  • opción 3:

     HISTCONTROL=ignoredups:erasedups
     shopt -s histappend
     PROMPT_COMMAND="history -n; history -w; history -c; history -r; $PROMPT_COMMAND"
    

Esto es hasta donde llega. Es el único opción para tener ambos erasedups e historia común trabajando simultáneamente. Esto es probablemente la solución final a todos tus problemas, Aahan.

2. ¿Por qué la opción 2 no parece funcionar (o:lo que realmente no funciona como se esperaba)?

Como mencioné, cada una de las soluciones anteriores funciona de manera diferente. Pero la interpretación más engañosa de cómo funciona la configuración proviene del análisis de la salida del history comando . En muchos casos, el comando puede dar falso producción. ¿Por qué? Porque se ejecuta antes la secuencia de otra history comandos contenidos en el PROMPT_COMMAND ! Sin embargo, al usar la segunda o tercera opción, uno puede monitorear los cambios de .bash_history contenidos (usando watch -n1 "tail -n20 .bash_history" por ejemplo) y ver cuál es la historia real.

Relacionado:¿Por qué la salida de voltaje de un generador de señales cambia con su configuración de frecuencia?

3. Por qué opción 3 es tan complicado?

Todo radica en la forma en que erasedups obras. Como dice el manual de bash, “(…) erasedups hace que todas las líneas anteriores que coincidan con la línea actual se eliminen de la lista del historial antes de guardar esa línea” . Entonces, esto es realmente lo que el OP quería (y no solo, como pensé anteriormente, que no aparecieran duplicados en secuencia ) . He aquí por qué cada uno de los history -. los comandos deben o no pueden estar en el PROMPT_COMMAND :

  • history -n tiene estar allí antes de history -w para leer desde .bash_history los comandos guardados desde cualquier otro terminal,

  • history -w tiene estar allí para guardar el nuevo historial en el archivo después de que bash haya verificado si el comando era un duplicado,

  • history -a no debe colocarse allí en lugar de history -w , porque agregará al archivo cualquier comando nuevo, independientemente de si se verificó como un duplicado.

  • history -c también es necesario porque evita que se destruya el búfer del historial después de cada comando,

  • y finalmente, history -r es necesario para restaurar el búfer del historial desde el archivo, y así finalmente hacer que el historial se comparta entre las sesiones de terminal.

Tenga en cuenta que esta solución estropeará el orden del historial al colocar todo el historial de otros terminales frente al comando más reciente ingresado en el terminal actual. Tampoco elimina las líneas duplicadas que ya están en el archivo de historial a menos que ingrese ese comando nuevamente.


Linux
  1. Uso de modificadores de palabras con el historial de Bash en Linux

  2. Cómo capturar sesiones de terminal y salida con el comando de script de Linux

  3. ¿Renombrar en masa el archivo Bash con el contador?

  4. Agregar marca de tiempo a un nombre de archivo con mv en BASH

  5. Usando el historial de bash para obtener un comando anterior, cópielo y luego 'ejecútelo' pero con el comando comentado

Sube de nivel tu historial de shell con Loki y fzf

Comando Linux Zip y Unzip con ejemplos

Cómo hacer una copia de seguridad y restaurar el historial de la terminal de Linux

Redirección de Bash explicada con ejemplos

Cómo borrar el historial de Bash en Linux y Mac

Eliminar una determinada línea del archivo de historial de Bash