macfidelity

|

rethinking the think-different thing

Randnotiz | Tweaking Terminal History

March 11th, 2010 at 17:55

Wer regelmäßiger im Terminal (in meinem Fall eigentlich Bash) werkelt wird irgendwann über den Befehl

history

stolpern. Wiki schreibt dazu

Command history is a common feature in operating system shells (such as Korn shell, Bash, cmd.exe, etc.), computer algebra programs, and other software that interacts with the user through a command line interface. Command history involves making previously-entered commands, usually up to some limit, easy to once again input to the command line. The usual method is for the user to use the Up (and Down) keyboard keys to navigate through the command history, but some programs also offer the facility for the user to press a certain function key which will show a menu of recent commands, from which the user can select one by typing a number.

Command history takes advantage of the fact the user may want to execute the same command many times, such as a developer frequently compiling and running a program, or else the new command may be a small modification of a previous one, hence necessitating little typing to modify it. It therefore saves a lot of typing for the user and increases the speed and accuracy of input to the computer.

Greift man nun regelmäßiger auf diesen Befehl zurück macht es ggf Sinn einige Feinjustierungen zu betreiben – einige kleine Ideen aus meiner  .bashprofile. Ergänzungen sind wie immer gerne gesehen.

Duplikate löschen

Da es herzlich wenig Sinn macht seine beschränkte History mit X gleichen Einträgen aufzublasen macht die Löschung von Dupletten Sinn.

# Erase duplicates
export HISTCONTROL=erasedups

History Größe definieren

Ebenso relativ einfach – wo ihr euer Limit setzen wollt hängt wohl von der Arbeitsweise ab.

# resize history size
export HISTSIZE=10000

Persistent History

Gegenseitiges überschreiben ist schon immer nervig – deshalb

# append to bash_history on quit
shopt -s histappend

History Zeitstempel

Um abschließend den Spaß noch mit einem Timestamp zu versehen

# add timestamp
export HISTTIMEFORMAT=\"%d/%m/%y %T \"

Anwendungstipps

Bei Einstiegern mag sich nun die Frage auftun

Und jetzt ?

Ein simples

history

sollte euch nun Zugriff geben auf die gespeicherten Befehle. Will man nun z.b. den zuletzt abgesetzten Befehl erneut absetzen reicht ein simples

!!

Will man einen speziellen Eintrag über dessen Nummer erneut aufrufen geht dies via

!nummer

Fragen über Fragen

Und was sind eure History Tweaks?

Beiträge der Kategorie Randnotiz erscheinen nicht auf der Hauptseite

Tags: , ,

