history
Befehl zeigt alle Ergebnisse an, aber wir können filtern, um einen bestimmten Befehl mit zu erhalten history | grep searchingCommand
. Es ist sehr hilfreich.
Das Problem ist jedoch, dass auch die Befehle angezeigt werden, die mit Tippfehlern eingegeben wurden oder die nicht erfolgreich waren. Dann ist es wirklich ein Schmerz, den richtigen zu finden. Ich habe diesen Link überprüft: Selektive Befehlshistorie im Terminal? aber das war nicht meine lösung.
Gibt es eine Möglichkeit, die Befehle aus dem Verlauf zu löschen, die zu dem eingegebenen Zeitpunkt oder später falsch waren?
Antworten:
Ich möchte eine weitere Methode zum Ändern (oder Löschen) von Verlaufseinträgen hinzufügen, die ich eher zufällig bei der Arbeit mit der Bash gefunden habe:
Um dies zu demonstrieren, führen Sie zunächst die folgenden drei Befehle in bash aus:
Sie können diese Befehle jetzt wieder mit den Pfeiltasten oder Ctrl+ pund Ctrl+ auswählen n.
Angenommen, Sie möchten die ersten beiden Befehle ändern. Blättern Sie durch den Verlauf, bis
echo 1
angezeigt wird, und ändern Sie ihn inecho 1 - changed
. Drücken Sie jedoch nicht die Eingabetaste. Wenn Sie sich jetzt weiter in Ihrem Verlauf bewegen, bleibt diese Zeile in ihrem geänderten Zustand und Sie können sich von ihr entfernen und zurück zu ihr bewegen. Bewegen Sie sich nun zu der Zeileecho 2
und ändern Sie sieecho 2 - changed
in. Drücken Sie erneut nicht die Eingabetaste. Um die Änderungen in diesen Zeilen zu speichern, wählen Sie einen beliebigen Befehl im Verlauf aus, mit Ausnahme dieser beiden, und drücken Sie Ctrl+ c.Anstatt den Verlaufseintrag zu ändern, können Sie ihn natürlich auch entfernen, was zu einer leeren Zeile an diesem Eintrag führt. Um die aktuell an der Eingabeaufforderung angezeigte Zeile zu löschen, drücken Sie Ctrl+ e(springt zum Zeilenende), gefolgt von Ctrl+ u(löscht den Text vom Zeilenanfang bis zum Cursor).
Siehe auch https://unix.stackexchange.com/questions/195668/what-can-cause-an-item-to-leleted-from-my-bash-history/195726#195726 für eine detailliertere Erklärung der technischer Hintergrund.
Einfachster Weg:
Hinweis :
Dies ändert nur die aktuellen Sitzungsbefehle. Wenn wir ältere Befehle ändern und die Änderungen speichern möchten, müssen wir vor dem Schließen des Terminals den folgenden Befehl ausführen:
quelle
ctrl+r
Den Befehl zu suchen, den Sie löschen / ändern möchten. 2.end
um den Befehl zu verschieben und zu löschen / ändern. 3.ctrl+n
zur nächsten Zeile und dann 4.ctrl+c
Verwenden:
um den Verlaufseintrag am Versatz zu löschen,
OFFSET
noch bevor er zu Ihrer Bash-Verlaufsdatei hinzugefügt wurde. Um das Richtige herauszufindenOFFSET
, müssen Sie nur denhistory
Befehl ausführen . Es ist die Nummer vom Anfang der Zeile, die den Verlaufseintrag enthält, den Sie löschen möchten.Und um die Änderungen an der Historie zu speichern, verwenden Sie:
Weitere Einzelheiten finden Sie in diesem Handbuch .
quelle
history -w
eingeben, um die Änderungen zu speichern. OFFSET bedeutet auch, welche Nummerhistory
angezeigt wird. Wenn die zu löschende Zeile 873 ist, verwenden Siehistory -d 873
.history -w
nachhistory -d
Änderungen zu speichern.Bearbeite die Datei
~/.bash_history
und lösche die einmal mit TippfehlernFügen Sie beispielsweise diesen Befehl ein:
Bearbeiten Sie etwas, das Ihnen gefällt, und speichern Sie anschließend die Datei und starten Sie das Terminal neu. Der root-Befehl lautet:
Wenn Sie alle löschen möchten,
history -c
sollten Sie den Trick machenQuelle :
quelle
.bash_history
?history -c
funktioniert nicht Wenn ich das Terminal schließe und wieder öffne, werden die Historien nicht gelöscht. -1 Ihre Antwort-c Clear the history list. This may be combined with the other options to replace the history list completely.
Quellehistory -w
afterhistory -c
, um die Änderungen zu schreiben.Wenn Sie es sofort aus demselben Terminal löschen möchten, müssen Sie Folgendes zu Ihrer ~ / .bashrc-Datei hinzufügen.
und starten Sie Ihr Terminal neu.
Sie können es überall in der .bashrc-Datei hinzufügen.
In der Regel werden die ausgeführten Befehle während einer Bash-Sitzung erst nach Beendigung der Sitzung in .bash_history geschrieben. Geben Sie
PROMPT_COMMAND='history -a'
den Befehl dann und dort in .bash_history ein.Wenn Sie nun in einem Befehl einen Fehler machen und ihn dann löschen möchten, führen Sie einfach Folgendes aus
und tada es würde gelöscht.
Um es einfacher zu machen, können Sie es an etwas Einfacheres aliasen und es wie verwenden
Wenn Sie also ausführen,
rh
wird der zuletzt ausgeführte Befehl aus dem Verlauf entfernt.Das obige ist ein temporäres Aliasing, das nur für eine Sitzung gilt. Damit wird es permanent oder dauerhaft hinzugefügt
zu .bashrc
HINWEIS
Auf beiden Seiten von sollte kein Platz sein
=
Wenn Sie keinen Alias erstellen möchten, können Sie auch Folgendes tun
Machen Sie einen Kommadennamen
rh
und platzieren Sie ihn im/bin
Verzeichnis:Öffne eine Datei
rh
und füge folgenden Code ein, speichere und schließe:sed -i '$d' ~/.bash_history
Machen Sie
rh
ausführbare Datei und legen Sie sie in/bin
Verzeichnis:Verwenden Sie nun den
rh
Befehl, um den letzten Befehl aus dem Verlauf zu löschen.quelle
PROMPT_COMMAND='history -a'
in -.bashrc
Datei? Und was genau wird es tun? Ich habe versucht,sed -i '$d' ~/.bash_history
es funktioniert ohne Bearbeitung.bashrc
! Aber Alias Ding funktioniert nicht .. Ich werde Ihre Antwort akzeptieren, wenn Sie nur meine Frage ausarbeiten und dafür sorgen, dass Alias funktioniert .. :).bash_history
Datei/bin
Verzeichnis. Denn aufgrund Ihres Befehls:sed -i "$d" ~/.bash_history
Es funktioniert gut. Ich akzeptiere deine Antwort .. :)um mehrere Zeilen zu entfernen (zB von 1974 bis 1990, mit
history
Befehl prüfen ):Beachten Sie, dass die zu entfernende Zeilennummer immer dieselbe ist, da Sie diese ständig entfernen und zum nächsten wechseln.
quelle
Wenn Sie in bash die Option "set -o vi" verwenden (sehr nützlich, um mit der Escape-Taste zurückzusuchen), können Sie nach der Zeile suchen und die Zeile mit "dd" löschen, genau wie in "vi".
quelle
j
oderk
danachdd
, um den Befehl tatsächlich aus der Geschichte zu löschen. Wenn ich einen anderen BefehlEnter
eingebe oder einfach drücke , geht bash davon aus, dass es sich nur um einen neuen Befehl handelt und dass der alte Befehl im Verlauf beibehalten werden soll. Es ist auch interessant zu bemerken, dass der Befehl gelöscht, aber nicht gelöscht wird, wenn er richtig ausgeführt wird. Das Ergebnis sind leere Verlaufseinträge. Aber dies ist gut genug, um Passwörter zu entfernen, die ich an der Befehlszeile eingeben musste, und viel einfacher als andere Antworten. Vielen Dank, dass Sie dies gepostet haben!Ich hatte eine Situation, in der ich überflüssige Einträge in meinem Bash-Verlauf von einem Yubikey hatte - vielleicht 50 oder so, passend zu 'ccccc .....'. Idealerweise wollte ich eine Möglichkeit zum Löschen von Einträgen, die mit einem Muster übereinstimmen, was Sie vermutlich mit sed oder etwas anderem tun könnten, vorausgesetzt, Ihr Verlauf ignoriert Leerzeichen.
Wie auch immer, ich wurde faul und benutzte schließlich vim, suchte nach "cccc" und benutzte "dd", während ich durch jedes Match fuhr. Dauerte nicht länger als eine Minute.
quelle