Skript-Aufbau und -Aufruf: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(3 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
=Der Interpreter und der Aufruf von Shell-Skripten=
+
*[[Prinzip der Bash]]
 
+
*[[Aufruf eines Skripts]]
== Der Interpreter in der Windows-Welt ==
+
*[[Möglichkeiten ein Shellskript aufzurufen]]
 
 
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.
 
 
 
{| border=1 cellpadding="2"
 
|-
 
! 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 ==
 
 
 
{| border=1 cellpadding="2"
 
|-
 
! 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?*
 

Aktuelle Version vom 17. Oktober 2025, 13:56 Uhr