it-swarm.com.de

Wo ist die Bash-Geschichte gespeichert?

Wenn ich history ausführe, kann ich meine zuletzt ausgeführten Befehle sehen.

Aber wenn ich es mache tail -f $HISTFILE oder tail -f ~/.bash_history, sie werden nicht aufgelistet.

Wird die Datei gesperrt, gibt es einen temporären Speicherort oder ähnliches?

106
Adionditsak

Bash verwaltet die Liste der Befehle intern im Speicher, während sie ausgeführt werden. Sie sind geschrieben in .bash_history beim Beenden :

Wenn eine interaktive Shell beendet wird, werden die letzten $ HISTSIZE-Zeilen aus der Verlaufsliste in die von $ HISTFILE benannte Datei kopiert

Wenn Sie das Ausschreiben des Befehlsverlaufs erzwingen möchten, können Sie history -a Befehl, der:

Hängen Sie die neuen Verlaufszeilen (seit Beginn der aktuellen Bash-Sitzung eingegebene Verlaufszeilen) an die Verlaufsdatei an.

Da ist auch ein -w Möglichkeit:

Schreiben Sie den aktuellen Verlauf in die Verlaufsdatei.

das passt vielleicht besser zu Ihnen, je nachdem, wie Sie Ihre Historie verwenden.

Wenn Sie sicherstellen möchten, dass sie immer sofort geschrieben werden, können Sie diesen Befehl in Ihr Prompt_COMMAND Variable:

export Prompt_COMMAND='history -a'
132
Michael Homer

(Keine Antwort, aber ich kann keine Kommentare hinzufügen)

Wenn Sie .bash_history Da Sie nur einen bestimmten Befehl löschen möchten (z. B. ein Kennwort in clear enthalten), können Sie den Eintrag im Speicher direkt über history -d <entry_id>.

Angenommen, eine Ausgabe wie folgt:

$ history
926  ll
927  cd ..
928  export --password=super_secret
929  ll

und wenn Sie die Zeile export löschen möchten, können Sie dies einfach erreichen, indem Sie:

history -d 928
14
Eddie C.

bash speichert es im Arbeitsspeicher. bash kann so konfiguriert werden, dass es beim Schließen von bash oder nach jedem Befehl gespeichert und beim Start von bash oder auf Anfrage geladen wird.

Wenn Sie konfigurieren, dass nach jedem Befehl gespeichert wird, berücksichtigen Sie die Auswirkungen der gleichzeitigen Ausführung mehrerer Bashs. (Befehlszeilen werden verschachtelt)

11
ctrl-alt-delor

Befehle werden im Speicher (RAM) gespeichert, während Ihre Sitzung aktiv ist. Sobald Sie die Shell schließen, wird die Befehlsliste vor dem Herunterfahren in .bash_history Geschrieben.

Daher wird der Verlauf der aktuellen Sitzung in .bash_history Nicht angezeigt.

5
JaySo

Während der Ausführung wird der Verlauf nur (standardmäßig) gespeichert, wenn:

  • setze -o Verlauf (ein H in echo "$-") ist gesetzt.
  • HISTSIZE ist nicht 0nd
  • HISTIGNORE ist nicht * (oder ein anderes sehr restriktives Muster).

Wenn einer der oben genannten Fehler auftritt, wird kein Verlauf im Speicher gespeichert, und folglich kann oder wird kein Verlauf auf die Festplatte geschrieben.

Der Verlauf im Speicher wird auf die Festplatte geschrieben, wenn:

  • HISTFILESIZE ist nicht 0 nd
  • HISTFILE ist nicht deaktiviert.

Aber nur wenn die Shell beendet wird oder wenn die Befehle history -a (anhängen) oder history -w (Schreiben) werden ausgeführt.

Um ein sofortiges Schreiben auf die Festplatte auszulösen, können Sie die Variable verwenden:

 Prompt_COMMAND='history -a'

dadurch werden append die new Verlaufszeilen zur Verlaufsdatei. Hierbei handelt es sich um Verlaufszeilen, die seit Beginn der aktuellen Bash-Sitzung eingegeben, aber noch nicht an die Verlaufsdatei angehängt wurden.

Oder:

 Prompt_COMMAND='history -w'

To überschreiben den Verlauf in der HISTFILE mit der Liste aus dem Speicher.

Sie können also einen Befehl aus dem Verlauf im Speicher entfernen:

 $ history 5
  6359  ls
  6360  cd ..
  6361  comand --private-password='^%^&[email protected]#)[email protected]*'
  6362  top
  6363  set +o | less
 $ history -d 6361
 $ history 5
  6359  ls
  6360  cd ..
  6361  top
  6362  set +o | less
 $ history -w

Und schreiben Sie es mit dem letzten Befehl auf die Festplatte:

 history -w    # with `shopt -u histappend` unset
5
Isaac