UNIX Shell |
Einige Fähigkeiten der Shell sind bereits schon besprochen worden. So ist die Auswertung der Wildcards eine Funktionalität der Shell. Auch das Zeichen für die Umleitung von Ein- und Ausgabe, die Pipe und sogar die Reihenfolgebefehle für das Starten der Programme sind eigentlich Dinge, die von der Shell abhängen. Glücklicherweise halten sich die verschiedenen Shells an diesen Stellen an den von der ersten Shell, der Bourneshell vorgegebenen Standard.
Auch die Jobverwaltung für gestoppte Prozesse wurde schon als besondere Fähigkeit der Shell genannt.
Im Bereich Programmierung wird auf die Programmierung mit den Shellbefehlen eingegangen. Dort finden sich Strukturbefehle, die durchaus im Tagesgeschäft sehr hilfreich sein können. Man kann diese Befehle nämlich durchaus auch anwenden, ohne gleich einen Skript schreiben zu müssen. So kann man beispielsweise die Schleife for immer dann gut einsetzen, wenn man mit mehreren Dateien bestimmte Dinge anstellen möchte. Beispiel:
gaston> for i in *.mett > do > verwurste $i >$i.neu > rm $i > mv $i.neu $i > echo $i > done gaston> |
Die Befehlseingabe wird solange nicht beendet, bis das abschließende done nicht genannt ist, obwohl die Returntaste gedrückt wurde. Im Beispiel nimmt die Variable i alle Dateinamen des aktuellen Verzeichnisses nacheinander an, deren Maske auf *.mett passt. Mit dem Programm verwurste wird jede der Dateien nacheinander erst in eine neue Datei umgewandelt. Dann wird das Original gelöscht und schließlich die neu entstandene Datei in den Originalnamen umgenannt. Ein solches Szenario würde sich anbieten, wenn die Dateien derart groß sind, dass eine parallele Bearbeitung vielleicht die Kapazität der Festplatte sprengen würde.
alias ll 'ls -l' |
Nun wird jedesmal, wenn ll als Befehl an der Konsole eingetippt wird, diese Zeichenkette durch ls -l ersetzt. Bei vielen Systemen findet man bereits einen solchen alias auf ll oder l vorinstalliert. Es ist durchaus möglich, ll auch Parameter anzuhängen.
Um einen Alias wieder aufzuheben, wird der Befehl unalias verwendet.
Nachdem man mit alias viele neue Befehle definieren kann, möchte man manchmal auch wissen, was der Befehl, den man gerade ausführt, wirklich ist.
gaston> type ll ll is aliased to `ls -l' |
Handelt es sich bei dem Befehl nicht um einen Alias, wird der Pfad der Programmdatei angezeigt. Mit dem Befehl file kann man dann weiter feststellen, ob es sich um einen Skript oder ein compiliertes Programm handelt.
Startupdateien der Shell
Beim Starten einer Shell werden automatisch zu Anfang zwei Dateien ausgeführt.
Dabei
steht eine dieser Dateien im Verzeichnis /etc und wird vom root
für alle Benutzer vorgegeben. Für die C-Shell heißt diese Datei
csh.cshrc und für die anderen profile.
Diese zentrale Datei gilt für alle Benutzer und sorgt für eine gleiche
Startumgebung.
Grenzen setzen
Hier werden Standardvariablen wie PATH vorbesetzt.
Hier werden aber auch Begrenzungen eingerichtet, typischerweise mit dem Befehl
ulimit. Diese kann man sich als
Anwender mit ulimit -a anschauen.
Aus dem Heimatverzeichnis des Anwenders wird ein Shellskript gestartet, der vor allem Einstellungen beinhaltet, die der Benutzer nach eigenem Geschmack einstellen kann. Für die C-Shell ist das die Datei .cshrc und für die anderen Shells .profile
Befehl | Wirkung |
---|---|
cc haus.c > out | Umleitung der Standardausgabe, Fehler am Terminal |
cc haus.c 2> out | Umleitung der Fehler, Standardausgabe am Terminal |
cc haus.c 2>&1 out | Umleitung der Ausgabe und der Fehler nach out |
gaston> DATA=/home/arnold/my/database gaston> export DATA gaston> auswertung |
gaston> let wert=45+5 gaston> echo $wert 50 gaston> wert=45+5 gaston> echo $wert 45+5 gaston> let wert=16%5 gaston> echo $wert 1 gaston> let wert=(1+3)*2 gaston> echo $wert 8 gaston> let wert=16#1a gaston> echo $wert 26 gaston> |
Im Beispiel ist zu sehen, dass ohne die Verwendung von let die Variable den Ausdruck als Text übernimmt. Die Kornshell kennt auch Modulorechnung und Klammern. In den letzten beiden Beispielen wird die Umrechnung von hexadezimalen Werten demonstriert.
Wird als Argument von fc eine Zeichenkette gegeben, wird der letzte Befehl in den Editor geladen, der mit dieser Zeichenkette beginnt. Mit der Option -e kann ein Kommando direkt verändert werden, ohne den Editor zu belästigen. Wieder kann mit dem Argument nach der letzten Zeile gesucht werden, die mit dieser Zeichenkette beginnt. Mit einer Zuweisung kann ein Teilstring dieses Kommandos ersetzt werden. In der Praxis sieht das so aus:
gaston> let wert=16#1A gaston> echo $wert 26 gaston> fc -e - echo $wert 26 gaston> fc -e - 1A=22 let let wert=16#22 gaston> |
Im letzten fc wird das letzte Kommando gesucht, dass mit >>let<< beginnt und innerhalb des Kommandos die Zeichenkette 1A durch 22 ersetzt.
Mit Erleichterung wird der geneigte Leser zur Kenntnis nehmen, dass er statt mit fc zu arbeiten, die Editierkommandos des vi auf die Kommandoebene holen kann. Der folgende Befehl schaltet dies ein.
set -o vi |
set -o emacs |
Taste | Funktion |
---|---|
ctrl-P | zeilenweises Rückwärtsblättern der Kommandos |
ctrl-N | zeilenweises Vorwärtsblättern der Kommandos |
ctrl-B | mit dem Cursor nach links |
ctrl-F | mit dem Cursor nach rechts |
ctrl-A | An den Anfang der Zeile |
ctrl-E | An das Ende der Zeile |
ctrl-D | löscht das Zeichen unter dem Cursor |
ctrl-K | lösche bis an das Ende der Zeile |
ctrl-R | inkrementelles Suchen |
Die Startdatei der C-Shell heißt .cshrc. Statt der Datei .profile wird bei einer Login Shell die Datei .login gestartet. Neu gegenüber der Bourne Shell ist, dass es auch eine Datei gibt, die beim Ausloggen gestartet wird. Sie heißt konsequenterweise .logout.
Umgebungsvariablen werden mit dem Befehl setenv gesetzt.
setenv VARIABLE wert |
Durch ESC versucht die C-Shell den angefangenen Dateinamen anhand der im Verzeichnis existierenden Dateinamen automatisch zu vervollständigen.
cc -o moin moin.c > | outerr |
Dieser Mechanismus gilt ebenso bei einer Pipe. Wird dem senkrechten Strich ein
Zeichen | bewirkt... |
---|---|
!! | ruft die letzte Zeile noch einmal auf |
!5 | ruft die fünftletzte Zeile noch einmal auf |
!abc | ruft die letzte Zeile auf, die mit abc beginnt |
!?abc | ruft die letzte Zeile auf, die abc enthält |
!$ | verwendet das Argument der letzten Zeile an dieser Stelle |
hpsrv 2: lx hel* lx: Command not found. hpsrv 3: ^lx^ls ls hel* hello.cpp hpsrv 4: |
Das fehlerhafte lx wird durch das korrekte ls ausgetauscht. Nach Return wird der korrigierte Befehl gestartet. Im folgenden Beispiel wird noch einmal der Befehl geholt, der mit ls beginnt. Im Anschluss wird das Argument des letzten Kommandos im neuen Kommando wieder verwendet.
hpsrv 4: !ls ls hel* hello.cpp hpsrv 5: echo !$ echo hel* hello.cpp hpsrv 6: |
set prompt="%\!:" |
Dieser Befehl führt dazu, dass vor jedem Kommando eine Nummer steht, auf die man sich in der History beziehen kann.
Bourne Again Shell (bash)
bash ist die Abkürzung für bourne again shell. In ihrer
Kommandostruktur setzt sie also auf der alten Bourne Shell auf, fügt ihr
aber diverse Fähigkeiten hinzu, die man auch in anderen Shells wie
beispielsweise der Kornshell (ksh) oder der C-Shell (csh)
findet.
bash ist Standard unter Linux
Die bash ist die Standardshell der Linux-Systeme, findet sich aber
auch auf
anderen UNIX-Derivaten, selbst für OS/2 oder MS-Windows kann man die bash
bekommen. Unter Linux gibt es keine sh mehr. Der Standardeintrag
/bin/sh ist ein Link auf die bash. Da die bash eine
Obermenge der sh ist, ist eine separate Bourne Shell auch nicht
erforderlich.
Ablauf der Startdateien
Nachdem die /etc/profile abgearbeitet wurde, wird die .profile im
Heimatverzeichnis gestartet.
Innerhalb der .profile wird die Ausführung der .bashrc gestartet, sofern
sie vorhanden ist. Am Ende der .bashrc wird die Datei .alias gestartet,
in der typischerweise die alias Definitionen gesammelt werden.
History
Normalerweise ist die bash so installiert, dass mit den Pfeiltasten
durch die bisherigen Kommandos navigiert werden kann. Wenn es um mächtigere
Kommandos geht, werden die ctrl-Tasten des emacs verwendet. Wie bei
der Kornshell kann man mit set -o vi die Tastenkombinationen des vi
aktivieren. Zu guter Letzt finden auch Freunde der C-Shell ihre
Historyfunktionen mit dem Ausrufezeichen implementiert.
Funktionstasten
Mit den Pfeiltasten kann man die Befehle vor und rückwärts
blättern. Mit den Links- und Rechtspfeiltasten kann man innerhalb des Befehls
positionieren.
Ctrl-A bewegt den Cursor an den Anfang der Zeile, ctrl-E bringt ihn zum Ende.
Backspace funktioniert wie erwartet. Das Löschen des Zeichens unter dem Cursor
erfolgt mit ctrl-D oder der Taste Delete.
Die inkrementelle Suche funktioniert wie beim emacs
Bei jedem Tastendruck wird in der History nach einem passenden Befehl gesucht.
Dabei schlägt bash immer den nächsten passenden Befehl vor.
gaston> (reverse-i-search)`ps': ps -axwww |
Taste | Funktion |
---|---|
ctrl-A | An den Anfang der Zeile |
ctrl-E | An das Ende der Zeile |
ctrl-D | löscht das Zeichen unter dem Cursor |
ctrl-K | lösche bis an das Ende der Zeile |
ctrl-R | inkrementelles Suchen |
Die Ergänzung funktioniert nicht nur bei den Parametern. Auch beim Aufruf eines Befehls können die ersten Zeichen eingegeben werden und mit der Tabtaste vervollständigt werden. Dabei werden alle ausführbaren Dateien angeboten, die über den Pfad der Variable PATH erreichbar sind.
Diese Seite basiert auf Inhalten aus dem Buch
Arnold Willemer: Wie werde ich UNIX-Guru Verlagsrechte bei galileo computing |
Homepage |
(C) Copyright 2002 Arnold Willemer
|