History injection

aus PUG, der Penguin User Group
Wechseln zu: Navigation, Suche

Problem

Wenn man länger auf der Kommandozeile arbeitet ist die history-Funktion der Shell sehr praktisch. Statt Kommandos wiederholt einzutippen, holt man sie sich mit den Pfeiltasten aus der history und drückt nur noch Enter.

Dies lässt sich noch vereinfachen, wenn man in seine ~/.bashrc folgenden Eintrag einfügt:

export HISTCONTROL=ignoredups

Nun werden keine doppelten Einträge in der history gemacht.

Wenn man später (Tage oder Wochen) wieder an der selben Sache weiter arbeiten möchte, z.B. um Änderungen einzufügen oder Fehler zu entfernen, dann sind die Befehle in der Regel schon aus der history herausgerutscht und müssen neu eingegeben werden.

Lösung

Um dieses Problem zu umgehen verwendet man die sogenannte history injection. Man hängt an die aktuelle history einfach den gewünschten Satz an Kommandos an.

Vorgehen

Das Vorgehen ist simpel.

Beispiel: Angenommen man erstellt ein Povray-Bild und führt dabei wiederholt die drei Schritte editieren, rendern und betrachten aus:

joe bild.pov
povray -ibild.pov -obild.png
display bild.png

Diese letzten drei Kommandos werden nun aus der history extrahiert und in eine Datei geschrieben:

history 4 | head -n 3 | awk '{$1="";print}' > ~/.history_povray

Die aktuelle history wird durch folgendes Kommando durch den Inhalt dieser Datei ersetzt:

history -r ~/.history_povray

Erklärung

history n gibt die letzten n Einträge der history aus. Dazu gehört aber auch der Aufruf von history n selbst.

head -n n-1 nimmt diese Ausgabe nun entgegen und gibt die ersten n-1 Kommandos aus. Der Aufruf von history n wurde also heraus gefiltert.

Diese Zeilen enthalten aber noch die laufende Nummer aus der history. Diese wird mit awk '{$1="";print}' heraus gefiltert.

Ergebnis

Eine Gruppe von Eingaben kann in eine Datei gesichert und bei Bedarf in die aktuelle history eingefügt werden.

Quellen

  • man history
  • man awk