Warum wird der Befehlsverlauf nur beim Beenden gespeichert?

Warum wird der Befehlsverlauf nur beim Beenden gespeichert?

Ich versuche, pro Tab/Terminal eine andere Verlaufsdatei zu speichern, schaffe es aber nicht, sie unmittelbar nach der Ausführung eines Befehls zu speichern. Der Verlauf wird erst gespeichert, wenn ich „exit“ ausführe.

Dies ist ein Problem, da ich für den Fall, dass das Terminal oder der Computer abstürzt, eine Kopie des Verlaufs haben möchte.

Nachdem ich im Internet gesucht habe, ist dies in meiner .bashrc-Datei:

export HISTFILE="$HOME/HISTORIES/bash_history_$(basename $(tty))_$(date '+%Y-%m-%d_%H-%M-%S_%Z')"
export HISTCONTROL=ignoreboth
export HISTFILESIZE=10000
export HISTSIZE=10000
shopt -s histappend
PROMPT_COMMAND=$(history -a; $PROMPT_COMMAND)

Irgendeine Idee, was ich falsch mache?

Danke.

Antwort1

Sie weisen PROMPT_COMMAND falsch zu. Wenn Sie schreiben

PROMPT_COMMAND=$(history -a; $PROMPT_COMMAND)

Sie führen „history -a“ aus (was keine Ausgabe erzeugt) und führen dann $PROMPT_COMMAND aus (das während Ihrer Startskripte leer sein kann) und weisen die Ausgabe dieser beiden Befehle (die leere Zeichenfolge) PROMPT_COMMAND zu. Was Sie wollen, ist lediglich:

PROMPT_COMMAND='history -a'

Wenn Sie es an einen bereits bestehenden Befehl anhängen möchten, tun Sie dies

PROMPT_COMMAND+="history -a${PROMPT_COMMAND+=; }$PROMPT_COMMAND"

Antwort2

Aus einem für mich unverständlichen Grund funktioniert Folgendes:

export HISTFILE_NEW="$HOME/HISTORIES/bash_history_$(basename $(tty))_$(date '+%Y-%m-%d_%H-%M-%S_%Z')"
export HISTCONTROL=ignoreboth
export HISTFILESIZE=10000
export HISTSIZE=10000
shopt -s histappend
PROMPT_COMMAND="history -w $HISTFILE_NEW; $PROMPT_COMMAND"

Dies bedeutet zwar nicht,

export HISTFILE="$HOME/HISTORIES/bash_history_$(basename $(tty))_$(date '+%Y-%m-%d_%H-%M-%S_%Z')"
export HISTCONTROL=ignoreboth
export HISTFILESIZE=10000
export HISTSIZE=10000
shopt -s histappend
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"

Natürlich ist die erste Lösung langsamer als die theoretisch gute (die zweite), da der gesamte Verlauf jedes Mal gespeichert wird, wenn ein neuer Befehl geschrieben wird.

Wenn also jemand weiß, WARUM das so ist und wie das Problem gelöst werden könnte, wäre ich sehr dankbar.

Antwort3

Beantwortung der Absicht, nicht der wörtlichen Frage:

Sehen Sie sich die Verwendung von Skripten an. Dadurch erhalten Sie Befehle und deren Ausgabe. Beachten Sie, dass dies kein Allheilmittel ist, da Befehle, die die Cursorpositionierung verwenden, später schwer zu entziffern sind.

Skript benennen - Typescript der Terminalsitzung erstellen

Zusammenfassung Skript [-a] [-c BEFEHL] [-f] [-q] [-t] [Datei]

Beschreibung Script erstellt ein Typoskript von allem, was auf Ihrem Terminal ausgedruckt wird. Es ist nützlich für Studenten, die eine gedruckte Aufzeichnung einer interaktiven Sitzung als Nachweis für eine Aufgabe benötigen, da die Typoskriptdatei später mit lpr(1) ausgedruckt werden kann.

Wenn das Argument file angegeben ist, speichert das Skript alle Dialoge in einer Datei. Wenn kein Dateiname angegeben ist, wird das Typescript in der Datei typescript gespeichert.

Optionen:

  -a'        Append the output to file or typescript, retaining the priorcontents.

-c BEFEHL Führt den BEFEHL anstelle einer interaktiven Shell aus. Dies erleichtert es einem Skript, die Ausgabe eines Programms zu erfassen, das sich anders verhält, wenn seine Standardausgabe kein TTY ist. -f' Leert die Ausgabe nach jedem Schreiben. Dies ist gut für die Telekooperation: Eine Person führt „mkfifo foo; script -f foo“ aus und eine andere kann in Echtzeit überwachen, was mit „cat foo“ getan wird.

-q' Sei ruhig.

-t' Zeitdaten in Standardfehler ausgeben. Diese Daten enthalten zwei durch ein Leerzeichen getrennte Felder. Das erste Feld gibt an, wie viel Zeit seit der letzten Ausgabe vergangen ist. Das zweite Feld gibt an, wie viele Zeichen dieses Mal ausgegeben wurden. Diese Informationen können verwendet werden, um Typoskripte mit realistischen Eingabe- und Ausgabeverzögerungen wiederzugeben.

Das Skript wird beendet, wenn die gegabelte Shell beendet wird (Strg-D zum Beenden der Bourne-Shell (sh(1)) bzw. exit, logout oder Strg-D (wenn ignoreeof nicht gesetzt ist) für die C-Shell csh(1)).

Bestimmte interaktive Befehle wie vi(1) erzeugen Müll in der Typescript-Datei. Script funktioniert am besten mit Befehlen, die den Bildschirm nicht manipulieren. Die Ergebnisse sollen ein Hardcopy-Terminal emulieren. ...

Suchen Sie bei Google nach „Man-Skript“. Wenn Sie ein bestimmtes Betriebssystem haben, geben Sie dieses an. Dies ist die Linux-Version, aber es gibt nahezu identische Versionen für *BSD und Mac. Wahrscheinlich gibt es auch Windows-Ports.

verwandte Informationen