Linux/Shells und Shell-Skripte

Aus Foxwiki

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 Shellvariablen 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


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.

Besonders weit verbreitet und in manchen Distributionen schon von Hause aus integriert, sind die folgenden Aliase:

alias ..='cd ..' alias ...='cd ../..' alias dir='ls -l' alias la='ls -la' alias ll='ls -l' alias md='mkdir -p' alias o='less' alias rd='rmdir' alias which='type -p'




Die Definition der Aliase geht bei einer Neuanmeldung am System verloren



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.