Linux/Shells und Shell-Skripte: Unterschied zwischen den Versionen

Aus Foxwiki
TomUlbrich (Diskussion | Beiträge)
Keine Bearbeitungszusammenfassung
TomUlbrich (Diskussion | Beiträge)
Keine Bearbeitungszusammenfassung
Zeile 20: Zeile 20:
In diesem Beispiel werden die Variablen a und b mit den Werten 5 und 6 gefüllt. Die dritte Zeile sorgt dafür, dass der Variablen c das Ergebnis der Summe aus $a und $b übergeben wird. Die letzte Zeile gibt die komplette Operation aus.
In diesem Beispiel werden die Variablen a und b mit den Werten 5 und 6 gefüllt. Die dritte Zeile sorgt dafür, dass der Variablen c das Ergebnis der Summe aus $a und $b übergeben wird. Die letzte Zeile gibt die komplette Operation aus.
Die Inhalte einer Variablen bleiben innerhalb einer Shell erhalten. Sie können also die Variable wiederholt abrufen oder verwenden:
Die Inhalte einer Variablen bleiben innerhalb einer Shell erhalten. Sie können also die Variable wiederholt abrufen oder verwenden:
  archangel:~ # echo $c
  archangel:~ # echo $c
  11
  11
====Variablen exportieren====
====Variablen exportieren====
Wird eine Subshell aufgerufen, so steht diese Variable nicht mehr zur Verfügung, weil es sich nicht um eine Umgebungsvariable handelt. Es ist aber möglich, eine Variable für eine Subshell verfügbar zu machen, indem man diese exportiert. Ein solcher Export erfolgt nur an untergeordnete, jedoch nie an übergeordnete Shells. Ein Export bewirkt nämlich nicht, dass aus einer Shellvariable eine Umgebungsvariable wird. Der Exportbefehl kann auf zwei Arten durchgeführt werden:
Wird eine Subshell aufgerufen, so steht diese Variable nicht mehr zur Verfügung, weil es sich nicht um eine Umgebungsvariable handelt. Es ist aber möglich, eine Variable für eine Subshell verfügbar zu machen, indem man diese exportiert. Ein solcher Export erfolgt nur an untergeordnete, jedoch nie an übergeordnete Shells. Ein Export bewirkt nämlich nicht, dass aus einer Shellvariable eine Umgebungsvariable wird. Der Exportbefehl kann auf zwei Arten durchgeführt werden:
  archangel:~ # export c
  archangel:~ # export c
  archangel:~ # sh
  archangel:~ # sh
  sh-3.00# echo $c
  sh-3.00# echo $c
  11
  11
In der gerade dargestellten ersten Variante wurde die Variable c aus dem vorangegangenen Beispiel exportiert. Anschließend wurde mit sh eine neue Subshell geöffnet und dann mit echo $c die Variable auf dem Bildschirm ausgegeben. Die zweite Methode sieht folgendermaßen aus:
In der gerade dargestellten ersten Variante wurde die Variable c aus dem vorangegangenen Beispiel exportiert. Anschließend wurde mit sh eine neue Subshell geöffnet und dann mit echo $c die Variable auf dem Bildschirm ausgegeben. Die zweite Methode sieht folgendermaßen aus:
  archangel:~ # export z=1000
  archangel:~ # export z=1000
  archangel:~ # sh
  archangel:~ # sh
  sh-3.00# echo $z
  sh-3.00# echo $z
  1000
  1000
====Variablen einsehen====
====Variablen einsehen====
Diesmal ist die Deklaration der Variablen und der Export mit nur einem einzigen Befehl durchgeführt worden. Mit echo $z wird wieder demonstriert, dass der Inhalt der Variablen in der Ziel-Shell angekommen ist. Mit dem Befehl set können Sie ohne Angabe von Parametern nachsehen, welche Umgebungs- und Shellvariablen Ihre aktuelle Shell gerade verwendet. Am besten geben Sie die Ausgabe an less weiter, damit Sie den Inhalt in Ruhe untersuchen können. Eine gekürzte Ausgabe könnte Folgendes enthalten:
Diesmal ist die Deklaration der Variablen und der Export mit nur einem einzigen Befehl durchgeführt worden. Mit echo $z wird wieder demonstriert, dass der Inhalt der Variablen in der Ziel-Shell angekommen ist. Mit dem Befehl set können Sie ohne Angabe von Parametern nachsehen, welche Umgebungs- und Shellvariablen Ihre aktuelle Shell gerade verwendet. Am besten geben Sie die Ausgabe an less weiter, damit Sie den Inhalt in Ruhe untersuchen können. Eine gekürzte Ausgabe könnte Folgendes enthalten:
  archangel:~ # set | less
  archangel:~ # set | less
  a=5
  a=5
Zeile 54: Zeile 47:
  PATH=/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/usr/
  PATH=/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/usr/
  X11R
  X11R
Die Umgebungsvariablen können mit dem Kommando env eingesehen werden. Es ist ratsam, die Ausgabe mit less zu betrachten.
Die Umgebungsvariablen können mit dem Kommando env eingesehen werden. Es ist ratsam, die Ausgabe mit less zu betrachten.
====Variablen löschen====
====Variablen löschen====
Variablen werden mit dem Befehl unset gelöscht. Um die Variablen aus den Beispielen weiter oben zu entfernen, geben Sie Folgendes ein:
Variablen werden mit dem Befehl unset gelöscht. Um die Variablen aus den Beispielen weiter oben zu entfernen, geben Sie Folgendes ein:
  archangel:~ # unset a
  archangel:~ # unset a
  archangel:~ # unset b
  archangel:~ # unset b
