Por lo que yo sé, no es posible hacer lo que quiera. Veo esto como un error en el procesamiento de historial de bash que podría mejorarse.
export HISTCONTROL=ignoreboth:erasedups # no duplicate entries
shopt -s histappend # append history file
export PROMPT_COMMAND="history -a" # update histfile after every command
Esto evitará que la memoria de la historia única, pero mientras lo hace guarda la historia de varias sesiones en el mismo archivo, no se mantiene la historia en el propio archivo único. history -a
escribirá el nuevo comando en el archivo a menos que sea el mismo que el inmediatamente anterior. No hará una desduplicación completa como la configuración erasedups
en la memoria.
Para ver estas tonterías en acción, inicie una nueva sesión de terminal, examine el historial y verá entradas repetidas, digamos ls
. Ahora ejecute el comando ls
, y todos los ls
duplicados se eliminarán del historial en la memoria, dejando solo el último. El historial de memoria se hace más corto a medida que ejecuta comandos que están duplicados en el archivo de historial, pero el archivo de historial en sí continúa creciendo.
Utilizo mi propia secuencia de comandos para limpiar el archivo de historial bajo demanda.
# remove duplicates while preserving input order
function dedup {
awk '! x[$0]++' [email protected]
}
# removes $HISTIGNORE commands from input
function remove_histignore {
if [ -n "$HISTIGNORE" ]; then
# replace : with |, then * with .*
local IGNORE_PAT=`echo "$HISTIGNORE" | sed s/\:/\|/g | sed s/\*/\.\*/g`
# negated grep removes matches
grep -vx "$IGNORE_PAT" [email protected]
else
cat [email protected]
fi
}
# clean up the history file by remove duplicates and commands matching
# $HISTIGNORE entries
function history_cleanup {
local HISTFILE_SRC=~/.bash_history
local HISTFILE_DST=/tmp/.$USER.bash_history.clean
if [ -f $HISTFILE_SRC ]; then
\cp $HISTFILE_SRC $HISTFILE_SRC.backup
dedup $HISTFILE_SRC | remove_histignore >| $HISTFILE_DST
\mv $HISTFILE_DST $HISTFILE_SRC
chmod go-r $HISTFILE_SRC
history -c
history -r
fi
}
Me encantaría escuchar formas más elegantes de hacer esto.
Nota: la secuencia de comandos no funcionará si habilita la marca de tiempo en el historial a través de HISTTIMEFORMAT.
Bash puede mejorar la situación
- solución
history -a
sólo a escribir nuevos datos si no coincide con ninguna historia en la memoria, no sólo el último.
- deduplicar el historial cuando se leen los archivos si se establece la configuración
erasedups
. Un simple history -w
en una nueva terminal limpiaría el archivo de historial en lugar de la escritura tonta anterior.
¿Alguna vez resolvió esto? Mi/etc/profile se ve así (en un mac) y tengo el mismo problema: # http://blog.macromates.com/2008/working-with-history-in-bash/ # http: //www.ducea.com/2006/05/15/linux-tips-take-control-of-your-bash_history/ HISTCONTROL exportación = erasedups exportación HISTTIMEFORMAT HISTSIZE = 10000 exportación = "% F-% T% t" shopt -s histappend (Tratando de dar formato a este medio decente, no es fácil) – joedevon
Ver esta pregunta http://unix.stackexchange.com/questions/48713/how-can-i-remove-duplicates -in-my-bash-history-preservar-orden – Nathan
Este es un problema inherente a la programación y está relacionado con herramientas específicas que los programadores utilizan. Estoy desconcertado de que esta pregunta sea considerada "fuera de tema" (mucho más por al menos 5 personas). Un .bash_history redundante es una molestia de larga data para mí ahora resuelto. Sin embargo, esta pregunta podría moverse al sitio stackexchange de Unix. –