Under Construction

Laden und Speichern der History

Beim Starten einer interaktiven bash wird standardmäßig die History mit Einträgen aus der Datei ~/.bash_history initialisiert. Beim Beenden einer bash wird die aktuelle History in diese Datei zurückgeschrieben. Man kann aber auch jederzeit später History-Einträge aus Dateien einlesen, oder die aktuelle History in beliebigen Dateien abspeichern.

Um dies zu zeigen, haben wir uns eine kleine Aufgabe überlegt, die mit Hilfe der bash erledigt werden soll. Es geht um das manuelle Rotieren von Log-Dateien. Hierzu haben wir im aktuellen Verzeichnis ein paar Log-Dateien abgelegt:

[user01@aixe01 ~]$ ls -l log*
-rw-r--r--    1 user01 staff           279 Jun  1 18:23 log
-rw-r--r--    1 user01 staff           274 Jun  1 18:23 log1
-rw-r--r--    1 user01 staff           331 Jun  1 18:23 log2
-rw-r--r--    1 user01 staff            58 Jun  1 18:24 log3
[user01@aixe01 ~]$

Die Datei log wurde bereits (mindestens) 3 mal rotiert. Aufgabe ist es die Dateien wie folgt umzubenennen (rotieren):

log2 -> log3
log1 -> log2
log -> log1

Die Datei log soll anschließend neu angelegt werden. Wir stellen uns vor das diese Aufgabe häufiger ausgeführt werden soll, eventuell auch auf anderen Systemen.  Man könnte die History mit den notwendigen Kommandos in eine separate Datei abspeichern und dann bei Bedarf auf diese abgespeicherte History wieder zugreifen.

Da wir nur an den Kommandos zur Durchführung der gestellten Aufgabe interessiert sind, löschen wir zunächst die aktuelle History:

[user01@aixe01 ~]$ history -c
[user01@aixe01 ~]$

Anschließend führen wir die Log-Rotation durch drei mv  Kommandos durch:

[user01@aixe01 ~]$ mv log2 log3
[user01@aixe01 ~]$ mv log1 log2
[user01@aixe01 ~]$ mv log log1
[user01@aixe01 ~]$

und legen die Log-Datei log dann zum Schluß mit dem Kommando touch wieder an:

[user01@aixe01 ~]$ touch log
[user01@aixe01 ~]$

Insgesamt sind dann die folgenden Kommandos in der History:

[user01@aixe01 ~]$ history
    1  mv log2 log3
    2  mv log1 log2
    3  mv log log1
    4  touch log
[user01@aixe01 ~]$

Jetzt muss die History nur noch in einer eigenen Datei abgespeichert werden. Hierfür gibt es die Option „-w“ (write). Wir speichern die History in der Datei logrotate_history ab:

[user01@aixe01 ~]$ history -w logrotate_history
[user01@aixe01 ~]$

Hinweis: Falls die Datei logrotate_history schon existiert, wird ihr Inhalt komplett überschrieben. Verwendet man die Option „-a“ (append) anstelle von „-w“ (write) wird die History am Ende der Datei angefügt.

Wird die Option „-a“ verwendet, ist zu beachten das nicht die komplette History angefügt wird, sondern nur die History-Einträge die noch nicht gespeichert wurden.

Möchte man irgendwann später, z.B. einige Tage später, die Log-Rotation erneut ausführen, könnte man die hierzu notwendigen Kommandos wieder aus der Datei logrotate_history einlesen. Wir starten mit der folgenden History:

[user01@aixe01 ~]$ history
    1  pwd
    2  ls
    3  ls -l log*
[user01@aixe01 ~]$

Zum Einlesen der History aus einer Datei kann die Option „-r“ (read) des Kommandos history verwendet werden:

[user01@aixe01 ~]$ history -r logrotate_history
[user01@aixe01 ~]$ history
    1  pwd
    2  ls
    3  ls -l log*
    4  mv log2 log3
    5  mv log1 log2
    6  mv log log1
    7  touch log
[user01@aixe01 ~]$

Die Einträge aus der angegebenen Datei werden gelesen und ans Ende der aktuellen History angefügt. Die Kommandos stehen damit über den History-Mechanismus wieder zur Verfügung.

Liest man die Kommandos der Datei (z.B. versehentlich) ein zweites Mal ein, sind die Kommandos anschließend alle doppelt in der aktuellen History:

[user01@aixe01 ~]$ history -r logrotate_history
[user01@aixe01 ~]$ history
    1  pwd
    2  ls
    3  ls -l log*
    4  mv log2 log3
    5  mv log1 log2
    6  mv log log1
    7  touch log
    8  mv log2 log3
    9  mv log1 log2
   10  mv log log1
   11  touch log
[user01@aixe01 ~]$

Verwendet man anstelle von „-r“ die Option „-n“ zum Einlesen einer Datei, werden nur Einträge die bisher noch nicht eingelesen wurden, eingelesen und der aktuellen History hinzugefügt. Damit tauchen die Einträge dann auch nicht mehrfach auf.

Das Speichern und Laden der History ist besonders nützlich, wenn Tätigkeiten wiederholt werden und dazu immer wieder genau die selben Kommandos ausgeführt werden müssen. Sehr hilfreich ist dann das Kommando fc (fix command), mit dem mehrere Kommandos aus der History ausgewählt und ausgeführt werden können.