Die bash-Shell ist inzwischen die meist genutzte Consolen-Shell unter Linux/Unix. Das geht schon so weit, dass Start-Scripte direkt für die Bash geschrieben sind, oder gar der Befehl /bin/sh nur noch ein Link auf /bin/bash ist.
Bash-History richtig nutzen
Die Bash verfügt über eine Art Erinnerungsvermögen: Sie merkt sich, welche Befehle man bereits eingegeben hat. Wenn man einen langen Befehl nicht noch einmal eingeben will, kann man sich einfach mit den Pfeiltasten durch die gespeicherten Befehle hangeln und den Befehl wieder ausführen. Aber das Erinnerungsvermögen der Bash kann noch mehr.
Mit history kann man sich eine Liste von allen Befehlen anzeigen lassen, abhängig davon für wie viele Eingabenaufzeichnungen die Bash konfiguriert wurde (.s Konfiguration)
1 2 3 4 5 6 7 |
$ history [...] 504 cd /home/antu 505 ls -la 506 htop 507 cd / 508 history |
Dabei zählt die Bash immer mit, wie viele Befehle sich bereits in der Datenbank befinden, in diesem Fall sind es 508. Praktisch: Gibt man jetzt !<Zahl> ein, wird der Befehl mit der entsprechenden Zahl wieder ausgeführt.
Wenn man Strg+R drückt, muss man nur noch den Anfang des Befehls eingeben, wenn er schon einmal eingegeben wurde, vervollständigt die Bash ihn automatisch.
Konfiguration
Das Verhalten der Erinnerungsfunktion lässt sich entweder in der systemweiten, meist /etc/bashrc bzw. /etc/bash/bashrc, oder in der Konfigurationsdatei im Home-Verzeichnis (~/.bashrc, ~/.bash_profile) konfigurieren.
Mit shopt lassen sich diverse Einstellungen der Bash verändern. Histappend sorgt dafür, dass die eingegebenen Befehle beim Beenden der Bash an die Liste der eingegebenen Befehle angehangen werden, anstatt die Liste jedes Mal zu überschreiben.
-
1shopt -s histappend
Mit den folgenden Parametern wird festgelegt, wie viele Befehle gespeichert werden sollen, standardmäßig ist meistens 500 eingestellt.
-
12export HISTSIZE=<Größe>export HISTFILESIZE=<Größe>
Mit HISTIGNORE lassen sich Befehle festlegen, die nicht gespeichert werden sollen. Die Befehle werden durch einen Doppelpunkt getrennt. Der Befehl hier im Beispiel sorgt dafür, das alle Befehle, die mit cd oder ls beginnen, nicht gespeichert werden
-
1export HISTIGNORE='cd*:ls*'
Eine durch Doppelpunkte getrennte Liste von Optionen zur Speicherung von Befehlen. Wenn ignorespace aktiviert ist, werden alle eingegeben Zeilen, die mit einem Leerzeichen beginnen, nicht gespeichert, erasedups sorgt dafür, dass jeder Befehl nur einmal in der Bash-Erinnerung vorkommt. Mit ignoredups lässt sich festlegen, dass ein eingegebener Befehl nur einmal gespeichert wird, auch wenn er mehrmals hintereinander eingegeben wird. ignoreboth ist dasselbe wie ignorespace + ignoredups.
-
1export HISTCONTROL=erasedups:ignorespace
Die eingegebenen Befehle werden standardmäßig in der ~/.bash_history gespeichert, wenn man sie woanders speichern will kann man das mit HISTFILE festlegen.
-
1export HISTFILE='~/.bash_history'
Wird folgende Variable gesetzt, wird zu jedem eingegebenen Befehl auch die Uhrzeit gespeichert. Der Wert von HISTTIMEFORMAT wird verwendet, um die Zeit zu formatieren, mehr Informationen dazu finden sich in der Manpage von strftime (man 3 strftime).
-
1export HISTTIMEFORMAT='%d.%m.%Y %T '
-
12530 07.12.2008 13:22:18 export HISTTIMEFORMAT='%d.%m.%Y %T '531 07.12.2008 13:22:28 history
Befehle in Echtzeit speichern
Die Bash speichert die eingegebenen Befehle erst, wenn sie beendet wird, deswegen werden die Befehle anderer Bash-Sitzungen nicht angezeigt, wenn man mehrere Bashs gleichzeitig laufen hat. Aber da gibt es einen kleinen Trick, denn man kann den Prompt so verändern, dass er die Erinnerung bei jeder neuen Eingabe speichert und neu einliest. Dazu werden die beiden Befehle history -a (Befehle in der History speichern) und history -r (History-Datei neu einlesen) verwendet.
Um die Echtzeiterinnerungsfunktion der Bash zu aktivieren, werden die beiden Befehle einfach nur zum lokalen (~/.bashrc) oder globalen (/etc/profile) Bash Prompt hinzufügt.
-
12# activate realtime historyexport PROMPT_COMMAND="history -a; history -r; $PROMPT_COMMAND"
by Speefak