Was passiert, wenn Sie einen Befehl unter Linux ausführen?
Die meisten Linux-Benutzer sind sich der internen Funktionsweise des Betriebssystems oft nicht bewusst. Sie führen vielleicht schon seit langer Zeit Linux-Befehle auf der Shell aus, aber haben Sie sich jemals gefragt, was hinter den Kulissen passiert, wenn Sie die Eingabetaste drücken ?
Am Ende haben Sie ein kurzes Verständnis davon, wie die Shell den eingegebenen Befehl unter Linux verarbeitet.
Verarbeitung des Befehls
Wenn Sie einen Befehl eingeben, zerlegt die Shell als erstes den gesamten Befehl in "Token". Die Shell sucht dann nach einem Programmnamen, der zum ersten Token in der Befehlszeile gehört.
Wenn es in keinem der Verzeichnisse im in der Umgebungsvariablen $PATH definierten Suchpfad oder im lokalen Verzeichnis mit dem .- Operator gefunden wird oder es sich nicht um einen Shell-Alias oder eine Shell-Funktion handelt, gibt die Shell einen Fehler aus . Wenn sie einen gültigen Befehl findet, geht die Shell dann alle anderen Token durch und entscheidet, ob es sich um eine Variable, einen Shell-Parameter oder ein Argument für den Befehl handelt.
Wenn die Shell feststellt, dass es sich um eine Variable oder einen Parameter wie den ~ -Operator für das Home-Verzeichnis handelt, erweitert die Shell sie oder ersetzt sie durch ihre ursprünglichen Werte im Befehl.
Wenn die Shell Parameter oder Variablen erweitert hat, übergibt sie die Befehlszeichenfolge an den Befehl und führt das Programm mit seinen Argumenten aus. Die Shell bestimmt nicht, ob irgendwelche Argumente gültig sind. Das ist die Aufgabe des Kommandos.
Ausführen des Befehls
Wenn die Shell einen anderen Befehl startet, wie kehrt sie dann zu derselben Eingabeaufforderung zurück, die Sie zuvor verwendet haben? Die Shell erstellt eine Kopie von sich selbst, ein Prozess namens Forking. Diese Kopie der Shell ersetzt sich selbst durch den Befehl mit allen zuvor verarbeiteten Argumenten. Dies wird als "Exec" bezeichnet, und der kombinierte Prozess wird als "Fork-and-Exec" bezeichnet.
Wenn Sie beispielsweise den Befehl ls ausführen, teilt sich der Shell-Prozess mit der Methode fork() selbst und erstellt eine weitere Shell-Instanz. Von den beiden Shell-Prozessen, die auf dem System laufen, führt die zusätzliche Shell ls mit der Funktion exec() aus und verwandelt sich selbst in eine Instanz des ls-Befehls.
Währenddessen wartet die ursprüngliche Shell, bis der Befehl abgeschlossen ist. Aus diesem Grund können Sie mit der Jobsteuerung Jobs anhalten und Jobs im Hintergrund in der Shell ausführen lassen.
Melden des Exit-Status
Linux-Befehle melden über ihren Exit-Status, ob sie erfolgreich ausgeführt wurden oder nicht. Wie der Name schon sagt, melden Programme ihren Exit-Status, wenn sie ihre Ausführung beenden. Sie tun dies durch die $? Umgebungsvariable, die den Beendigungsstatus des letzten Ausführungsbefehls enthält.
Konventionell bedeutet ein Exit-Status von 0 eine erfolgreiche Ausführung, während alles andere als 0 normalerweise einen Fehler bedeutet. Je nachdem, wie Ihre Eingabeaufforderung konfiguriert ist, zeigt Ihre Shell möglicherweise auch einen Exit-Status ungleich Null in der Befehlszeile an.
Der obige Screenshot ist ein Beispiel, das eine benutzerdefinierte Zsh-Eingabeaufforderung zeigt, die aufgrund eines nicht vorhandenen Befehls einen Fehlerbeendigungsstatus von 127 anzeigt.
Jetzt wissen Sie, wie Linux-Befehle funktionieren
Da Sie nun wissen, wie die Linux-Shell einen Befehl verarbeitet, sich verzweigt und ausführt und wie Programme ihren Exit-Status melden, können Sie die Befehlszeile effektiver nutzen.
Den Nutzern stehen mehrere Linux-Shells kostenlos zur Verfügung. Obwohl jeder von ihnen mehr oder weniger die gleiche Arbeit verrichtet, unterscheiden sie sich in vielerlei Hinsicht. Sie können versuchen, einige der Shells auf Ihrem System zu installieren und selbst entscheiden, welche am besten zu Ihnen passt.