bash | History aufwerten

Wenn man öfter auf der Kommandozeile arbeitet lernt man die History-Funktion zu schätzen. Hier eine lose Aufstellung einiger Möglichkeiten, wie man die History-Funktion noch weiter aufbohren und an seine Bedürfnisse anpassen kann.
Update: Aufgrund von weiteren Recherchen und des Kommentars auf macfidelity habe ich diesen Artikel noch einmal überarbeitet und weitere Informationen hinzugefügt.

Einleitung

Die History ist eine eingebaute Funktion in dem Befehlsinterpreter bash – der Standardshell inzwischen vieler *nixe bzw. *BSDs, so auch von Mac OS X. Die History hat eingebaute Befehle, die man wunderbar im Handbuch von Bash nachlesen kann, oder in Kürze erklärt bei macfidelity findet. Das Grundverhalten der History kann man, wie auch ziemlich vieler anderer Funktionen, in den Profil-Dateien der bash definieren. Dazu möchte ich auf den Artikel Bash-Shell einrichten verweisen.

History von mehreren parallel laufenden Terminalsessions sichern

Oft genug hat man mehrere Terminalsessions zu einem Host offen um sich z.B. in der einen Session das Logfile anzuschauen, während man in anderen Session einen Befehl ausführt. Beim Beenden der Session wird aber nur eine History gespeichert. Um immer hinzuzufügen führt man folgenden Befehl aus

shopt -s histappend

History sofort speichern

Die History einer Sesion wird immer erst beim Beenden einer Session in die Datei .bash_history gespeichert. Um bei parallelen Terminalsessions auf die Befehle zuzugreifen, die gerade erst in einer anderen Session getätigt wurden, kann man mit der Umgebungsvariablen

export PROMPT_COMMAND='history -a'

die Shell dazu zwingen bei jedem Generieren eines neuen Prompts (als einer Befehlseingabezeile) die History zu schreiben.

History mit Timestamp

Um im Historyfile sich pro Befehl auch einen Timestamp hinzufügen zu lassen gibt man folgendes ein:

export HISTTIMEFORMAT='%a %T '

Die Variablen dafür kann man sich von strftime abschauen.

Größe des History-Speichers in der Datei

Wie viele Zeile die History-Datei speichern kann weiß ich zwar nicht genau (ich denke aber das es 500 Zeilen sind), aber vergrößern kann man ihn mit

export HISTFILESIZE=1000

oder aber man schaltet gleich die Größenbeschränkung aus:

unset HISTFILESIZE

Mit der Variable

export HISTSIZE=500

kann man definieren, wie viele Zeilen maximal beim Beenden einer Terminalsession in die History-Datei geschrieben werden.

Ignorieren von Befehlen

Alle eingegebenen Befehle werden in die History gespeichert. Dieses Verhalten kann man etwas einschränken, indem man Befehle, welche mit einem Leerzeichen anfangen nicht in die History aufnehmen läßt

export HISTCONTROL=ignorespace

So kann man auch bewußt Befehle nicht in die History schreiben lassen, wenn man z.B. statt „ls“ einfach „ ls“ eingibt.

Keine Duplikate in die History

Wie oben schon beschrieben werden alle Befehle in die History aufgenommen, auch die, die mehrfach eingegeben wurden. Möchte man das nicht

export HISTCONTROL=ignoredups

Möchte man weder Duplikate, noch die mit einem Leerzeichen am Anfang, so gibt man folgendes ein

export HISTCONTROL=ignoreboth

Spezielle Zeilen von der History ausschließen

Wenn die Variable HISTCONTROL nicht gesetzt ist, kann man auch selbst entscheiden, welche Zeilen nicht in die History aufgenommen werden sollen. Dies geschieht durch die Variable HISTIGNORE, welche mit Doppelpunkten getrennt

export HISTIGNORE='cat*:cd*:vi*:ls*'

Damit werden alle Zeilen, die mit cat, cd oder vi oder ls beginnen, nicht in der History gespeichert. Es bietet sich auch an hier alle selbst definierten Aliase anzugeben. Da theoretisch hier mit regulären Ausdrücken gearbeitet werden kann, stehen der Phantasie alle Möglichkeiten offen.

Fragen über Fragen

Kennt Ihr noch mehr Befehle um die History zu „pimpen“? Ich kann mich daran erinnern, das es einen Befehl gab, mit dem man automatisch gleich nach jedem Return den Befehl in die History schreiben lassen kann – aber wie hies der nur?

6 Gedanken zu „bash | History aufwerten

  1. fidel

    Schöner Beitrag – hatte bis dato nur ein erasedups sowie size drin – die Erweiterung mit Zeitstempel ist ne tolle Sache.

    Merci für die Idee.

    Antworten
  2. panik

    Gibt es eine möglichkeit die History so einzurichten, dass ich gezielt nach Einträgen suchen kann die mit bestimmten Zeichen anfangen? Kenne das von Matlab. Wenn ich dort einen Buchstaben eintippe kann ich anschließend mit den Pfeiltasten durch Befehle, die mit dem selben Buchstaben anfangen zappen…das fehlt mir im Terminal

    Antworten
  3. makomi Beitragsautor

    Hallo panik,

    natürlich gibt es in der bash die Möglichkeit. So etwas wird in /etc/inputrc definiert. Bei meiner debian-Installation habe ich folgende Zeile drinstehen:

    # alternate mappings for "page up" and "page down" to search the history
    "e[5~": history-search-backward
    "e[6~": history-search-forward
    

    damit kann ich z.B. „tar“ tippen und anschließend mit den Bild-rauf/Bild-runter-Tasten durch alle jemals eingetippten tar-Befehle browsen.

    Antworten
  4. Pingback: bash | Shell einrichten | controlc.de

  5. makomi Beitragsautor

    So, auf meine eigene Frage kann ich inzwischen eine Antwort geben 🙂

    Ich kann mich daran erinnern, das es einen Befehl gab, mit dem man automatisch gleich nach jedem Return den Befehl in die History schreiben lassen kann – aber wie hies der nur?

    Mit

    PROMPT_COMMAND='history -a'

    in der Profil-Datei kann man es aktivieren. Siehe auch bash | Shell einrichten

    Antworten
  6. Pingback: Randnotiz | Terminal Tipps | macfidelity

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.