Cómo evitar entradas duplicadas en .bash_history


109

El mismo comando aparece en mi historial una y otra vez. ¿Cómo puedo evitar esto? Sé que es posible a través de, HISTCONTROLpero no he encontrado el camino correcto.


Creé una pregunta relacionada: askubuntu.com/questions/205520/… . Dups en el historial es útil para ver el contexto de un comando. Lo que desea omitir dups a veces cuando imprime el historial.
justingordon

Respuestas:


123

Desde la bashpágina del manual:

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 no se guardan en la lista del historial. Un valor de ignoredupshace que las líneas que coinciden con la entrada del historial anterior no se guarden. Un valor de ignorebothes taquigrafía para ignorespace y ignoredups. Un valor deerasedupshace 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. Cualquier valor que no esté en la lista anterior se ignora. Si HISTCONTROL no está configurado o no incluye un valor válido, todas las líneas leídas por el analizador de shell se guardan en la lista del historial, sujetas al valor de HISTIGNORE. 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.

Así que ponga la siguiente línea en su ~/.bashrc:

export HISTCONTROL=ignoreboth:erasedups


¿Desea que agregue HISTCONTROL = ignoreboth en la parte inferior de ~ / .bashrc?
karthick87

1
@karthick No importa dónde lo coloques, la parte inferior está bien.
Isaías

En mi instalación de Ubuntu 12.04 tuve que hacer esta modificación en la ~/.bash_loginmayoría de las veces funcionaría si se modifica .bashrc, pero ese no es el caso todo el tiempo.
ck-

3
No olvide ejecutar estos después de actualizar sus archivos bash profile / rc -source ~/.bashrc && source ~/.bash_profile
Eric Kigathi

23

Pegue esto en su ~/.bashrc:

export HISTCONTROL=ignoredups

En su lugar, podría usar ignoreboth. Esto es una abreviatura para ambos ignorespaces(comandos que comienzan con espacios) y ignoredups(duplicados).

Prefiero ignoredupspor sí solo, ya que encuentro el comportamiento predeterminado de ignorar comandos con espacios en el frente bastante molesto cuando copio un comando de un sitio web y no se guarda porque accidentalmente copié en un espacio también ... Pero para cada uno lo suyo


3
Todavía existen duplicados ... ¿Cuál puede ser el problema? imgur.com/fXeLQ.png
karthick87

55
@ karthick87 citado de otra respuesta: Un valor de ignoredupscausa que las líneas que coinciden con la entrada del historial anterior no se guarden . Solo elimina líneas consecutivas idénticas.
AL

10

Al poner esto, ~/.bashrcse aplicará la solución de @ alvin en diferentes sesiones como wlell

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

Fuente: Linux: Historial de Bash: "ignorar errores" y "borrados" que crean conflictos con el historial común en las sesiones


¿Por qué su uso export HISTCONTROLy el tuyo no? ¿Cual es la diferencia? Está funcionando para mí sin exportación, solo tengo curiosidad
felwithe

1
¡Buena pregunta! También me gustaría saber la respuesta. En general, exportla variable está disponible para subprocesos. stackoverflow.com/q/1158091/552621 En el caso de HISTCONTROL, PROMPT_COMMANDetc., estas variables son utilizadas por el propio shell, por lo que tal vez no sea necesario exportarlas (a procesos secundarios).
Nour Wolf


3

Agregue lo siguiente a su ~/.bashrc:

export HISTCONTROL=ignoredups

Para hacer esto, puede usar este comando:

nano ~/.bashrc

0

Grabar unívocamente cada nuevo comando es complicado. Primero necesita agregar ~/.profileo similar:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

Entonces necesitas agregar a ~/.bash_logout:

history -a
history -w
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.