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.

karthick87
fuente
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

Isaias
fuente
¿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

Oli
fuente
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

Nour Wolf
fuente
¿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
4
export HISTCONTROL=erasedups
sin sonido
fuente
3

Agregue lo siguiente a su ~/.bashrc:

export HISTCONTROL=ignoredups

Para hacer esto, puede usar este comando:

nano ~/.bashrc
jrg
fuente
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
Steven Penny
fuente