Wenn die Shell alle Ersetzungen in der Kommandozeile vorgenommen und alle Umleitungen vorbereitet hat, ist der Zeitpunkt gekommen, auf den der Anwender die ganze Zeit gewartet hat. Die Shell versucht, das Kommando auszuführen. Dazu muß sie es aber erst lokalisieren. Das erste passende Kommando wird ausgeführt.
Als Kommandoname wird immer das erste Wort eines einfachen Kommandos
erkannt. Ein Kommandoname kann mit Pfadnamen in einem Verzeichnis
(absolut oder relativ) angegeben werden. Die Shell erkennt das an
(mindestens) einem Slash `/' im Kommandonamen. Wenn kein Verzeichnis
angegeben ist, versucht die Shell selbst, das Kommando zu finden. Dazu
wird der Kommandoname zuerst in der Hashtabelle (-> Seite
) gesucht, dann wird er mit den Synonymen, mit den
Scriptfunktionen und schließlich mit den Shellfunktionen verglichen.
Wenn auf diese Weise kein Programm dieses Namens gefunden wird, werden alle in der PATH-Umgebungsvariablen aufgeführten Verzeichnisse nach einer ausführbaren Datei dieses Namens durchsucht. Wenn auch hier kein passendes Kommando gefunden wird, gibt die Shell eine Fehlermeldung aus.
Wenn die Shell das Kommando lokalisieren kann, wird ein Argumentvektor zusammengestellt. Die Positionsvariable 0 wird mit dem vollständigen Pfadnamen des Kommandos belegt, die übrigen Argumente (wenn welche vorhanden sind) werden in den folgenden Positionsparametern gespeichert und in der Laufzeitumgebung des Kommandos, dem Environment, gespeichert. Dieser Argumentvektor kann dann beispielsweise in einem C-Programm durch die Funktion main(int argc, char* argv) übernommen und später ausgewertet werden.
Wenn die Ausführung fehlschlägt, weil die Datei keine ausführbaren Binärdaten enthält, versucht die bash automatisch, diese Datei als Shellscript auszuführen. Dazu wird eine neue Shell (Subshell) erzeugt, die wie bei einem Aufruf in der Kommandozeile neu (durch die in der ENV-Umgebungsvariablen angegebene Datei) initialisiert wird.
Häufig beginnen Scriptprogramme mit den Zeichen ` #!', gefolgt
von einem Programmnamen. An dieser Konstruktion erkennt der Kernel
selbst, daß es sich nicht um ein Binärprogramm handelt. Beispielsweise leitet die Zeile #! /bin/bash -e
ein bash-Shellscript ein, das sofort abbricht, wenn eines
der aufgerufenen Kommandos einen Status != Null liefert.