bash | History aufwerten

Wenn man öfter auf der Kom­man­do­zeile arbei­tet lernt man die History-Funktion zu schät­zen. Hier eine lose Auf­stel­lung eini­ger Mög­lich­kei­ten, wie man die History-Funktion noch wei­ter auf­boh­ren und an seine Bedürf­nisse anpas­sen kann.
Update: Auf­grund von wei­te­ren Recher­chen und des Kom­men­tars auf mac­fi­de­lity habe ich die­sen Arti­kel noch ein­mal über­ar­bei­tet und wei­tere Infor­ma­tio­nen hin­zu­ge­fügt.

Ein­lei­tung

Die History ist eine ein­ge­baute Funk­tion in dem Befehls­in­ter­pre­ter bash — der Stan­dards­hell inzwi­schen vie­ler *nixe bzw. *BSDs, so auch von Mac OS X. Die History hat ein­ge­baute Befehle, die man wun­der­bar im Hand­buch von Bash nach­le­sen kann, oder in Kürze erklärt bei mac­fi­de­lity fin­det. Das Grund­ver­hal­ten der History kann man, wie auch ziem­lich vie­ler ande­rer Funk­tio­nen, in den Profil-Dateien der bash defi­nie­ren. Dazu möchte ich auf den Arti­kel Bash-Shell ein­rich­ten verweisen.

History von meh­re­ren par­al­lel lau­fen­den Ter­mi­nal­ses­si­ons sichern

Oft genug hat man meh­rere Ter­mi­nal­ses­si­ons zu einem Host offen um sich z.B. in der einen Ses­sion das Log­file anzu­schauen, wäh­rend man in ande­ren Ses­sion einen Befehl aus­führt. Beim Been­den der Ses­sion wird aber nur eine History gespei­chert. Um immer hin­zu­zu­fü­gen führt man fol­gen­den Befehl aus

shopt -s histappend

History sofort speichern

Die History einer Sesion wird immer erst beim Been­den einer Ses­sion in die Datei .bash_history gespei­chert. Um bei par­al­le­len Ter­mi­nal­ses­si­ons auf die Befehle zuzu­grei­fen, die gerade erst in einer ande­ren Ses­sion getä­tigt wur­den, kann man mit der Umgebungsvariablen

export PROMPT_COMMAND='history -a'

die Shell dazu zwin­gen bei jedem Gene­rie­ren eines neuen Prompts (als einer Befehls­ein­ga­be­zeile) die History zu schreiben.

History mit Timestamp

Um im Histo­ry­file sich pro Befehl auch einen Time­stamp hin­zu­fü­gen zu las­sen gibt man fol­gen­des ein:

export HISTTIMEFORMAT='%a %T '

Die Varia­blen dafür kann man sich von strf­time abschauen.

Größe des History-Speichers in der Datei

Wie viele Zeile die History-Datei spei­chern kann weiß ich zwar nicht genau (ich denke aber das es 500 Zei­len sind), aber ver­grö­ßern kann man ihn mit

export HISTFILESIZE=1000

oder aber man schal­tet gleich die Grö­ßen­be­schrän­kung aus:

unset HISTFILESIZE

Mit der Variable

export HISTSIZE=500

kann man defi­nie­ren, wie viele Zei­len maxi­mal beim Been­den einer Ter­mi­nal­ses­sion in die History-Datei geschrie­ben werden.

Igno­rie­ren von Befehlen

Alle ein­ge­ge­be­nen Befehle wer­den in die History gespei­chert. Die­ses Ver­hal­ten kann man etwas ein­schrän­ken, indem man Befehle, wel­che mit einem Leer­zei­chen anfan­gen nicht in die History auf­neh­men läßt

export HISTCONTROL=ignorespace

So kann man auch bewußt Befehle nicht in die History schrei­ben las­sen, wenn man z.B. statt »ls« ein­fach « ls« ein­gibt.

Keine Dupli­kate in die History

Wie oben schon beschrie­ben wer­den alle Befehle in die History auf­ge­nom­men, auch die, die mehr­fach ein­ge­ge­ben wur­den. Möchte man das nicht

export HISTCONTROL=ignoredups

Möchte man weder Dupli­kate, noch die mit einem Leer­zei­chen am Anfang, so gibt man fol­gen­des ein

export HISTCONTROL=ignoreboth

Spe­zi­elle Zei­len von der History ausschließen

Wenn die Varia­ble HISTCONTROL nicht gesetzt ist, kann man auch selbst ent­schei­den, wel­che Zei­len nicht in die History auf­ge­nom­men wer­den sol­len. Dies geschieht durch die Varia­ble HISTIGNORE, wel­che mit Dop­pel­punk­ten getrennt

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

Damit wer­den alle Zei­len, die mit cat, cd oder vi oder ls begin­nen, nicht in der History gespei­chert. Es bie­tet sich auch an hier alle selbst defi­nier­ten Aliase anzu­ge­ben. Da theo­re­tisch hier mit regu­lä­ren Aus­drü­cken gear­bei­tet wer­den kann, ste­hen der Phan­ta­sie alle Mög­lich­kei­ten offen.

Fra­gen über Fragen

Kennt Ihr noch mehr Befehle um die History zu »pim­pen«? Ich kann mich daran erin­nern, das es einen Befehl gab, mit dem man auto­ma­tisch gleich nach jedem Return den Befehl in die History schrei­ben las­sen kann — aber wie hies der nur?

Ähnli­che Arti­kel zu die­sem Thema:

  1. bash | Shell einrichten
  2. bash | Back­ups mit tar
  3. bash | Abge­stürzte ssh-Sitzungen beenden
  4. bash | schnel­les Backup anlegen
  5. mac | VMware Fusion über die Kom­man­do­zeile steuern

  1. Schö­ner Bei­trag — hatte bis dato nur ein era­se­dups sowie size drin — die Erwei­te­rung mit Zeits­tem­pel ist ne tolle Sache.

    Merci für die Idee.

    • panik
    • 25. Jun. 2009 11:13pm

    Gibt es eine mög­lich­keit die History so ein­zu­rich­ten, dass ich gezielt nach Ein­trä­gen suchen kann die mit bestimm­ten Zei­chen anfan­gen? Kenne das von Mat­lab. Wenn ich dort einen Buch­sta­ben ein­tippe kann ich anschlie­ßend mit den Pfeil­tas­ten durch Befehle, die mit dem sel­ben Buch­sta­ben anfan­gen zappen…das fehlt mir im Terminal

  2. Hallo panik,

    natür­lich gibt es in der bash die Mög­lich­keit. So etwas wird in /etc/inputrc defi­niert. Bei mei­ner debian-Installation habe ich fol­gende 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« tip­pen und anschlie­ßend mit den Bild-rauf/Bild-runter-Tasten durch alle jemals ein­ge­tipp­ten tar-Befehle browsen.

  3. So, auf meine eigene Frage kann ich inzwi­schen eine Ant­wort geben :)

    Ich kann mich daran erin­nern, das es einen Befehl gab, mit dem man auto­ma­tisch gleich nach jedem Return den Befehl in die History schrei­ben las­sen kann – aber wie hies der nur?

    Mit <pre lang=bash«>PROMPT_COMMAND=›history –a‹

    in der Profil-Datei kann man es akti­vie­ren. Siehe auch bash | Shell einrichten

  1. 12. Mar. 2010
  2. 11. Apr. 2010
:) :( ;) :mrgreen: :lol: :roll: :idea: :oops: more »


5 × = vierzig fünf