History injection
Inhaltsverzeichnis
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