8 Responses to “Randnotiz | Tweaking Terminal History”

  1. oDk Says:

    Den einzigen Historytweak den ich in beim beenden einer Terminal/Shell-Session fast immer nutze ist history -c

    Ich danke Dir aber für den Hinweis über den Timestamp- und vor allem über den erasedups-Hinweis.

    Gruß,
    oDk

  2. fidel Says:

    ich realisiere mal wieder das mein wordpress mir wunderbare Zusatzzeichen eingefügt hat …. *grrrrrr*

    >> export HISTTIMEFORMAT=”%d%m%Y %T ”

    o. Ä. sollte durchaus reichen ;)

    @oDK
    freut mich wenn was für dich dabei war ;)

    Gruss
    fidel

  3. makomi Says:

    Ich muss sagen, das ich bisher noch nie auf die Idee gekommen bin den Befehl history zu verwenden :) – mit einem Tastaturmapping wie hier beschrieben brauche ich nur die Tasten Bild Rauf/Bild Abwärts um durch die history zu scrollen.

  4. Anmibe Says:

    Erwähnenswert ist vielleicht noch der Befehl HISTIGNORE. Hier wird eine mit Doppelpunkten getrennte Aufzählung von Begriffen angegeben, die nicht in die history augenommen werden sollen.
    Beispiel:
    export HISTIGNORE=’cat*:cd*:vim*’
    Alle Aufrufe von cat, cd oder vim erscheinen *nicht* in der history.

    Interessant könnte auch mein folgender Dreh für manch Einen sein:
    export HISTIGNORE=’[ \t]*’
    D.h. es werden keine Befehle in die history aufgenommen, die mit Leerzeichen oder Tabulator anfangen. Wozu das Ganze gut sein soll? Hiermit hat man die Möglichkeit ad hoc eine Befehelszeile einfach dadurch von der Protokollierung auzuschließen, daß man einfach als erstes ein Leerzeichen eingibt und dann erst die anderen Kommandos. (Es muß ja bspw. nicht jeder Download mit curl auf lange Zeit, immerhin size 10.000, in der history auftauchen ;-) )

    Hier noch die wichtigsten Befehle aus meiner HISTIGNORE:
    export HISTIGNORE=’[ \t]*:&:alias*:bg*:cd*:cat*:exit:fg*:head*:history*:kill*:man*:tail*:vim*’
    Zusätzlich habe ich noch einige selbstdefinierte Aliase auf ein paar Verzeichnisse in die Auzählung aufgenommen.

    Übrigens sieht mein HISTTIMEFORMAT wie folgt aus:
    export HISTTIMEFORMAT=’: %d.%m.%Y %H:%M:%S; ‘
    welches dann soetwas liefert:
    7748 : 14.03.2010 00:45:59; …

  5. bash | History aufwerten | controlc.de Says:

    [...] 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 [...]

  6. fidel Says:

    @Anmibe
    danke für die Ergänzungen

    @all:
    Der Blick auf den controlc.de Post lohnt sich ;)

  7. Anmibe Says:

    Und noch ein Nachtrag von mir.
    1.) export HISTCONTROL=’ignoreboth:erasedups’
    ignoreboth ist die Kombination aus ignorespace und ignoredups.

    2.) Man kan übrigens auch eine history mit Kommentaren versehen. Bspw.:

    grep -aEin --color '"([^"])*"' Text.txt #Text zwischen Anführungszeichen auswählen.

    Das # dient wie bei den Shellskripten als Kommentarzeichen.

    3.) Bei meinem HISTTIMEFORMAT Hinweis oben hatte ich vergessen noch eine Begründung zu schreiben. Das einleitende Folge von Doppelpunkt-Leerzeichen dient nicht nur der Schönheit, sie erleichtert das (automatische) Parsen von Zeitstempel und Kommandoeintrag.

    4.) Für Liebhaber langer, mehrzeiliger Befehlszeilen gibt es die Möglichkeit, die Mehrzeiler als eine Zeile in die history eintragen lassen:

    shopt -q -s cmdhist

    6.) Jetzt noch etwas, was nur indirekt hierher gehört, aber durchaus in den Zusammenhang passt. Damit die Fenstergröße vom Terminal von der bash bemerkt wird, sollte shopt -s checkwinsize gesetzt sein. Aber wie bringt man Befehlen bei, beim einfachen Aufruf immer (ziemlich) genau ein Fenster auszugeben? $LINES in Verbindung mit einem Alias:

    if [ $LINES -gt 2 ]; then Zeilen=$(( $LINES-2 )); else Zeilen=50; fi
    alias head="head -n$Zeilen"
    alias history="history $Zeilen"
    alias last="last -$Zeilen"
    alias tail="tail -n$Zeilen"

    Wird jetzt bspw. history aufgerufen, werden immer genau soviel Zeilen ausgegeben wie das Terminalfenster Zeilen-2 hoch ist. Die -2 rührt daher, daß ich zwei Prompte sehen will, den mit dem Aufruf und den Aktuellen. Das Ganze macht aber nur dann Sinn, wenn der Monitor etwas größer und vor allen Dingen das Terminalfenster breit gezogen ist, denn lange Zeilen werden umbrochen und dann stimmt die Rechnung nicht mehr. Aber gerade bei der history-Ansicht ungemein hilfreich, da ohne less etc. so gut wie immer ein Bildschirm voll angezeigt wird.

  8. Randnotiz | Terminal Tipps | macfidelity Says:

    [...] wir gerade beim Thema Terminal sind – und hier bereits einige Möglichkeiten im Umgang mit der history besprochen wurden will ich heute mal auf den [...]

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>