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 .

sandoz
fuente
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'.

rxw
fuente
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.

poplitea
fuente
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
29

Si usa la opción HIST_IGNORE_SPACE en zsh, puede anteponer los comandos con un espacio "" y no se recordarán en el archivo de historial. Si tiene comandos secretos que usa comúnmente, puede hacer algo como: alias hiddencommand = 'hiddencommand' .

Michael Barton
fuente
5
poner setopt histignorespaceen su~/.zshrc
Tim Abell
Gracias por histignorespace. Muy útil !
Matteo Gaggiano
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

Marlon Richert
fuente
-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 [email protected]
  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

KhogaEslam
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