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 .

Sandoz
quelle
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".

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

Poplitea
quelle
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
29

Wenn Sie die Option HIST_IGNORE_SPACE in zsh verwenden, können Sie Befehlen ein Leerzeichen "" voranstellen, das in der Verlaufsdatei nicht gespeichert wird. Wenn Sie geheime Befehle haben, die Sie häufig verwenden, können Sie Folgendes tun: alias hiddencommand = 'hiddencommand' .

Michael Barton
quelle
5
setzen setopt histignorespacein Ihrem~/.zshrc
Tim Abell
Danke für histignorespace. Sehr hilfreich !
Matteo Gaggiano
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

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

KhogaEslam
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