Bash/Kommandos: Unterschied zwischen den Versionen
K Textersetzung - „[[Kategorie:“ durch „[[Category:“ |
|||
Zeile 57: | Zeile 57: | ||
* Voraussetzung sind natürlich die jeweils separat zu installierenden [https://wiki.ubuntuusers.de/Spracheinstellungen/ Sprachpakete] (Lokalisierung) | * Voraussetzung sind natürlich die jeweils separat zu installierenden [https://wiki.ubuntuusers.de/Spracheinstellungen/ Sprachpakete] (Lokalisierung) | ||
[[ | [[Category:Linux:Shell:Bash:Interaktiv]] |
Version vom 18. Mai 2022, 10:25 Uhr
Ausführung von Kommandos
- Wird eine Kommandozeile abgesetzt, werden deren Teile in Wörter (Token) aufgeteilt.
- Wörter die der Parser als Variablenzuweisung markiert hat (vor dem Kommandonamen) und Umleitungen werden für die spätere Referenzierung gespeichert.
- Wörter die keine Variablen oder Umleitungen sind, werden expandiert; das erste übrigbleibende Wort nach den Expansionen wird als Kommandoname benutzt und der Rest als Argumente dieses Kommandos.
- Dann werden die Umleitungen ausgeführt und die Zeichen die Variablen zugewiesen wurden expandiert; ist dies kein Kommandoname, haben die Variablen Auswirkung auf die aktuelle Shell-Umgebung.
- Ein wichtiger der Aufgaben der Shell ist die Suche nach Kommandos. Die Bash macht das wie folgt: * Prüfe, ob das Kommando einen Slash enthält. Wenn nicht prüfe, ob die Liste der Funktionen das gesuchte Kommando enthält.
- Ist das Kommando keine Funktion, suche in der Liste der eingebauten Befehle.
- Ist das Kommando weder eine Funktion noch ein eingebauter Befehl, suche danach durch Analyse der Verzeicnisse, die in der Variable PATH gelistet sind.Die Bash nutzt einen Hash-Tabelle im Arbeitsspeicher, um Pfadsuchen zu vermieden.
- Ist die Suche erfolglos wird eine Fehlermeldung und der Exit Status 127 ausgegeben.
- War die Suche erfolgreich oder falls das Kommando einen Slash enthält, führt die Shell das Kommando in einer separaten Ausführungsumgebung aus.
- Schlägt die Ausführung fehl weil die Datei nicht ausführbar und kein Verzeichnis ist, wird angenommen es handle sich um ein Shellscript.
- Wurde das Kommando nicht asynchron gestartet, wartet die Shell auf die Beendigung des Kommandos und sammelt den Exit Status.
Allgemein
- Die Bash bestimmt den Typ des Programms das ausgeführt werden soll. Normale Programme sind Systemkommandos die in kompilierter Form im System vorliegen.
- Wenn solch ein Programm ausgeführt wird, wird ein neuer Prozess erzeugt indem die Bash eine exakte Kopie von sich selbst erstellt.
- Dieser Kindprozess hat die gleiche Umgebung wie sein Elternprozess, nur die Prozess-ID ist eine andere. Diesen Vorgang nennt man forking und wird durch einen exec-Systemaufruf durchgeführt.
- Der fork-and-exec Mechanismus ersetzt das alte Kommando mit einem neuen, wobei die Umgebung in der das neue Kommando ausgeführt wird erhalten bleibt, einschließlich der konfigurierten Ein- und Ausgabegeräte, Umgebungsvariablen und Prioritäten.
- So werden alle UNIX-Prozesse erstellt, so auch bei Linux Betriebssystemen. Selbst der erste Prozess init mit der Prozess ID 1 wird während des Bootvorgangs im sogenannten bootstrapping als fork erstellt.
Shell Skripte
- Wenn eine Datei, die Shell-Befehle enthält, als erste non-option Argument der Bash beim Start (ohne -c oder -s) übergeben wird, erzeugt dies eine nicht-interaktive Shell.
- Diese Shell sucht nach der Skriptdatei im aktuellen Verzeichnis, danach in den Verzeichnissen der PATH-Variable.
Ausführung von Shell-Skripten
- Ist das Programm, das ausgeführt wird ein Shell-Skript, erstellt die Bash einen neuen Kind-Prozess mit fork.
- Diese Subshell liest das Shell-Skripts Zeile für Zeile.
- Die Kommandos jeder Zeile werden gelesen, interpretiert und ausgeführt, als würden sie direkt über die Tastatur eingegeben werden.
- Solange der Subshell jede Zeile des Skripts ausführt, wartet die Eltern-Shell bis Ihr Kind-Prozess beendet ist.
- Sind im Shell-Skript keine Zeilen mehr vorhanden, terminiert die Subshell, die Eltern-Shell erwacht und zeigt einen neuen Prompt.
- Eingebaute Shell-Befehle sind Befehle, die die Shell selber enthält.
- Wird der Name einen einbauten Kommandos als erstes Wort eines einfachen Kommandos benutzt führt die Shell dieses Kommando direkt aus ohne einen neuen Prozess zu erstellen.
- Eingebaute Befehle sind notwendig, um Funktionen zu implementieren, die nicht oder nur umständlich mit externen Werkzeugen umgesetzt werden können.
Typen eingebauter Befehle
Bourne Shell built-ins
:, ., break, cd, continue, eval, exec, exit, export, getopts, hash, pwd, readonly, return, set, shift, test, [, times, trap, umask, unset.
Bash built-ins
alias, bind, builtin, command, declare, echo, enable, help, let, local, logout, printf, read, shopt, type, typeset, ulimit, unalias.
Special built-ins
Wird die Bash im POSIX Modus ausgeführt, unterscheiden sich die special built-ins von den anderen eingebauten Kommandos in drei Punkten* Special built-ins werden bei der Kommandosuche vor Shell-Funktionen gefunden
- Eine nicht-interaktive Shell terminiert, wenn ein special built-in einen Fehler zurück gibt
- Dem Kommando vorausgehende Zuweisungen bleiben nach Beendigung des Kommandos in der Shell-Umgebung gültig
POSIX special built-ins sind
- , ., break, continue, eval, exec, exit, export, readonly, return, set, shift, trap, unset
Anwendungen in anderer Sprache starten
Nutzt man bspw. als Systemsprache Englisch und will ab und zu im Terminal ein Programm in Deutsch starten, dann geht dies folgendermaßen (hier am Beispiel von inkscape):
LANGUAGE=de inkscape
Statt de kann man auch jede andere Sprache nehmen
- , z.B. fr für Französisch.
- Voraussetzung sind natürlich die jeweils separat zu installierenden Sprachpakete (Lokalisierung)