Cómo eliminar una entrada del historial en ZSH


79

Digamos que ejecuté un comando usando un zsh

echo "mysecret" > file

Puedo imprimir fácilmente el historial, incluidos los números de entrada, usando el comando fc -l:

1  echo "mysecret" >| file

Pero, ¿cómo puedo eliminar fácilmente una entrada del historial?

No puedo encontrar un párrafo correspondiente en man zshbuiltins .


2
¿Qué hace esto en StackOverflow en lugar de SuperUser?
— Charles Duffy

Respuestas:


96

* BSD / Darwin (macOS):

LC_ALL=C sed -i '' '/porn/d' $HISTFILE

Linux (GNU sed):

LC_ALL=C sed -i '/porn/d' $HISTFILE

Esto eliminará todas las líneas que coincidan con "pornografía" de su $ HISTFILE.

Con setopt HIST_IGNORE_SPACE, puede anteponer el comando anterior con un carácter de espacio para evitar que se escriba en $ HISTFILE.

Como Tim señaló en su comentario a continuación , el prefijo LC_ALL = C evita la falla de la 'secuencia de bytes ilegal'.


1
NB en OSX / BSD es necesario poner comillas vacías después de la -i para especificar explícitamente ningún archivo de copia de seguridad, por lo tanto: sed -i '' '/S3_SECRET/d' $HISTFILE. Esto no funcionará en Linux. stackoverflow.com/questions/5694228/…
— Tim Diggins

3
Y si obtiene 'secuencia de bytes ilegal', establezca LC_ALL = C, así: LC_ALL=C sed -i '' '/S3_SECRET/d' $HISTFILE stackoverflow.com/questions/11287564/…
— Tim Diggins

54

No sé si hay algún método elegante para hacer esto, pero en situaciones similares me desconecté (permitiendo que zsh vacíe su búfer y escriba mi historial en el archivo), luego inicié sesión y finalmente edité manualmente ~/.zsh_history , eliminando el " peligrosa "línea.


Trabajó para mi. Tuve que reiniciar mi terminal para que detectara los cambios.
— weltschmerz

Para obtener puntos de bonificación, evite cargar el archivo de historial configurando la variable de entorno HISTFILE=/dev/null, o simplemente use otro shell. Si zshes el shell de inicio de sesión, inicie sesión y exec sh, luego, edite ~/.zhistory.
— gnucchi

¡Funciona! eliminar comando de ~/.zsh_history, luego reiniciar zsh.
— Ferris


1

Esta función eliminará cualquier línea que desee de su historial de Zsh, sin hacer preguntas:

# Accepts one history line number as argument.
# Alternatively, you can do `dc -1` to remove the last line.
dc () {
  # Prevent the specified history line from being saved.
  local HISTORY_IGNORE="${(b)$(fc -ln $1 $1)}"

  # Write out the history to file, excluding lines that match `$HISTORY_IGNORE`.
  fc -W

  # Dispose of the current history and read the new history from file.
  fc -p $HISTFILE $HISTSIZE $SAVEHIST

  # TA-DA!
  print "Deleted '$HISTORY_IGNORE' from history."
}

Si desea evitar además que todos los dccomandos se escriban en el historial, agregue lo siguiente en su ~/.zshrcarchivo:

zshaddhistory() {
 [[ $1 != 'dc '* ]]
}

Actualizar

Ahora he publicado una solución más completa como complemento: https://github.com/marlonrichert/zsh-hist


-2

En bash :

1- en tipo de terminal bash

hsitory # Esto enumerará todos los comandos en el archivo histórico .bash_history con números de línea

ex:

  ...
  987  cd
  988  ssh x@127.0.0.1
  990  exit
  991  cd

2- elige el número de línea de CMD que deseas eliminar

history -d 988

Nota: si desea eliminar, por ejemplo, los últimos 3 CMD, simplemente elija el número de la tercera línea de la parte inferior, por ejemplo: 988 y repita el CMD history -d 9883 veces en secuencia.

Fuente


3
history -dno funciona en ZSH porque es solo un alias fc -l 1y termina con un fc: event not found: -derror.
— Wirone

sí, y escribí en bash! En caso de que alguien lo necesitara para bash no zsh
— KhogaEslam
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.