Skript-Aufbau und -Aufruf
Der Interpreter und der Aufruf von Shell-Skripten
Der Interpreter in der Windows-Welt
Unter Windows wird eine Datei anhand ihrer Endung einem Programm zugeordnet.
Das ist auch bei Skripten so – sie werden anhand ihrer Endung an einen bestimmten Interpreter übergeben.
| Endung | Interpreter |
|---|---|
| .pl | Perl |
| .py | Python |
| .bat | command.com |
| .cmd | cmd.exe |
Der Interpreter in der Linux-Welt
- Unter Unix/Linux entscheidet nicht die Dateiendung, welchem Interpreter ein Skript übergeben wird.*
- Dateiendungen sind optional und dienen in erster Linie der Organisation.*
- Der Dateityp – und damit der Interpreter – wird durch die ersten Bytes des Dateiinhalts bestimmt.*
- Beispiel
- echo "echo Hallo Welt" > skript
- file skript
skript: ASCII text
- Hier sehen wir, dass die Datei als normaler ASCII-Text erkannt wird.*
- Bei einem Programmaufruf wird sie der aktuellen Shell übergeben (es gibt außer der Bash noch andere Shells, z. B. Bourne-Shell (bsh), Korn-Shell (ksh), ash).*
- chmod +x skript
- ./skript
Hallo Welt
- Um sicherzugehen, dass das Skript der richtigen Shell übergeben wird, fügt man an den Skriptanfang eine sogenannte Shebang-Zeile hinzu (#!).*
- In unserem Fall also: #!/bin/bash für die Bourne-Again Shell.*
- Dadurch wird das Programm, welches hinter dem #! (Shebang/Gobang Operator) steht, als Interpreter für das Skript verwendet.*
#!/bin/bash date hostname pwd
- Selbst in einer anderen Shell (z. B. der C-Shell) ist somit sichergestellt, dass das Skript von der Bash interpretiert wird.*
- csh
- file skript
skript: Bourne-Again shell script text executable
Aufrufarten von Bash-Skripten
Ein Bash-Skript kann auf unterschiedliche Weise gestartet werden. Je nach Aufruf unterscheidet sich, ob eine neue Subshell gestartet wird, ob der Name des Skripts bekannt ist und ob Variablen erhalten bleiben.
bash skript (r)
- Starten einer Subshell
- Lesen der Skriptdatei von der Subshell
- Kommandos werden nacheinander abgearbeitet
- Beenden der Subshell und Rückkehr zur aufrufenden Shell
(Die Shell, die das Skript abarbeitet, kennt den Namen des Shellskriptes)
bash < skript (r)
- Starten einer Subshell
- Lesen der Skriptdatei von der Subshell über Umleitung
- Kommandos werden nacheinander abgearbeitet
- Beenden der Subshell und Rückkehr zur aufrufenden Shell
(Die Shell, die das Skript abarbeitet, kennt den Namen des Shellskriptes nicht)
./skript (rx)
- Starten einer Subshell
- Lesen der Skriptdatei von der Subshell
- Kommandos werden nacheinander abgearbeitet
- Beenden der Subshell und Rückkehr zur aufrufenden Shell
(Die Shell, die das Skript abarbeitet, kennt den Namen des Shellskriptes; es muss zusätzlich das Ausführungsrecht gesetzt sein.)
exec ./skript (rx)
- Die Subshell ersetzt die aktuelle Shell (überlädt die aktuelle Shell)
- Lesen der Skriptdatei
- Kommandos werden nacheinander abgearbeitet
- Beenden der Subshell; danach ist der Prozess der aufrufenden Shell beendet
source skript oder . skript (r)
- Lesen der Skriptdatei durch die aktuelle Shell
- Der interaktive Modus der aktuellen Shell wird „unterbrochen“
- Kommandos werden nacheinander abgearbeitet
(Es wird kein neuer Prozess gestartet; Variablen und Umgebungen bleiben in dieser Shell gültig.)
Vergleich der Aufrufarten
| Aufrufart | Startet neue Shell | Kennt $0 | Behält Variablen | Ausführungsrecht nötig |
|---|---|---|---|---|
| bash skript | ja | ja | nein | nein |
| bash < skript | ja | nein | nein | nein |
| ./skript | ja | ja | nein | ja |
| exec ./skript | nein (ersetzt aktuelle) | ja | nein | ja |
| source skript oder . skript | nein | ja | ja | nein |
Aufgaben
Aufgabe 1 – Skript erstellen
- Erstellen Sie ein einfaches Skript mit dem Namen skript, das folgende Befehle enthält:*
- date
- hostname
- echo $0
- echo $$
Aufgabe 2 – Verschiedene Aufrufarten testen
- Führen Sie das Skript nacheinander auf die folgenden Arten aus:*
- bash skript
- bash < skript
- ./skript
- exec ./skript
- source skript bzw. . skript
- Beobachten und notieren Sie, welche Unterschiede Sie feststellen.*
Aufgabe 3 – Auswertung
- Beantworten Sie die folgenden Fragen:*
- Welche Varianten starten eine neue Subshell?
- Bei welchen Varianten bleibt die aktuelle Shell erhalten?
- Bei welchen Aufrufen kennt die Shell den Namen des Skripts ($0)?
- Bei welchen bleibt die Prozess-ID ($$) gleich?
Zusatzaufgaben
- Reichen Sie die Befehle ls, ip a und id in einem Skript aneinander und führen Sie es aus.*
- Wie bestimmt man, welcher Shell das Skript übergeben wird?*
- Welche Möglichkeiten gibt es, ein Skript aufzurufen, und wie unterscheiden sie sich?*