Im Jahr 1989 begann Brian Fox eine weitgehend zur Bourne-Shell (sh) kompatibelen Shell zu programmieren, in der zusätzlich sowohl die meisten Funktionen der Korn-Shell (ksh) als auch Teile der C-Shell (csh), wie zum Beispiel die „Command-History“, die POSIX-Form der Command-Substitution $(...) und die $RANDOM-Variable übernommen wurde. Auch wurde sie z.B. um Funktionen wie der Ganzzahlarithmetik und um Funktionen zur Vereinfachung der I/O-Umleitungen erweitert. Seit 1990 ist Chet Ramey der Maintainer der bash. Er ist unter der Emailadresse chet-ramey@case.edu bzw. bash-maintainer@gnu.org erreichbar. Weitere Features der bash sind z.B. eine komplette Implementation der IEEE-Posix- und Open-Group-Shell-Spezifikation mit interaktiver Editierung der Kommandozeile, Jobkontrolle bei Strukturen, die sie unterstützen, csh-ähnlichen Zusatzfunktionen wie History-Substitution und Klammerexpansion.
Die History der bash ist eine Funktion, die es ermöglicht auf schon einmal ausgeführte Befehlszeilen der bash zurückgreifen zu können.
Es gibt hier zu 5 wichtige Variablen, die man z.B. in der ~/.bashrc definieren kann.
tux@linux:~$ HISTSIZE=100Definiert, das die letzten 100 Befehle gemerkt werden. Gemerkt ist eigentlich nicht wirklich glücklich formuliert, da die Befehle in der Datei ~/.bash_history einfach gespeichert werden, allerdings erst beim Beenden der aktuellen Shell. Also definiert man mit dem Wert der Variablen $HISTSIZE einfach die maximale Anzahl der Befehle (Zeilen), die in die Datei ~/.bash_history, beim Beenden der Shell, angehängt werden. Wird die maximale Anzahl erreicht, wird einfach die älteste (erste) Befehlszeile gelöscht.
tux@linux:~$ HISTSIZE=0die Größe, bzw. Anzahl Zeilen in der Datei ~/.bash_history, auf Null setzten und es wird nichts mehr eingetragen.
tux@linux:~$ history -ckann man auch die History direkt löschen, bzw. leeren.
tux@linux:~$ historykann man sich die gesamte, bis dahin existente History anzeigen lassen.
tux@linux:~$ unset HISTSIZEwird die History nach dem Beenden der shell nicht geschrieben, schon vorhandene Einträge bleiben aber erhalten!
tux@linux:~$ HISTTIMEFORMAT='%F %T > 'Hier wird die Variable $HISTTIMEFORMAT mit dem Wert '%F %T > ' belegt. %F und %T sind "Wildcards" die gemäß der Funktion strftime() ersetzt werden.
tux@linux:~$ HISTCONTROL=ignorespaceHiermit werden alle Befehlszeilen, die mit einem Leerzeichen anfangen nicht in die History-Datei eingetragen, aber natürlich trotzdem ausgeführt.
tux@linux:~$ HISTCONTROL=ignoredupsHiermit werden mehrfach hintereinander gleiche Befehlszeilen nur einmal in die History-Datei eingetragen.
tux@linux:~$ HISTCONTROL=ignorebothIst einfach nur die Möglichkeit sowohl ignorespace als auch ignoredups gemeinsam zu definieren.
Die History-Substitution (History Expansion) ermöglicht es auf bestimmte Einträge, oder sogar nur Teile der Einträge, einer Historyzeile zuzugreifen und diese auch bei Bedarf manipuliert benutzen zu können. Eine History-Substitution kann aus bis zu 3 Teilen bestehen:
!n | Historyzeile n |
!-n | letzte Historyzeile minus n |
!! | letzte Historyzeile (!-1 hat den selben Effekt) |
!string | Historyzeile, die mit string beginnt |
!?string? | Historyzeile, die string enthält |
^string1^string2^ | Wiederholung des letzten Kommandos, wobei string1 durch string2 ersetzt wird ACHTUNG: Dies ist der einzigste Event Designator der nicht mit einem ! beginnt! |
!# | die bisher geschriebene komplette Kommandozeile |
0 | nulltes Wort der Historyzeile (das Kommando selbst) |
n | n-tes Wort einer Historyzeile |
^ | erstes Wort einer Historyzeile (das erste Argument nach dem Kommando) |
$ | letztes Wort einer Historyzeile |
% | Wort, das bei der letzten String-Suche in der Historyzeile mit ?string? gefunden wurde |
Wortbereich von Wort x bis Wort y der Historyzeile; -y ist dasselbe wie 0-y | |
* | alle Wörter der Historyzeile ohne das Nullte; ist dasselbe wie 1-$ |
x* | Kurzschreibweise für x-$ |
x- | Kurzschreibweise für x-$, wobei aber das letzte Wort der Historyzeile ausgelassen wird (also Wort x bis zum vorletzten Wort) |
h | entfernt die letzte Pfadnamenskomponente (den Dateinamen), es beibt nur der Anfang (head) |
t | entfernt alle führenden Pfadnamenskomponenten, es beibt nur das Ende (der Dateiname) (tail) |
r | entfernt das abschließende Suffix in der Form .xxx, es bleibt der Basisnamen |
e | entfernt alles bis auf das abschließende Suffix (extension) |
p | Ausgabe der neuen Befehlsteile, ohne sie auszuführen (print) |
q | Alle substituierten Wörter werden mit einem einfachen Apostrophe quotiert, eine weitere Substitutionen wird dadurch verhindert. (quote) |
x | Die substituierten Wörter werden einzeln durch einfache Apostrophe quotiert, um weitere Substitutionen der einzelnen Wörter zu verhindern. (extended quote) |
s/alt/neu | Das erste Vorkommen von Zeichenfolge alt wird durch Zeichenfolge neu ersetzt. Anstatt / können auch andere Trennzeichen verwendet werden. Wenn das Trennzeichen in alt oder neu vorkommt, muss man es durch einen Backslash (\) quotieren. Wenn ein Ampersand (&) in neu vorkommt, wird es durch alt ersetzt. Ein Backslash (\) hebt die Sonderbedeutung des Ampersand (&) auf. Wenn alt einer leeren Zeichenfolge entspricht, so wird stattdessen der Wert von alt aus der letzten History-Substitution verwendet. Wenn es keine History-Substitution gab, so wird der letzte Such-String des Event Designator !?string? verwendet. (substitution) |
& | wiederholt die letzte Substitution |
g | Bewirkt, dass die Substitutionen der Modifiers :s oder :& global erfolgen, also jedes Auftreten von alt durch neu ersetzt wird. Anstatt g kann auch der Modifier a verwendet werden.(global) |
G | Der folgende Modifier s wird genau einmal auf jedes Wort der Historyzeile angewendet. (Global) |