Vermeiden Sie, das Kommando in der Geschichte zu behalten

33

Ich benutze Bash und möchte vermeiden, dass einige Befehle im Verlauf gespeichert werden.

  • Ist das nur für den nächsten Befehl möglich?
  • Ist es möglich, das für die gesamte Sitzung zu tun?
Luc M
quelle
Beachten Sie, dass Kennwörter, die in Befehlszeilenargumenten
ausgeblendet

Antworten:

36

und ich habe mich gerade an eine andere antwort erinnert, diese ist die eigentliche antwort auf deine frage.

Wenn Sie in HISTCONTROL "Ignoranz" haben, merkt sich Bash keine Zeile, die mit einem Leerzeichen beginnt. Es wird nicht einmal im Verlauf der aktuellen Shell angezeigt, geschweige denn in $ HISTFILE gespeichert.

Ich habe zB export HISTCONTROL = 'ignoreboth: erasedups' in meinem ~ / .bashrc

Hier sind die Details aus der Bash-Manpage:

HISTCONTROL
  Eine durch Doppelpunkte getrennte Liste von Werten, die steuern, wie Befehle sind
  in der Verlaufsliste gespeichert. Wenn die Liste der Werte enthält
  Unwissenheit, Zeilen, die mit einem Leerzeichen beginnen, nicht
  in der Verlaufsliste gespeichert. Ein Wert von ignoredups verursacht Zeilen
  Übereinstimmungen mit dem vorherigen Verlaufseintrag werden nicht gespeichert. Ein Wert von
  ignoreboth steht für ignorespace und ignoredups. Ein Wert
  Eine Anzahl gelöschter Zeilen bewirkt, dass alle vorherigen Zeilen mit der aktuellen Zeile übereinstimmen
  aus der Verlaufsliste entfernt werden, bevor diese Zeile gespeichert wird.
  Jeder Wert, der nicht in der obigen Liste enthalten ist, wird ignoriert. Wenn HISTCONTROL ist
  nicht gesetzt oder enthält keinen gültigen Wert, alle von der gelesenen Zeilen
  Shell-Parser werden abhängig vom Wert in der Verlaufsliste gespeichert
  von HISTIGNORE. Die zweite und nachfolgende Zeile einer Mehrfachzeile
  zusammengesetzte Befehle werden nicht getestet und dem Verlauf hinzugefügt
  unabhängig vom Wert von HISTCONTROL.
cas
quelle
1
+1 für den
Raumtrick
19

Hier sind ein paar Lektionen aus der Geschichte, die ich durch Googeln gelernt habe:

Sie können den Verlauf so einstellen, dass bestimmte Zeichenfolgen ignoriert werden. In diesem Beispiel habe ich die Befehle ls, passwd und alle Befehle mit dem Präfix "Leerzeichen" ignoriert.

export HISTIGNORE = "ls: passwd:"

Um den Verlauf für Ihre Sitzung zu deaktivieren, können Sie Folgendes ausführen:

export HISTSIZE = 0

Referenz

Michael Havas
quelle
7

Wenn Sie nur den letzten Befehl aus dem Verlauf entfernen möchten, können Sie drücken Up-arrow, gefolgt von Ctrl - U(Löschen zum Zeilenanfang) und dann Up-arrowerneut.

Sie können auf diese Weise jede einzelne Zeile aus dem Verlauf löschen. Verwenden Sie einfach den Aufwärtspfeil oder die Suche oder etwas anderes, um es zur aktuellen Befehlszeile zu machen, die gerade bearbeitet wird, und drücken Sie Ctrl - Udann und dann Up-arrowoder Down-arrow, um zu einer anderen Verlaufszeile zu wechseln.

Ich habe das vor einem Tag zufällig entdeckt. Ich habe keine Ahnung, ob es dokumentiert ist oder nicht.

Im Allgemeinen ist es jedoch weniger mühsam, den Verlauf der aktuellen Shell überhaupt nicht zu speichern:

HISTFILE=/dev/null
cas
quelle
3

Sie können die HISTFILEVariable deaktivieren . Von man bash:

  HISTFILE
         Der Name der Datei, in der der Befehlsverlauf gespeichert ist (siehe HIS-
         TORY unten). Der Standardwert ist ~ / .bash_history. Wenn nicht gesetzt,
         Der Befehlsverlauf wird bei einer interaktiven Shell nicht gespeichert
         Ausgänge.

Ich glaube nicht, dass dies verhindert, dass der Befehl in der lokalen Shell-Historie erscheint, bevor die Shell beendet wird.

Greg Hewgill
quelle
2

Mache ich manchmal

export HISTFILE=/dev/null
Rory
quelle
1

Ich sehe, dass niemand diese Methode geschrieben hat, also werde ich.

history -d $((HISTCMD-1)) && history -d <command or number of command>

history -d löscht den genannten Eintrag aus dem Verlauf.

HISTCMDspeichert die befehlsnummer des befehls, der als nächstes ausgeführt werden soll. (HISTCMD-1) bezieht sich also auf den zuletzt ausgeführten Befehl.

Ich habe einen kurzen Bash-Film gemacht, der zeigt, wie es funktioniert: https://asciinema.org/a/dtxpuovhty0obhln50soqypt2

Nachdem Sie den Befehl ausgeführt und auch den Befehl selbst gelöscht haben, wird der Befehl nicht angezeigt, wenn Sie ihn mit dem Pfeil nach oben bewegen. Wenn Sie ihn also öfter verwenden möchten, sollten Sie einen Alias ​​erstellen:

alias hc='history -d $((HISTCMD-1)) && history -d $1'

Dann können Sie tun:

$ hc command
Itai Ganot
quelle