Zeile 68: Zeile 58:
  HISTSIZE=1000
  HISTSIZE=1000
  ...
  ...
Die Variablen a, b und c wurden gelöscht. Alternativ wäre auch eine Neuanmeldung möglich gewesen, denn es handelt sich um Shellvariablen, die bei einer Abmeldung nicht erhalten bleiben.
Die Variablen a, b und c wurden gelöscht. Alternativ wäre auch eine Neuanmeldung möglich gewesen, denn es handelt sich um Shellvariablen, die bei einer Abmeldung nicht erhalten bleiben.
==Aliase und Funktionen==
==Aliase und Funktionen==
Wenn Sie Befehle in Kombination mit bestimmten Parametern immer wieder verwenden, ist es empfehlenswert, einen Alias zu definieren. Das ist auch hilfreich, wenn ein Befehl in sich sehr lang ist. Ein Beispiel: Wenn man oft Tarballs aus dem Internet herunterladen und entpacken muss, benötigt man immer wieder das Kommando tar -xvzf <archivname.tgz>. Es wäre doch viel einfacher, nur ein einziges oder zumindest wenige Zeichen hierfür zu verwenden. Es lohnt sich also, einen Alias anzulegen: archangel:~ # alias tx="tar -xvzf". Jetzt kann ein Tarball einfach mit dem Kommando tx <archivname.tgz> extrahiert
Wenn Sie Befehle in Kombination mit bestimmten Parametern immer wieder verwenden, ist es empfehlenswert, einen Alias zu definieren. Das ist auch hilfreich, wenn ein Befehl in sich sehr lang ist. Ein Beispiel: Wenn man oft Tarballs aus dem Internet herunterladen und entpacken muss, benötigt man immer wieder das Kommando tar -xvzf <archivname.tgz>. Es wäre doch viel einfacher, nur ein einziges oder zumindest wenige Zeichen hierfür zu verwenden. Es lohnt sich also, einen Alias anzulegen: archangel:~ # alias tx="tar -xvzf". Jetzt kann ein Tarball einfach mit dem Kommando tx <archivname.tgz> extrahiert
Zeile 89: Zeile 77:
  tmpfs            387088      0    387088    0% /run/user/113
  tmpfs            387088      0    387088    0% /run/user/113
  tmpfs            387088      12    387076    1% /run/user/1000
  tmpfs            387088      12    387076    1% /run/user/1000
Auf diese Art wird mit einem einzigen Befehl die Festplatten- und Speicherbelegung überprüft. Die Definition der Aliase geht bei einer Neuanmeldung am System verloren
Auf diese Art wird mit einem einzigen Befehl die Festplatten- und Speicherbelegung überprüft. Die Definition der Aliase geht bei einer Neuanmeldung am System verloren
Funktionen Eine der unangenehmsten Einschränkungen, die ein Alias mit sich bringt, ist die Tatsache, dass Übergabewerte ($1, $2 usw.) nur einmal ausgewertet werden können. Bei einer Funktion gibt es diese Einschränkung nicht. Der Begriff Funktion entstammt der Programmierung, und eigentlich handelt es sich um ein Unterprogramm, das man für wiederkehrende Aufgaben verwenden kann. Eine Funktion in einer Shell kann sowohl von einem Benutzer als auch von einem Skript aufgerufen werden. Der Aufbau einer Funktion sieht immer so aus:
Funktionen Eine der unangenehmsten Einschränkungen, die ein Alias mit sich bringt, ist die Tatsache, dass Übergabewerte ($1, $2 usw.) nur einmal ausgewertet werden können. Bei einer Funktion gibt es diese Einschränkung nicht. Der Begriff Funktion entstammt der Programmierung, und eigentlich handelt es sich um ein Unterprogramm, das man für wiederkehrende Aufgaben verwenden kann. Eine Funktion in einer Shell kann sowohl von einem Benutzer als auch von einem Skript aufgerufen werden. Der Aufbau einer Funktion sieht immer so aus:
  function Funktionsname()  
  function Funktionsname()  
  {  
  {  
Zeile 101: Zeile 86:
  Befehl n  
  Befehl n  
  }
  }
