Bourne-again shell (bash)

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

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.

  1. $HISTSIZE / $HISTFILESIZE
  2. $HISTFILE
  3. $HISTTIMEFORMAT
  4. $HISTCONTROL
Die Variablen $HISTSIZE und $HISTFILESIZE
Mit der Variablen $HISTSIZE kann man die Anzahl der zuletzt ausgeführten Befehle definieren. Die Variablen $HISTSIZE und $HISTFILESIZE bewirken beide das Gleiche!
tux@linux:~$ HISTSIZE=100
Definiert, 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.
Möchte man, das nichts an die Datei ~/.bash_history angehängt wird, könnte man mit
tux@linux:~$ HISTSIZE=0
die Größe, bzw. Anzahl Zeilen in der Datei ~/.bash_history, auf Null setzten und es wird nichts mehr eingetragen.
Die History-Datei wird allerdings auch beim Beenden der shell dadurch geleert!
Mit dem Befehl
tux@linux:~$ history -c
kann man auch die History direkt löschen, bzw. leeren.
Mit dem Befehl
tux@linux:~$ history
kann man sich die gesamte, bis dahin existente History anzeigen lassen.
Die Variable $HISTFILE
Mit der Variablen $HISTFILE kann man den Namen der History-Datei definieren.
~/.bash_history ist der Standardwert für diese Variable.
Entfern man die Variable mit
tux@linux:~$ unset HISTSIZE
wird die History nach dem Beenden der shell nicht geschrieben, schon vorhandene Einträge bleiben aber erhalten!
Die Variable $HISTTIMEFORMAT
Mit Setzten der Variable $HISTTIMEFORMAT kann man den jeweiligen Befehl in der History-Datei mit einem Zeitstempel protokollieren.
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.
%F wäre das Datumsformat nach ISO 8601 (z.B. 2012-04-08)
%T wäre die Uhrzeit im 24-Stundenformat (z.B. 18:52:32).
Die Variable $HISTCONTROL
Mit der Variablen $HISTCONTROL kann man definieren, was und wie in die History-Datei eingetragen wird.
Es gibt drei gültige Werte für die Variable:
tux@linux:~$ HISTCONTROL=ignorespace
Hiermit werden alle Befehlszeilen, die mit einem Leerzeichen anfangen nicht in die History-Datei eingetragen, aber natürlich trotzdem ausgeführt.
tux@linux:~$ HISTCONTROL=ignoredups
Hiermit werden mehrfach hintereinander gleiche Befehlszeilen nur einmal in die History-Datei eingetragen.
tux@linux:~$ HISTCONTROL=ignoreboth
Ist einfach nur die Möglichkeit sowohl ignorespace als auch ignoredups gemeinsam zu definieren.

Die History-Substitution

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:

  1. Event Designator (Ereignisbezeichner)
  2. Word Designator (Wortbezeichner)
  3. Modifier (Umwandler)
und hat folgendes Format:
!Event Designator[:Word Designator[:Modifier]]
Ein Event Designator beginnt, mit einer Einzigen Ausnahme, immer mit einem !.
Der Event Designator
Mit dem entsprechenden Event Designator kann man sich auf die entsprechende Zeile der History beziehen. Es gibt folgende Event Designator:
!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
Der Word Designator
Über optionale Word Designator (Wortbezeichner) kann man auf die einzelnen Wörter einer History-Zeile zugreifen.
Die Wörter der History-Zeilen werden von links nach rechts mit der Null beginnend durchnummeriert.
Den Doppelpunkt zwischen Event Designator und Word Designator kann man weglassen, wenn der Word Designator mit ^ (Caret), $ (Dollar), * (Asterisk), - (Minus) oder %( Modulo) beginnt.
Es gibt folgende Word Designator:
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
x-y 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)
Modifiers
Hinter dem Word Designator können ein bis mehrerer Modifiers (Modifikatoren) stehen, wobei jeder Modifier normalerweise mit einem Doppelpunkt eingeleitet wird.
Es gibt folgende Modifiers:
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)

Beispiele zu Event Designators
tux@linux:~$ echo a b c d e
a b c d e
tux@linux:~$ !!
echo a b c d e
a b c d e
tux@linux:~$ echo a b c d e
a b c d e
tux@linux:~$ echo e d c b a
e d c b a
tux@linux:~$ !-2
echo a b c d e
a b c d e
tux@linux:~$ ecoh a b c d e
bash: ecoh: Kommando nicht gefunden.
tux@linux:~$ ^ecoh^echo^
echo a b c d e
a b c d e
Beispiele zu Word Designators
tux@linux:~$ echo a b c d e
a b c d e
tux@linux:~$ echo !!:2
echo b
b
tux@linux:~$ echo a b c d e
a b c d e
tux@linux:~$ echo !!:2-4
echo b c d
b c d
tux@linux:~$ echo a b c d e
a b c d e
tux@linux:~$ echo !$
echo e
e
tux@linux:~$ print a b c d e
Warning: unknown mime-type for "a" -- using "application/octet-stream"
Warning: unknown mime-type for "b" -- using "application/octet-stream"
Warning: unknown mime-type for "c" -- using "application/octet-stream"
Warning: unknown mime-type for "d" -- using "application/octet-stream"
Warning: unknown mime-type for "e" -- using "application/octet-stream"
Error: no such file "a"
Error: no such file "b"
Error: no such file "c"
Error: no such file "d"
Error: no such file "e"
tux@linux:~$ echo !*
echo a b c d e
a b c d e
Beispiele zu Modifier
tux@linux:~$ echo /usr/local/apache
/usr/local/apache
tux@linux:~$ echo !$:h
echo /usr/local
/usr/local
tux@linux:~$ echo /usr/local/apache
/usr/local/apache
tux@linux:~$ echo !$:t
echo apache
apache
tux@linux:~$ tar xvf software.tar
....
tux@linux:~$ cd !$:r
cd software
tux@linux:~/software$

Haben Sie noch weiter Fragen?

Kontaktieren Sie mich unter:


info@bohnsack-it.de