Mientras tanto, logré mantener mi historial mucho más limpio gracias a los excelentes consejos de ustedes sobre HISTIGNORE
opción en .bashrc
, omitiendo todos esos ll
sin sentido o df -k
líneas.
Sin embargo, también he aprendido que HISTIGNORE
la opción es muy restrictiva , también.
Por ejemplo, si tiene una línea como esta (simplificada)
HISTIGNORE='ll*:la*:cd*'
no solo conseguirás que estos queden fuera de la lista , sino también de su "historial en vivo" como me gustaría doblar el historial volátil, puede acceder a través de Cursor hacia arriba /Cursor abajo . Pruébelo:se omitirán por completo ahora, sin importar cuánto tiempo recorra su historial de comandos con dichas teclas de cursor.
Sin embargo, a veces hago necesito estas líneas, especialmente con rutas muy largas y complicadas que no quiero volver a escribir. Por otro lado, me gustaría tener estas líneas exclusivas a mi historial en vivo y no tenerlos almacenados en la lista de historial ya que cambiarán con frecuencia.
¿Hay alguna manera de lograr esto?
Como otra nota al margen, descubrí que, por alguna razón, el historial "en vivo" y la lista de historial a veces diferirían mucho (cf. ¿Por qué obtengo resultados diferentes con el mismo usuario y el comando de historial).
Respuesta aceptada:
Puedes usar HISTIGNORE
variable de entorno.
Una lista de patrones separados por dos puntos que se utiliza para decidir qué líneas de comando deben guardarse en la lista de historial. Por ejemplo:
export HISTIGNORE="cd*:ls*"
esto ignorará todos los comandos cd y ls del historial.
EDITAR:
lo siento, en mi primera lectura no le di suficiente atención a tu pregunta. Por cierto, tienes razón:HISTIGNORE
es una configuración muy difícil, y bash_history simplemente ignorará cada comando que se enumera en esta variable (lo ignorará en el momento en que lo ejecute, si ya hay entradas con estos comandos en su HISTFILE
se encontrarán mediante la búsqueda inversa del historial.
Para responder primero a su última pregunta, el historial en vivo y escrito puede variar mucho si usa diferentes terminales simultáneamente. Puede probar una solución como se describe aquí:
Conservar el historial de bash en múltiples ventanas de terminal
Lo que podría imaginar es una solución en la que usa una función en su ~/.bash_logout
archivo, que borrará las entradas del historial que no desee.
algo como esto debería hacer lo que quieras:
function clear_history(){
# hist_ignore regex, this may be done in a more fancy way,
# such as using an env variable, but anyway
MYHISTIGNORE='^cd:^view:^cat'
# write down history to file
history -w
# create a new tmp file for history
tmpFile=$(mktemp)
cp ${HISTFILE} ${tmpFile}
# use it to filter history
for myRegex in $(echo $MYHISTIGNORE | awk 'BEGIN{FS=":"}{for (i=1;i<=NF;i++){print $i}}'); do
sed -i "/${myRegex}/d" ${tmpFile}
done
# and copy it back to history file
mv ${tmpFile} ${HISTFILE}
}