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.