instant-thinking.de

just enough to get you started and leave you confused

Advanced Bash History

| Kommentare

Unix-Shells verfügen, ganz ähnlich wie Browser, über eine History genannte Aufzeichnung der zuletzt eingegebenen Befehle. Mit der Pfeiltaste nach oben können die letzten Befehle durchgescrollt werden. Die komplette Aufzeichnung lässt sich über die Eingabe von history anzeigen und listet die neuesten Befehle am Schluss der Liste auf.

History Basics

Jedem Befehl ist eine Nummer vorangestellt über die sich der jeweilige Befehl durch ein vorangestelltes ! erneut ausführen lässt. So führt etwa die Eingabe von !22 den Befehl mit der Nummer 22 erneut aus. Mit !! wird stets der letzte Befehl noch einmal ausgeführt. Diese Eingaben können auch ergänzt werden. Wurde etwa ein sudo vergessen, lässt sich das schnell mit sudo !! für den letzten Befehl ergänzen. Die history man-page listet eine Unzahl an weiteren Optionen auf, die für den effizienten Einsatz der Shell verwendet werden können. In meiner täglichen Arbeit nutze ich beispielsweise häufig den !$ Operator.

Dieser bezieht sich stets auf das letzte “Wort” eines Befehls. Hatte man etwa eine Datei per cat /etc/somefile.conf angezeigt, ist sie direkt danach per vim !$ editierbar. In der man-page finden sich, wie gesagt, noch viele weitere Möglichkeiten mit der History umzugehen. Es ist aber vor allem wichtig, dass die Shortcuts auch ihren Weg ins Muskel-Gedächtnis finden. Denn nur wenn die verschiedenen Operatoren benutzt werden können ohne groß nachzudenken machen sie auch Sinn.

Mehr History durch .bashrc

Durch Einträge in die ~/.bashrc1 kann man die Fähigkeiten der History erweitern und verbessern.

So ist es normalerweise üblich, dass die History nur nach einem sauberen exit der aktuellen Shell geschrieben wird. Stürzt die Shell ab oder hat man mehrere gleichzeitig geöffnete Fenster mit Shells2 ist die History verloren, oder kommt durcheinander oder steht nicht in allen Fenstern zur Verfügung. Diesem unhaltbaren Zustand ist glücklicherweise sehr einfach abzuhelfen. Durch das Hinzufügen von einer Zeile in der .bashrc wird die History direkt nach jedem Kommando geschrieben und steht in anderen Fenstern zur Verfügung:

1
PROMPT_COMMAND="history -a"

Mein absoluter Lieblingsschnipsel für die History-Erweiterung per .bashrc ist dieser:

1
h() { if [ -z "$1" ]; then history; else history | grep "$@"; fi; }

Hier wird eine Funktion namens h definiert. Diese führt den oben erwähnten Befehl history aus, wenn kein weiterer Parameter angegeben wird. Folgt nach dem h ein beliebiger String wird nach diesem in der Histroy gegrept. So wird etwa ein h cd alle verwendeten cd-Kommandos anzeigen.

Eine sehr praktische Sache.

Soll die Ausgabe der History ausserdem erweitert werden, so ist dieser Schnipsel zu verwenden:

1
export HISTTIMEFORMAT='%Y.%m.%d-%T :: ' HISTFILESIZE=50000 HISTSIZE=50000

Damit wird die Ausgabe der History um Datum und Uhrzeit der Befehle erweitert und ausserdem auf 50.000 Einträge erweitert.

Die vorgestellten Schnipsel können natürlich angepasst oder erweitert werden. Die Größe der History lässt sich auch ohne die Datumsangabe verwenden und es ist natürlich auch möglich nur das Datum oder nur die Uhrzeit zu verwenden…

Update, 09.04.2010

Ein weiterer Schnipsel aus einem Kommentar von Asmus:

1
2
bind '"\e[A"':history-search-backward
bind '"\e[B"':history-search-forward

Hierdurch ist es möglich einen Befehl, etwa cd, zu tippen und dann mit den Pfeiltasten nur durch solche Befehle zu navigieren, die mit cd beginnen. Total super!

Ich habe hier nur die Anführungszeichen korrigiert, diese wurden in Asmus Kommentar typografisch korrekt, aber .bashrc untauglich angezeigt.

  1. Eine versteckte Datei im Homeverzeichnis, Grundlegendes zu dieser Datei hier

  2. Das ist hier quasi ständig der Fall…

Comments