Randnotiz | Tweaking Terminal History
March 11th, 2010 at 17:55Wer 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: bash, bash_profile, history



March 12th, 2010 at 09:53
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
March 12th, 2010 at 10:59
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
March 12th, 2010 at 14:13
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.
March 14th, 2010 at 01:17
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; …
March 14th, 2010 at 11:29
[...] 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 [...]
March 14th, 2010 at 11:36
@Anmibe
danke für die Ergänzungen
@all:
Der Blick auf den controlc.de Post lohnt sich
March 14th, 2010 at 13:47
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 checkwinsizegesetzt 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.
April 11th, 2010 at 16:10
[...] 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 [...]