Der Befehl function kann auch einfach weggelassen werden, weil die Bash an den beiden Klammern erkennt, dass es sich um eine Funktion handelt. Wenn Sie den Befehl function dennoch verwenden, können Sie alternativ die Klammern direkt hinter dem Namen der Funktion weglassen. Es soll hier aber im Folgenden die korrekte Syntax angewendet werden. Das Beispiel demonstriert, dass es mit einer Funktion sogar möglich ist, Rechenoperationen auszuführen:
Der Befehl function kann auch einfach weggelassen werden, weil die Bash an den beiden Klammern erkennt, dass es sich um eine Funktion handelt. Wenn Sie den Befehl function dennoch verwenden, können Sie alternativ die Klammern direkt hinter dem Namen der Funktion weglassen. Es soll hier aber im Folgenden die korrekte Syntax angewendet werden. Das Beispiel demonstriert, dass es mit einer Funktion sogar möglich ist, Rechenoperationen auszuführen:
  archangel:/ # function addiere ()  
  archangel:/ # function addiere ()  
  > {  
  > {  
Zeile 111: Zeile 94:
  archangel:/ # addiere 3 4  
  archangel:/ # addiere 3 4  
  Die Summe ist 7
  Die Summe ist 7
Es wurde eine Funktion namens addiere erstellt. Die geschweiften Klammern sorgen dafür, dass diese mehrzeilige Anweisung als ein einziger Befehl interpretiert wird. Die Zeile let summe=$1+$2 sorgt dafür, dass der Variablen summe die Summe aus den beiden Übergabevariablen $1 und $2 übergeben wird. In der nächsten Zeile erfolgt die Ausgabe. Es ist auch möglich, eine Funktion in einer einzigen Zeile zu erstellen:
Es wurde eine Funktion namens addiere erstellt. Die geschweiften Klammern sorgen dafür, dass diese mehrzeilige Anweisung als ein einziger Befehl interpretiert wird. Die Zeile let summe=$1+$2 sorgt dafür, dass der Variablen summe die Summe aus den beiden Übergabevariablen $1 und $2 übergeben wird. In der nächsten Zeile erfolgt die Ausgabe. Es ist auch möglich, eine Funktion in einer einzigen Zeile zu erstellen:
  archangel:/ # function addiere { let summe=$1+$2; echo "Die Summe ist $summe"; }
  archangel:/ # function addiere { let summe=$1+$2; echo "Die Summe ist $summe"; }
Diese Methode wird jedoch von den meisten Benutzern als unübersichtlich empfunden. Die beiden Leerzeichen innerhalb der geschweiften Klammern sind übrigens notwendig und dienen nicht nur der Übersichtlichkeit. Es gibt eine alternative Syntax, um eine Funktion zu erstellen. Die folgende Kommandozeile hat dasselbe Ergebnis zur Folge wie die vorangegangene:
Diese Methode wird jedoch von den meisten Benutzern als unübersichtlich empfunden. Die beiden Leerzeichen innerhalb der geschweiften Klammern sind übrigens notwendig und dienen nicht nur der Übersichtlichkeit. Es gibt eine alternative Syntax, um eine Funktion zu erstellen. Die folgende Kommandozeile hat dasselbe Ergebnis zur Folge wie die vorangegangene:
  archangel:/ # addiere () { let summe=$1+$2; echo "Die Summe ist $summe"; }
  archangel:/ # addiere () { let summe=$1+$2; echo "Die Summe ist $summe"; }
Da hier das Schlüsselwort function noch nicht einmal auftaucht, ist für einen Einsteiger kaum noch zu erkennen, um was es sich hier eigentlich handelt. Der folgende Befehl enthält eine so genannte forkbomb, die auf einer Funktion basiert. Versuchen Sie doch einmal zu verstehen, wie diese funktioniert. Sie wird übrigens Ihren Computer zum Absturz bringen, wenn Sie den Befehl abtippen.
Da hier das Schlüsselwort function noch nicht einmal auftaucht, ist für einen Einsteiger kaum noch zu erkennen, um was es sich hier eigentlich handelt. Der folgende Befehl enthält eine so genannte forkbomb, die auf einer Funktion basiert. Versuchen Sie doch einmal zu verstehen, wie diese funktioniert. Sie wird übrigens Ihren Computer zum Absturz bringen, wenn Sie den Befehl abtippen.
  archangel:/ # :(){ :|:& };:
  archangel:/ # :(){ :|:& };:
===builtin===
===builtin===
Vor der Vergabe der Bezeichnung für Ihre Funktionen und Aliase überprüfen, ob es nicht schon ein Kommando mit diesem Namen gibt. Wenn Sie dennoch eine Funktion oder einen Alias erstellen müssen, der bzw. die namentlich mit einem existierenden Kommando übereinstimmt, müssten Sie ansonsten zum Aufruf des ursprünglichen Kommandos den kompletten Pfad zu diesem Kommando angeben. Bei einer Übereinstimmung des Namens mit einem Shellinternen Befehl verwenden Sie vorab das Kommando builtin. Wenn Sie z. B. für den echo-Befehl standardmäßig die Maskierung durch die Verwendung eines Backslashs aktivieren wollen, können Sie diesen Alias einrichten: archangel:/ # alias echo='echo -e' Benötigen Sie echo dann ausnahmsweise doch im Originalzustand, erfolgt der Aufruf durch: archangel:/ # builtin echo
Vor der Vergabe der Bezeichnung für Ihre Funktionen und Aliase überprüfen, ob es nicht schon ein Kommando mit diesem Namen gibt. Wenn Sie dennoch eine Funktion oder einen Alias erstellen müssen, der bzw. die namentlich mit einem existierenden Kommando übereinstimmt, müssten Sie ansonsten zum Aufruf des ursprünglichen Kommandos den kompletten Pfad zu diesem Kommando angeben. Bei einer Übereinstimmung des Namens mit einem Shellinternen Befehl verwenden Sie vorab das Kommando builtin. Wenn Sie z. B. für den echo-Befehl standardmäßig die Maskierung durch die Verwendung eines Backslashs aktivieren wollen, können Sie diesen Alias einrichten: archangel:/ # alias echo='echo -e' Benötigen Sie echo dann ausnahmsweise doch im Originalzustand, erfolgt der Aufruf durch: archangel:/ # builtin echo
===Konfigurationsdateien der Bash===  
===Konfigurationsdateien der Bash===  
In den unterschiedlichen Linux-Distributionen kann es zu unterschiedlichen Konstrukten der Konfigurationsdateien kommen. Konfigurationsdateien, die für alle Anwender Gültigkeit haben, befinden sich im Verzeichnis /etc und beginnen niemals mit einem Punkt. Die individuellen Konfigurationsdateien für den jeweiligen User befinden sich im entsprechenden Heimatverzeichnis und beginnen immer mit einem Punkt. Eine Datei /etc/.bashrc kommt als Konfigurationsdatei genauso wenig in Frage wie eine Datei mit der Bezeichnung /home/udo/profiles.
In den unterschiedlichen Linux-Distributionen kann es zu unterschiedlichen Konstrukten der Konfigurationsdateien kommen. Konfigurationsdateien, die für alle Anwender Gültigkeit haben, befinden sich im Verzeichnis /etc und beginnen niemals mit einem Punkt. Die individuellen Konfigurationsdateien für den jeweiligen User befinden sich im entsprechenden Heimatverzeichnis und beginnen immer mit einem Punkt. Eine Datei /etc/.bashrc kommt als Konfigurationsdatei genauso wenig in Frage wie eine Datei mit der Bezeichnung /home/udo/profiles.
===Systemweite Konfigurationsdateien===
===Systemweite Konfigurationsdateien===
Die systemweiten Konfigurationsdateien sind für jeden Benutzer gültig, der sich am System anmeldet. Die beiden gängigsten sind folgende:  
Die systemweiten Konfigurationsdateien sind für jeden Benutzer gültig, der sich am System anmeldet. Die beiden gängigsten sind folgende:  
* /etc/profile ist die erste Konfigurationsdatei, die bei der Anmeldung (Login- Shell) eines Benutzers eingelesen wird. Sie enthält erste Umgebungsvariablen und die erste PATH-Anweisung. Änderungen in dieser Datei erfordern eine neue Anmeldung des Benutzers.  
* /etc/profile ist die erste Konfigurationsdatei, die bei der Anmeldung (Login- Shell) eines Benutzers eingelesen wird. Sie enthält erste Umgebungsvariablen und die erste PATH-Anweisung. Änderungen in dieser Datei erfordern eine neue Anmeldung des Benutzers.  
* /etc/bash.bashrc enthält systemweite Einstellungen, Aliase und Funktionen. Diese Datei wird beim Start jeder Shell neu eingelesen und erfordert deshalb nach Änderung keine Neuanmeldung des Benutzers.
* /etc/bash.bashrc enthält systemweite Einstellungen, Aliase und Funktionen. Diese Datei wird beim Start jeder Shell neu eingelesen und erfordert deshalb nach Änderung keine Neuanmeldung des Benutzers.
===Konfigurationsdateien für den Benutzer===
===Konfigurationsdateien für den Benutzer===
Die folgenden Dateien befinden sich im Heimatverzeichnis eines jeden Benutzers und dürfen auch durch seinen Besitzer modifiziert werden. Damit weniger versierte Benutzer nicht durch diese Dateien irritiert werden, sind diese mit einem Punkt vor einer Auflistung mit Dateibrowsern geschützt worden. Die folgende Auflistung entspricht auch der Ausführungsreihenfolge (vorausgesetzt, die Dateien sind in der jeweiligen Distribution überhaupt vorhanden).  
Die folgenden Dateien befinden sich im Heimatverzeichnis eines jeden Benutzers und dürfen auch durch seinen Besitzer modifiziert werden. Damit weniger versierte Benutzer nicht durch diese Dateien irritiert werden, sind diese mit einem Punkt vor einer Auflistung mit Dateibrowsern geschützt worden. Die folgende Auflistung entspricht auch der Ausführungsreihenfolge (vorausgesetzt, die Dateien sind in der jeweiligen Distribution überhaupt vorhanden).  
* ~/.bash_profile wird (falls vorhanden) nur bei einer Neuanmeldung eingelesen und sofort nach /etc/profile ausgeführt. Sie beinhaltet zusätzliche Pfadanweisungen (z. B. das Heimatverzeichnis), den zu verwendenden Standardeditor und benutzerspezifische Umgebungsvariablen.  
* ~/.bash_profile wird (falls vorhanden) nur bei einer Neuanmeldung eingelesen und sofort nach /etc/profile ausgeführt. Sie beinhaltet zusätzliche Pfadanweisungen (z. B. das Heimatverzeichnis), den zu verwendenden Standardeditor und benutzerspezifische Umgebungsvariablen.  
* ~/.bash_login ist eine Alternative zu .bash_profile und wird auch nur dann abgearbeitet, wenn die Datei .bash_profile nicht existiert. Auch diese Datei wird nur während der Anmeldung verwendet. Der Inhalt und der Verwendungszweck entsprechen der .bash_profile.  
* ~/.bash_login ist eine Alternative zu .bash_profile und wird auch nur dann abgearbeitet, wenn die Datei .bash_profile nicht existiert. Auch diese Datei wird nur während der Anmeldung verwendet. Der Inhalt und der Verwendungszweck entsprechen der .bash_profile.  
Zeile 147: Zeile 115:
* ~/.bashrc ist die andere, ursprüngliche Konfigurationsdatei der Bash. Sie wird in jedem Fall eingelesen, und zwar auch beim Aufruf einer neuen Shell. Nach Änderungen in dieser Datei ist entsprechend keine Neuanmeldung des Benutzers erforderlich. Sie beinhaltet im Wesentlichen Aliase und Funktionen.  
* ~/.bashrc ist die andere, ursprüngliche Konfigurationsdatei der Bash. Sie wird in jedem Fall eingelesen, und zwar auch beim Aufruf einer neuen Shell. Nach Änderungen in dieser Datei ist entsprechend keine Neuanmeldung des Benutzers erforderlich. Sie beinhaltet im Wesentlichen Aliase und Funktionen.  
* ~/.bash_logout ist eine optionale Datei, die ausgeführt wird, wenn der Benutzer sich abmeldet. Sie könnte zum Beispiel den Monitor löschen.
* ~/.bash_logout ist eine optionale Datei, die ausgeführt wird, wenn der Benutzer sich abmeldet. Sie könnte zum Beispiel den Monitor löschen.
===Konfiguration on the fly einlesen===
===Konfiguration on the fly einlesen===
Haben Sie in einer der Konfigurationsdateien z. B. neue Variablen deklariert, können Sie diese sofort wirksam werden lassen, indem Sie das Shell-interne Kommando source verwenden. Beispiel: root@archangel:~# source /etc/profile Wenn Sie Ihre Tastatur schonen wollen, lässt sich das Kommando source auf einen Punkt verkürzen: root@archangel:~# . /etc/profile
Haben Sie in einer der Konfigurationsdateien z. B. neue Variablen deklariert, können Sie diese sofort wirksam werden lassen, indem Sie das Shell-interne Kommando source verwenden. Beispiel: root@archangel:~# source /etc/profile Wenn Sie Ihre Tastatur schonen wollen, lässt sich das Kommando source auf einen Punkt verkürzen: root@archangel:~# . /etc/profile
===Das Skeleton-Verzeichnis /etc/skel===  
===Das Skeleton-Verzeichnis /etc/skel===  
Das Skeleton-Verzeichnis kann als eine Vorlage für das Heimatverzeichnis eines neuen Benutzers betrachtet werden. Beim Erstellen eines neuen Benutzerkontos mit useradd -m willi wird, die richtigen Standardeinstellungen vorausgesetzt, ein Verzeichnis namens /home/willi erstellt. Der Inhalt des Skeleton-Verzeichnisses wird dann in das Verzeichnis /home/willi kopiert. Abschließend werden die Berechtigungen für das Verzeichnis und dessen Inhalt auf den neuen Benutzer abgestimmt. Der Speicherort für Skeleton ist normalerweise /etc/skel. Auch hier kann es zu Unterschieden in den Distributionen kommen.  
Das Skeleton-Verzeichnis kann als eine Vorlage für das Heimatverzeichnis eines neuen Benutzers betrachtet werden. Beim Erstellen eines neuen Benutzerkontos mit useradd -m willi wird, die richtigen Standardeinstellungen vorausgesetzt, ein Verzeichnis namens /home/willi erstellt. Der Inhalt des Skeleton-Verzeichnisses wird dann in das Verzeichnis /home/willi kopiert. Abschließend werden die Berechtigungen für das Verzeichnis und dessen Inhalt auf den neuen Benutzer abgestimmt. Der Speicherort für Skeleton ist normalerweise /etc/skel. Auch hier kann es zu Unterschieden in den Distributionen kommen.  

Version vom 16. Juli 2019, 13:04 Uhr

Die Shell-Umgebung anpassen und verwenden

Was ist eine Shell

Eine Shell ist ein textbasiertes Programm, dass als Schnittstelle zwischen Benutzer und Computer fungiert. Der Benutzer kann durch die Shell mit dem Kernel kommunizieren. Da der englische Begriff Kernel zu Deutsch Kern heißt und eine Shell eine Schale ist, wird wohl sehr schnell klar, wie diese beiden Fachbegriffe entstanden sind und wo eine solche Shell im System-Gefüge angesiedelt ist. Eine weitere Aufgabe von Shells ist es, als Umgebung für die Ausführung von Skripten und Programmen zu dienen. Außerdem verstehen Shells unterschiedliche Befehle, so dass man sie im weitesten Sinne auch noch als Programmierumgebung betrachten kann. Die am weitesten verbreitete Shell ist die "bash" (Bourne Again Shell). Dieser Begriff ist ein Wortspiel: Zum einen handelt es sich, phonetisch betrachtet, um eine wiedergeborene Shell (born again shell), zum anderen ist sie schon wieder (again) eine Bourne-Shell. Sie ist nämlich vollständig abwärtskompatibel zu "sh", die Stephen Bourne bereits 1977 programmierte. "sh" ist der Vorfahre der heute weit verbreiteten Bash.

Umgebungsvariablen und Shellvariablen

Die Inhalte von Variablen sorgen dafür, dass laufende Programme und Skripte sich selbst mit kleinen Informationen versorgen können, ohne dass der Benutzer diese jedes Mal explizit angeben muss. Hierbei wird unterschieden zwischen Umgebungsvariablen und Shellvariablen. Die Unterschiede zwischen diesen beiden Variablentypen liegen einerseits darin, durch welche Konfigurationsdateien sie deklariert werden und demzufolge, wann sie durch welches Programm ausgewertet werden. Andererseits unterscheiden sie sich in ihrem Wirkungsbereich:

Umgebungsvariablen

Umgebungsvariablen gelten für alle Shells, die ein Benutzer verwendet. Die Inhalte dieser Variablen werden außerdem vererbt. Das bedeutet, dass beim Aufruf einer Subshell (egal, ob durch ein Skript oder den Benutzer) ein automatischer Export der Variablen in diese Subshell stattfindet. Bei Umgebungsvariablen werden normalerweise Großbuchstaben verwendet. Das hat keinen technischen Hintergrund, sondern dient lediglich der Übersichtlichkeit und Auffindbarkeit für den Benutzer.

Shellvariablen

Shellvariablen müssen in jeder Shell, die durch den Benutzer oder ein Skript gestartet wird, neu deklariert werden. Es findet standardmäßig keine Vererbung statt. Gemäß Konvention werden Shellvariablen kleingeschrieben.

Variablen

Beachten Sie, dass die Bash zwischen Groß- und Kleinschreibweise unterscheidet. Die Konventionen bezüglich der Schreibweisen bei Umgebungs- oder Shellvariablen werden von einigen Distributionen nicht eingehalten.

Variablen deklarieren

Die Deklaration und Abfrage einer Shellvariable erfolgt recht einfach:

archangel:~ # a=5
archangel:~ # b=6
archangel:~ # let c=$a+$b
archangel:~ # echo $c=$a+$b
11=5+6

In diesem Beispiel werden die Variablen a und b mit den Werten 5 und 6 gefüllt. Die dritte Zeile sorgt dafür, dass der Variablen c das Ergebnis der Summe aus $a und $b übergeben wird. Die letzte Zeile gibt die komplette Operation aus. Die Inhalte einer Variablen bleiben innerhalb einer Shell erhalten. Sie können also die Variable wiederholt abrufen oder verwenden:

archangel:~ # echo $c
11

Variablen exportieren

Wird eine Subshell aufgerufen, so steht diese Variable nicht mehr zur Verfügung, weil es sich nicht um eine Umgebungsvariable handelt. Es ist aber möglich, eine Variable für eine Subshell verfügbar zu machen, indem man diese exportiert. Ein solcher Export erfolgt nur an untergeordnete, jedoch nie an übergeordnete Shells. Ein Export bewirkt nämlich nicht, dass aus einer Shellvariable eine Umgebungsvariable wird. Der Exportbefehl kann auf zwei Arten durchgeführt werden:

archangel:~ # export c
archangel:~ # sh
sh-3.00# echo $c
11

In der gerade dargestellten ersten Variante wurde die Variable c aus dem vorangegangenen Beispiel exportiert. Anschließend wurde mit sh eine neue Subshell geöffnet und dann mit echo $c die Variable auf dem Bildschirm ausgegeben. Die zweite Methode sieht folgendermaßen aus:

archangel:~ # export z=1000
archangel:~ # sh
sh-3.00# echo $z
1000

Variablen einsehen

Diesmal ist die Deklaration der Variablen und der Export mit nur einem einzigen Befehl durchgeführt worden. Mit echo $z wird wieder demonstriert, dass der Inhalt der Variablen in der Ziel-Shell angekommen ist. Mit dem Befehl set können Sie ohne Angabe von Parametern nachsehen, welche Umgebungs- und Shellvariablen Ihre aktuelle Shell gerade verwendet. Am besten geben Sie die Ausgabe an less weiter, damit Sie den Inhalt in Ruhe untersuchen können. Eine gekürzte Ausgabe könnte Folgendes enthalten:

archangel:~ # set | less
a=5
b=6
BASH=/bin/bash
c=11
HISTSIZE=1000
HOME=/root
HOSTNAME=archangel
MANPATH=/usr/share/man:/usr/local/man:/usr/X11R6/man:/opt/gnome/share/man
PAGER=less
PATH=/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/usr/
X11R

Die Umgebungsvariablen können mit dem Kommando env eingesehen werden. Es ist ratsam, die Ausgabe mit less zu betrachten.

Variablen löschen

Variablen werden mit dem Befehl unset gelöscht. Um die Variablen aus den Beispielen weiter oben zu entfernen, geben Sie Folgendes ein:

archangel:~ # unset a
archangel:~ # unset b
archangel:~ # unset c
Zur Überprüfung:
archangel:~ # set | less
BASH=/bin/bash
HISTSIZE=1000
...

Die Variablen a, b und c wurden gelöscht. Alternativ wäre auch eine Neuanmeldung möglich gewesen, denn es handelt sich um Shellvariablen, die bei einer Abmeldung nicht erhalten bleiben.

Aliase und Funktionen

Wenn Sie Befehle in Kombination mit bestimmten Parametern immer wieder verwenden, ist es empfehlenswert, einen Alias zu definieren. Das ist auch hilfreich, wenn ein Befehl in sich sehr lang ist. Ein Beispiel: Wenn man oft Tarballs aus dem Internet herunterladen und entpacken muss, benötigt man immer wieder das Kommando tar -xvzf <archivname.tgz>. Es wäre doch viel einfacher, nur ein einziges oder zumindest wenige Zeichen hierfür zu verwenden. Es lohnt sich also, einen Alias anzulegen: archangel:~ # alias tx="tar -xvzf". Jetzt kann ein Tarball einfach mit dem Kommando tx <archivname.tgz> extrahiert und ausgepackt werden. Es ist auch möglich, mehrere Kommandos in einem einzigen Alias zu kombinieren. In einem solchen Fall müssen diese Kommandos durch Semikolons voneinander getrennt werden. Hier ein Beispiel:

user@tom:~$ alias frei="free; df"
user@tom:~$ frei
              total        used        free      shared  buff/cache   available
Mem:        3870884     1001952     1608764      124880     1260168     2512240
Swap:       7811068           0     7811068
Dateisystem    1K-Blöcke Benutzt Verfügbar Verw% Eingehängt auf
udev             1924160       0   1924160    0% /dev
tmpfs             387092    5896    381196    2% /run
/dev/sda2       38186548 7072220  29144820   20% /
tmpfs            1935440   11096   1924344    1% /dev/shm
tmpfs               5120       4      5116    1% /run/lock
tmpfs            1935440       0   1935440    0% /sys/fs/cgroup
tmpfs             387088       0    387088    0% /run/user/113
tmpfs             387088      12    387076    1% /run/user/1000

Auf diese Art wird mit einem einzigen Befehl die Festplatten- und Speicherbelegung überprüft. Die Definition der Aliase geht bei einer Neuanmeldung am System verloren Funktionen Eine der unangenehmsten Einschränkungen, die ein Alias mit sich bringt, ist die Tatsache, dass Übergabewerte ($1, $2 usw.) nur einmal ausgewertet werden können. Bei einer Funktion gibt es diese Einschränkung nicht. Der Begriff Funktion entstammt der Programmierung, und eigentlich handelt es sich um ein Unterprogramm, das man für wiederkehrende Aufgaben verwenden kann. Eine Funktion in einer Shell kann sowohl von einem Benutzer als auch von einem Skript aufgerufen werden. Der Aufbau einer Funktion sieht immer so aus:

function Funktionsname() 
{ 
Befehl 1 
Befehl 2 
... 
Befehl n 
}

Der Befehl function kann auch einfach weggelassen werden, weil die Bash an den beiden Klammern erkennt, dass es sich um eine Funktion handelt. Wenn Sie den Befehl function dennoch verwenden, können Sie alternativ die Klammern direkt hinter dem Namen der Funktion weglassen. Es soll hier aber im Folgenden die korrekte Syntax angewendet werden. Das Beispiel demonstriert, dass es mit einer Funktion sogar möglich ist, Rechenoperationen auszuführen:

archangel:/ # function addiere () 
> { 
> let summe=$1+$2 
> echo -e "Die Summe ist $summe" 
> } 
archangel:/ # addiere 3 4 
Die Summe ist 7

Es wurde eine Funktion namens addiere erstellt. Die geschweiften Klammern sorgen dafür, dass diese mehrzeilige Anweisung als ein einziger Befehl interpretiert wird. Die Zeile let summe=$1+$2 sorgt dafür, dass der Variablen summe die Summe aus den beiden Übergabevariablen $1 und $2 übergeben wird. In der nächsten Zeile erfolgt die Ausgabe. Es ist auch möglich, eine Funktion in einer einzigen Zeile zu erstellen:

archangel:/ # function addiere { let summe=$1+$2; echo "Die Summe ist $summe"; }

Diese Methode wird jedoch von den meisten Benutzern als unübersichtlich empfunden. Die beiden Leerzeichen innerhalb der geschweiften Klammern sind übrigens notwendig und dienen nicht nur der Übersichtlichkeit. Es gibt eine alternative Syntax, um eine Funktion zu erstellen. Die folgende Kommandozeile hat dasselbe Ergebnis zur Folge wie die vorangegangene:

archangel:/ # addiere () { let summe=$1+$2; echo "Die Summe ist $summe"; }

Da hier das Schlüsselwort function noch nicht einmal auftaucht, ist für einen Einsteiger kaum noch zu erkennen, um was es sich hier eigentlich handelt. Der folgende Befehl enthält eine so genannte forkbomb, die auf einer Funktion basiert. Versuchen Sie doch einmal zu verstehen, wie diese funktioniert. Sie wird übrigens Ihren Computer zum Absturz bringen, wenn Sie den Befehl abtippen.

archangel:/ # :(){ :|:& };:

builtin

Vor der Vergabe der Bezeichnung für Ihre Funktionen und Aliase überprüfen, ob es nicht schon ein Kommando mit diesem Namen gibt. Wenn Sie dennoch eine Funktion oder einen Alias erstellen müssen, der bzw. die namentlich mit einem existierenden Kommando übereinstimmt, müssten Sie ansonsten zum Aufruf des ursprünglichen Kommandos den kompletten Pfad zu diesem Kommando angeben. Bei einer Übereinstimmung des Namens mit einem Shellinternen Befehl verwenden Sie vorab das Kommando builtin. Wenn Sie z. B. für den echo-Befehl standardmäßig die Maskierung durch die Verwendung eines Backslashs aktivieren wollen, können Sie diesen Alias einrichten: archangel:/ # alias echo='echo -e' Benötigen Sie echo dann ausnahmsweise doch im Originalzustand, erfolgt der Aufruf durch: archangel:/ # builtin echo

Konfigurationsdateien der Bash

In den unterschiedlichen Linux-Distributionen kann es zu unterschiedlichen Konstrukten der Konfigurationsdateien kommen. Konfigurationsdateien, die für alle Anwender Gültigkeit haben, befinden sich im Verzeichnis /etc und beginnen niemals mit einem Punkt. Die individuellen Konfigurationsdateien für den jeweiligen User befinden sich im entsprechenden Heimatverzeichnis und beginnen immer mit einem Punkt. Eine Datei /etc/.bashrc kommt als Konfigurationsdatei genauso wenig in Frage wie eine Datei mit der Bezeichnung /home/udo/profiles.

Systemweite Konfigurationsdateien

Die systemweiten Konfigurationsdateien sind für jeden Benutzer gültig, der sich am System anmeldet. Die beiden gängigsten sind folgende:

  • /etc/profile ist die erste Konfigurationsdatei, die bei der Anmeldung (Login- Shell) eines Benutzers eingelesen wird. Sie enthält erste Umgebungsvariablen und die erste PATH-Anweisung. Änderungen in dieser Datei erfordern eine neue Anmeldung des Benutzers.
  • /etc/bash.bashrc enthält systemweite Einstellungen, Aliase und Funktionen. Diese Datei wird beim Start jeder Shell neu eingelesen und erfordert deshalb nach Änderung keine Neuanmeldung des Benutzers.

Konfigurationsdateien für den Benutzer

Die folgenden Dateien befinden sich im Heimatverzeichnis eines jeden Benutzers und dürfen auch durch seinen Besitzer modifiziert werden. Damit weniger versierte Benutzer nicht durch diese Dateien irritiert werden, sind diese mit einem Punkt vor einer Auflistung mit Dateibrowsern geschützt worden. Die folgende Auflistung entspricht auch der Ausführungsreihenfolge (vorausgesetzt, die Dateien sind in der jeweiligen Distribution überhaupt vorhanden).

  • ~/.bash_profile wird (falls vorhanden) nur bei einer Neuanmeldung eingelesen und sofort nach /etc/profile ausgeführt. Sie beinhaltet zusätzliche Pfadanweisungen (z. B. das Heimatverzeichnis), den zu verwendenden Standardeditor und benutzerspezifische Umgebungsvariablen.
  • ~/.bash_login ist eine Alternative zu .bash_profile und wird auch nur dann abgearbeitet, wenn die Datei .bash_profile nicht existiert. Auch diese Datei wird nur während der Anmeldung verwendet. Der Inhalt und der Verwendungszweck entsprechen der .bash_profile.
  • ~/.profile ist die ursprüngliche Konfigurationsdatei der Bash. Sie wird nur während der Anmeldung (für die Login-Shell) eingelesen und das auch nur dann, wenn weder eine .bash_profile- noch eine .bash_login-Datei im Verzeichnis des Benutzers existieren. Inhalt und Verwendungszweck entsprechen der .bash_profile und .bash_login.
  • ~/.bashrc ist die andere, ursprüngliche Konfigurationsdatei der Bash. Sie wird in jedem Fall eingelesen, und zwar auch beim Aufruf einer neuen Shell. Nach Änderungen in dieser Datei ist entsprechend keine Neuanmeldung des Benutzers erforderlich. Sie beinhaltet im Wesentlichen Aliase und Funktionen.
  • ~/.bash_logout ist eine optionale Datei, die ausgeführt wird, wenn der Benutzer sich abmeldet. Sie könnte zum Beispiel den Monitor löschen.

Konfiguration on the fly einlesen

Haben Sie in einer der Konfigurationsdateien z. B. neue Variablen deklariert, können Sie diese sofort wirksam werden lassen, indem Sie das Shell-interne Kommando source verwenden. Beispiel: root@archangel:~# source /etc/profile Wenn Sie Ihre Tastatur schonen wollen, lässt sich das Kommando source auf einen Punkt verkürzen: root@archangel:~# . /etc/profile

Das Skeleton-Verzeichnis /etc/skel

Das Skeleton-Verzeichnis kann als eine Vorlage für das Heimatverzeichnis eines neuen Benutzers betrachtet werden. Beim Erstellen eines neuen Benutzerkontos mit useradd -m willi wird, die richtigen Standardeinstellungen vorausgesetzt, ein Verzeichnis namens /home/willi erstellt. Der Inhalt des Skeleton-Verzeichnisses wird dann in das Verzeichnis /home/willi kopiert. Abschließend werden die Berechtigungen für das Verzeichnis und dessen Inhalt auf den neuen Benutzer abgestimmt. Der Speicherort für Skeleton ist normalerweise /etc/skel. Auch hier kann es zu Unterschieden in den Distributionen kommen.



Einfache Skripte anpassen oder schreiben

Allgemeines

Für die Benennung des Skriptes, ist es sehr wichtig keine Sonderzeichen einzufügen, sowie vorhandene Befehle zu benutzen. Allgemein werden Skripte meist in Textdateien geschrieben.

Wichtige Inhalte in einem Skript

  • Standard-Syntax verwenden (sh)
  • Kommandosubstitutionen verwenden
  • verkettete Kommandos ausführen
    • es werden mehrere Befehle in einer einzigen Befehlszeile ausgeführt
    • werden mit einem Semikolon (;) getrennt
    • Beispiel: archangel:/ # df -h;free -m
    • -> Zunächst zeigt es die Festplattenbelegung, anschliessend die Speicherverwendung

sowie einige weitere

Position eines Skriptes

Falls man ein Skript öfter benötigt, wäre es sinnvoll ein Verzeichnis auszuwählen, dass auf die PATH-Variable zeigt.

  • /usr/bin ist gut geeignet für systemweite und jeden zugänglich
  • /usr/sbin ist gut geeignet für durchgeführte administrative Eingriffe oder auch nicht für normale Benutzer anwendbar sein sollen

Wichtige Dateien, Verzeichnisse und Anwendungen

Zeichen Beschreibung
for
&& bei diesem Zeichen wird der zweite Befehl nur ausgeführt, wenn der erste erfolgreich war
|| bei diesem Zeichen wird der zweite Befehl nur ausgeführt, wenn der erste fehlgeschlagen ist
while
test
read
if
seq
exec Erklärung im unteren Teil des Artikels. (Sonstiges)

sowie einige weitere

Grundrechenarten

Es gibt vier verschiedene Grundrechenarten, mit denen man im Skripten arbeiten und rechnen kann.

  • [a]ddieren
  • [s]ubtrahieren
  • [m]ultiplizieren
  • [d]ividieren

Sonstiges

Mit Exec kann man ein externes Programm oder ein anderes Skript aufrufen, dabei wird der laufenden Prozess / das laufende Skript automatisch beendet und ersetzt.