So entfernen Sie einen Eintrag aus dem Verlauf in ZSH


79

Angenommen, ich habe einen Befehl mit einem zsh ausgeführt

echo "mysecret" > file

Ich kann den Verlauf einschließlich der Eintragsnummern einfach mit dem folgenden Befehl drucken fc -l:

1  echo "mysecret" >| file

Aber wie kann ich einen Eintrag einfach aus dem Verlauf löschen?

Ich kann keinen entsprechenden Absatz in man zshbuiltins finden .


2
Was macht das bei StackOverflow im Gegensatz zu SuperUser?
Charles Duffy

Antworten:


97

* BSD / Darwin (macOS):

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

Linux (GNU sed):

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

Dadurch werden alle Zeilen, die mit "porn" übereinstimmen, aus Ihrer $ HISTFILE entfernt.

Mit setopt HIST_IGNORE_SPACEkönnen Sie dem obigen Befehl ein Leerzeichen voranstellen, um zu verhindern, dass er in $ HISTFILE geschrieben wird.

Wie Tim in seinem Kommentar unten hervorhob, verhindert das Präfix LC_ALL = C einen Fehler der "illegalen Byte-Sequenz".


1
NB unter osx / BSD müssen Sie nach -i leere Anführungszeichen setzen, um explizit keine Sicherungsdatei anzugeben sed -i '' '/S3_SECRET/d' $HISTFILE. Dies funktioniert nicht unter Linux. stackoverflow.com/questions/5694228/…
Tim Diggins

3
Und wenn Sie 'illegale Byte-Sequenz' erhalten, setzen Sie LC_ALL = C, also: LC_ALL=C sed -i '' '/S3_SECRET/d' $HISTFILE stackoverflow.com/questions/11287564/…
Tim Diggins

55

Ich weiß nicht, ob es dafür eine elegante Methode gibt, aber in ähnlichen Situationen habe ich mich abgemeldet (damit zsh seinen Puffer leeren und meinen Verlauf in eine Datei schreiben kann), mich angemeldet und schließlich manuell bearbeitet ~/.zsh_history und das " gefährliche "Linie.


Hat für mich gearbeitet. Ich musste mein Terminal neu starten, damit die Änderungen übernommen wurden.
Weltschmerz

Vermeiden Sie für Bonuspunkte das Laden der Verlaufsdatei, indem Sie die Umgebungsvariable festlegen HISTFILE=/dev/null, oder verwenden Sie einfach eine andere Shell. Wenn zshes sich um die Login-Shell handelt, melden Sie sich an und exec shbearbeiten Sie sie ~/.zhistory.
Gnucchi

Es funktioniert! Befehl entfernen von ~/.zsh_history, dann zsh neu starten.
Ferris


1

Diese Funktion entfernt jede gewünschte Zeile aus Ihrem Zsh-Verlauf, ohne dass Fragen gestellt werden:

# 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."
}

Wenn Sie zusätzlich verhindern möchten, dass alle dcBefehle in den Verlauf geschrieben werden, fügen Sie Folgendes in Ihre ~/.zshrcDatei ein:

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

Aktualisieren

Ich habe jetzt eine umfassendere Lösung als Plugin veröffentlicht: https://github.com/marlonrichert/zsh-hist


-2

In Bash :

1- in Bash-Terminal-Typ

hsitory # Dadurch werden alle Befehle in der Verlaufsdatei .bash_history mit Zeilennummern aufgelistet

Ex:

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

2- Wählen Sie die CMD-Zeilennummer aus, die Sie löschen möchten

history -d 988

Hinweis: Wenn Sie beispielsweise die letzten 3 CMDs löschen möchten, wählen Sie einfach die dritte Zeilennummer von unten aus, z. B. 988, und wiederholen Sie die CMD history -d 988dreimal hintereinander.

Quelle


3
history -dfunktioniert nicht in ZSH, da es nur ein Alias ​​für ist fc -l 1und mit einem fc: event not found: -dFehler endet .
Wirone

Ja, und ich schrieb in Bash! Nur für den Fall, dass
jemand
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.