04.11.2013 Aufrufe

Unix-Linux, Eine Einführung von Wolfgang Paulina (de)

Unix-Linux, Eine Einführung von Wolfgang Paulina (de)

Unix-Linux, Eine Einführung von Wolfgang Paulina (de)

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<strong>Unix</strong> - <strong>Linux</strong><br />

<strong>Eine</strong> <strong>Einführung</strong> <strong>von</strong> <strong>Wolfgang</strong> Pulina<br />

Universität Regensburg<br />

Rechenzentrum<br />

Oktober 2002


Vorwort zur dritten Auflage<br />

Seit 12 Jahren halte ich am Rechenzentrum <strong>de</strong>r Universität Regensburg <strong>de</strong>n Kurs <strong>Einführung</strong> in <strong>Unix</strong>, und<br />

seit 12 Jahren wird dieser Kurs immer wie<strong>de</strong>r <strong>von</strong> vielen Teilnehmern besucht. Dieses große Interesse<br />

ist umso erstaunlicher, als dass ein Betriebssystem wie <strong>Unix</strong> in <strong>de</strong>r gesamten EDV-Landschaft eine eher<br />

periphere Rolle zu spielen scheint. Doch bei genauerer Betrachtung wird man feststellen, dass <strong>Unix</strong> nach<br />

wie vor einen zentralen Platz unter <strong>de</strong>n Betriebssystemen einnimmt, vor allem dann, wenn es darum geht,<br />

hochverfügbare, skalierbare Leistungen zur Verfügung zu stellen. Es gibt aber noch einen weiteren Grund<br />

für das große Interesse an <strong>Unix</strong>-Betriebssystemen und dieser Grund heisst <strong>Linux</strong>. Aus <strong>de</strong>r Spielwiese für<br />

Programmierer und Informatiker ist mittlerweile ein ernstzunehmen<strong>de</strong>s System gewor<strong>de</strong>n, das sogar auf<br />

vielen Schreibtischen <strong>de</strong>r Privatwirtschaft seinen Platz gefun<strong>de</strong>n hat. Auch im häuslichen Bereich wird<br />

zunehmend <strong>Linux</strong> eingesetzt, wobei es hier hauptsächlich darum geht, die Alternativen zu einem an<strong>de</strong>ren<br />

marktbeherrschen<strong>de</strong>n Betriebssystem auszuloten.<br />

Diese Entwicklung hat mich dazu veranlasst, mein kursbegleiten<strong>de</strong>s Skript zu überarbeiten. Gemeinsamkeiten<br />

und Unterschie<strong>de</strong> zwischen <strong>Unix</strong> und <strong>Linux</strong> wur<strong>de</strong>n <strong>de</strong>utlicher herausgestellt und mit entsprechen<strong>de</strong>n<br />

Beispielen dokumentiert. <strong>Eine</strong> Sammlung ausgewählter Web-Links wur<strong>de</strong> hinzugefügt, und wird in <strong>de</strong>r<br />

online-Version <strong>de</strong>s Kurs-Skriptes ständig erweitert.<br />

Ein einwöchiger Kurs kann natürlich unmöglich das gesamte Potential <strong>von</strong> <strong>Unix</strong>/<strong>Linux</strong> ergrün<strong>de</strong>n. Der<br />

Kurs soll vielmehr als Anregung betrachtet wer<strong>de</strong>n, sich intensiver mit <strong>de</strong>m Betriebssystem und seinen<br />

Anwendungen auseinan<strong>de</strong>rzusetzen. Ich freue mich, falls mir dies mit vorliegen<strong>de</strong>r Publikation gelingen<br />

sollte, bin aber auch offen für alle Anregungen, die mir dabei helfen, etwas besser zu machen.<br />

Zum Schluss möchte ich mich bei allen bedanken, die in Diskussionen und Gesprächen wertvolle I<strong>de</strong>en zum<br />

Wer<strong>de</strong>n dieses Kurs-Skriptes beigetragen haben: Dr. Christoph Bauer, Rudolf Holzer und Dr. Fritz Wünsch<br />

- Vielen Dank.<br />

<strong>Wolfgang</strong> Pulina - 30. September 2002


Inhaltsverzeichnis<br />

1. Einleitung 1<br />

1.1. Typographische Konventionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1<br />

1.2. Die Entwicklung <strong>von</strong> <strong>Unix</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2<br />

1.3. Charakterisierung <strong>von</strong> <strong>Unix</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3<br />

2. Erste Schritte 5<br />

2.1. Zugang zu einem <strong>Unix</strong>-Rechner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5<br />

2.1.1. Login über das Datennetz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5<br />

2.1.2. Dateitransfer über das Datennetz . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />

2.1.3. <strong>Unix</strong>-Desktop über die PC-Xserver-Emulation . . . . . . . . . . . . . . . . . . . . 12<br />

2.2. Passwörter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />

2.3. Benutzeroberflächen und Benutzerumgebung . . . . . . . . . . . . . . . . . . . . . . . . . 14<br />

2.4. <strong>Unix</strong>-Dokumentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18<br />

2.5. Spezialzeichen und reguläre Ausdrücke . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21<br />

3. Kommandos und Prozesse 23<br />

3.1. Der Login-Prozess . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24<br />

3.2. Kommandoeingabe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25<br />

3.3. Prozesskontrolle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26<br />

4. Das Dateisystem 31<br />

4.1. Dateiarten und Dateinamen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32<br />

4.2. Kommandos mit Dateien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34<br />

4.3. Kommandos mit Directories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37<br />

4.4. Dateischutz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38<br />

4.5. Drucken <strong>von</strong> Dateien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40<br />

5. Editoren 41<br />

5.1. Der vi - Editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41<br />

5.2. Der emacs - Editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44<br />

5.3. Sonstige Editoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47<br />

6. Die csh/tcsh - Shell 48<br />

6.1. Kommandowie<strong>de</strong>rholung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48<br />

6.2. Vervollständigung <strong>von</strong> Kommandos, Variablen und Dateinamen . . . . . . . . . . . . . . . 49<br />

6.3. alias - Mechanismus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50<br />

6.4. Ein- und Ausgabeumlenkung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51<br />

6.5. Variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52<br />

6.5.1. Lokale Variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52<br />

6.5.2. Globale Variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55


6.6. Shell-Programmierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56<br />

6.6.1. Die if - Anweisung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57<br />

6.6.2. Die foreach - Schleife . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57<br />

6.6.3. Die while - Schleife . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58<br />

6.6.4. Die shift - Anweisung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59<br />

6.6.5. Fallunterscheidung mit switch und case . . . . . . . . . . . . . . . . . . . . . . . . 59<br />

6.6.6. Die break- und continue-Anweisung . . . . . . . . . . . . . . . . . . . . . . . . . . 60<br />

6.6.7. Die goto-Anweisung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61<br />

6.6.8. Allerlei Nützliches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61<br />

7. Textmusterverarbeitung mit awk 63<br />

7.1. Aufruf und Programmstruktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63<br />

7.2. Die Sprachelemente <strong>von</strong> awk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65<br />

7.3. Bedingungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67<br />

7.4. Aktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68<br />

7.4.1. Ausgabeanweisungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68<br />

7.4.2. Kontrollanweisungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69<br />

7.5. Sonstiges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70<br />

A. Ausgewählte Web-Links 71


1. Einleitung<br />

1.1. Typographische Konventionen<br />

In dieser Publikation wer<strong>de</strong>n häufig Kommandos, Dateiinhalte, Kommunikationsdialoge und Programm-<br />

Strukturen wi<strong>de</strong>rgegeben, die für ein leichteres Verständnis <strong>de</strong>r behan<strong>de</strong>lten Themen dienen sollen. Die<br />

”Interaktion mit <strong>de</strong>m <strong>Unix</strong>-System” soll daher auch aus <strong>de</strong>m Schriftbild logisch erkennbar sein. Folgen<strong>de</strong><br />

typographische Konventionen sind in diesem Zusammenhang gültig.<br />

ls -al<br />

cp file_old file_new<br />

head [-n] [filename ...]<br />

/etc/hosts<br />

f<br />

rechner><br />

Dieser Text kann wörtlich übernommen wer<strong>de</strong>n.<br />

Meist han<strong>de</strong>lt es sich dabei um Kommandos.<br />

Bei diesem Text kann nur das cp wörtlich übernommen<br />

wer<strong>de</strong>n. Die bei<strong>de</strong>n in Schrägschrift gesetzten<br />

Begriffe sind nur Platzhalter für konkrete Werte.<br />

Alle in eckigen Klammern stehen<strong>de</strong>n Angaben sind<br />

optional.<br />

Dateinamen wer<strong>de</strong>n immer in Courier dargestellt.<br />

Control-Tastensequenz: die Control-Taste wird gedrückt<br />

gehalten und gleichzeitig die Taste f betätigt.<br />

Bei <strong>de</strong>utschen Tastaturen entspricht die -<br />

Taste <strong>de</strong>r -Taste.<br />

Rechner-Prompt; dahinter stehen die Kommandos,<br />

die am Bildschirm eingegeben wer<strong>de</strong>n können.<br />

Dateiinhalte und Bildschirmausgaben wer<strong>de</strong>n in einfachem Courier wi<strong>de</strong>rgegeben. Als Beispiel soll das<br />

Kommando ls -l /etc/motd dienen.<br />

ls -l /etc/motd<br />

-rw-r--r-- 1 root sys 54 Jan 9 2000 /etc/motd<br />

Im laufen<strong>de</strong>n Text wer<strong>de</strong>n Hervorhebungen entwe<strong>de</strong>r in italic o<strong>de</strong>r in bold dargestellt. Nach Kommando-<br />

Eingaben ist immer die Betätigung <strong>de</strong>r - bzw. <strong>de</strong>r -Taste erfor<strong>de</strong>rlich. In <strong>de</strong>n<br />

Kommando-Beispielen wird dies nicht explizit dokumentiert.


1. Einleitung 2<br />

1.2. Die Entwicklung <strong>von</strong> <strong>Unix</strong><br />

Das Betriebssystem <strong>Unix</strong> hat bereits eine über 30-jährige Entwicklungsgeschichte hinter sich. Die Entwicklung<br />

begann in einer Zeit, in <strong>de</strong>r Computer noch sehr groß und teuer waren. Üblicherweise wur<strong>de</strong> auf diesen<br />

Großrechnern im sog. Stapelbetrieb gearbeitet. Das sah gewöhnlich so aus, dass ein Stapel Lochkarten in<br />

<strong>de</strong>n Rechner eingelesen wur<strong>de</strong>, <strong>de</strong>r Rechner dann die Bearbeitung vornahm und das Ergebnis auf einen<br />

Drucker ausgab. Falls das Ergebnis nicht <strong>de</strong>n Wünschen entsprach, mussten die fehlerhaften Lochkarten<br />

ersetzt wer<strong>de</strong>n und <strong>de</strong>r ganze Zyklus begann <strong>von</strong> neuem. Der Wunsch vieler Programmierer nach einer Arbeitsumgebung,<br />

die <strong>de</strong>n interaktiven Dialog in einem Mehrbenutzerbetrieb und das Teamwork unterstützt,<br />

mün<strong>de</strong>te in <strong>de</strong>r Entwicklung eines neuen Betriebssystems: <strong>Unix</strong>.<br />

Ken Thompson entwickelte 1969 bei <strong>de</strong>n Bell Laboratories das erste <strong>Unix</strong> auf einer PDP-7, einem Rechner<br />

<strong>de</strong>r Firma Digital Equipment. Dieses erste <strong>Unix</strong> war noch vollständig in Assembler geschrieben. Erst<br />

mit <strong>de</strong>r Entwicklung <strong>de</strong>r Programmiersprache C <strong>von</strong> Dennis Ritchie wur<strong>de</strong> das Betriebssystem 1971 in C<br />

umgeschrieben.<br />

Die Verbreitung <strong>de</strong>s Systems erfolgte zunächst im aka<strong>de</strong>mischen Umfeld, in<strong>de</strong>m es kostenlos an Universitäten<br />

und wissenschaftliche Institute verteilt wur<strong>de</strong>. Vielfach wur<strong>de</strong> das System an verschie<strong>de</strong>nen Stellen<br />

weiterentwickelt, so dass im Laufe <strong>de</strong>r Zeit unterschiedliche <strong>Unix</strong>-Derivate entstan<strong>de</strong>n (PWB/UNIX, IS/1,<br />

XENIX). Seit 1982 wer<strong>de</strong>n <strong>Unix</strong>-Betriebssysteme <strong>von</strong> kommerziellen Systemanbietern wie z.B. IBM, HP<br />

und Sun vertrieben.<br />

Da die Entwicklung verschie<strong>de</strong>ner <strong>Unix</strong>-Systeme zu immer mehr Inkompatibilitäten führte, entschloss man<br />

sich, Anfang <strong>de</strong>r 90er Jahre durch die Definition <strong>von</strong> Standards die konsequente Weiterentwicklung zu<br />

einem konvergenten Basissystem voranzutreiben. <strong>Eine</strong> wichtige Rolle spielten dabei Standardisierungsorganisationen<br />

wie IEEE und X/Open. Das Institute of Electrical and Electronic Engineers, kurz IEEE, ist<br />

eine <strong>de</strong>r vielen industriellen Organisationen, die vom American National Standards Institute (ANSI) mit <strong>de</strong>r<br />

Definition und Spezifizierung <strong>von</strong> Standards beauftragt wor<strong>de</strong>n sind. Das als POSIX-Ausschuss bekannte<br />

Gremium <strong>de</strong>r IEEE besitzt die Aufgabe, <strong>de</strong>n Schnittstellenstandard für alle Aspekte <strong>de</strong>r Betriebsumgebung<br />

festzulegen.<br />

Ziel <strong>von</strong> X/Open ist es, eine Grundlage für die Entwicklung einer gemeinsamen Anwendungsumgebung zu<br />

schaffen. So hat X/Open beispielsweise POSIX als Basisbetriebssystem-Schnittstelle unterstützt und das X<br />

Window System <strong>de</strong>s MIT (Massachusetts Institute of Technology) als Benutzerschnittstelle übernommen.<br />

Die Arbeit <strong>de</strong>r Organisation ist in Form <strong>von</strong> Referenzdokumenten mit <strong>de</strong>r Bezeichnung X/Open Portability<br />

Gui<strong>de</strong> o<strong>de</strong>r XPG erhältlich, die als Leitfa<strong>de</strong>n für Portierbarkeit dienen sollen.<br />

1991 schlug schließlich die Geburtsstun<strong>de</strong> <strong>von</strong> <strong>Linux</strong>. Der Finne Linus Thorvalds entwickelte einen Betriebssystemkern,<br />

um vor allem die Leistung <strong>de</strong>r damals aktuellen Intel 80386-Prozessoren ausnutzen zu<br />

können. Dabei bediente er sich freier Software, die im Rahmen <strong>de</strong>s GNU-Projekts zur Verfügung gestellt<br />

wur<strong>de</strong> (GNU C-Compiler). Von Anfang an wur<strong>de</strong> darauf Wert gelegt, dass auch <strong>Linux</strong> <strong>de</strong>n POSIX- und<br />

X11-Standards entspricht. Das beson<strong>de</strong>re an <strong>Linux</strong> ist die Tatsache, dass die Entwicklung nicht in <strong>de</strong>n<br />

Hän<strong>de</strong>n einer Firma liegt, son<strong>de</strong>rn aufgeteilt ist auf Software-Entwickler, die verteilt über die ganze Welt<br />

arbeiten und über das Internet miteinan<strong>de</strong>r kommunizieren.<br />

Zusammenfassend kann festgestellt wer<strong>de</strong>n, dass alle existieren<strong>de</strong>n <strong>Unix</strong>- und <strong>Linux</strong>-Betriebssysteme im<br />

wesentlichen die <strong>von</strong> <strong>de</strong>n oben beschriebenen Gremien <strong>de</strong>finierten Standards (POSIX, X11) implementieren.<br />

Als kleinste gemeinsame Betriebssystembasis wird <strong>von</strong> nahezu allen <strong>Unix</strong>- und <strong>Linux</strong>-Varianten<br />

System V Release 4 unterstützt. Dies garantiert eine hohe Äquivalenz <strong>de</strong>r Systeme untereinan<strong>de</strong>r.


1. Einleitung 3<br />

1.3. Charakterisierung <strong>von</strong> <strong>Unix</strong><br />

<strong>Eine</strong> Charakterisierung <strong>von</strong> Betriebssystemen kann aus unterschiedlichen Perspektiven erfolgen. Da wäre<br />

zum einen die Unterscheidung <strong>von</strong> Real-Time- und Time-Sharing-Systemen, zum an<strong>de</strong>ren die Aufteilung in<br />

Client- und Server-Systeme. Ferner können Kriterien wie Portierbarkeit und Skalierbarkeit zur Differenzierung<br />

herangezogen wer<strong>de</strong>n.<br />

Abgesehen <strong>von</strong> <strong>de</strong>n unterschiedlichen<br />

Funktionstypen besitzt ein <strong>Unix</strong>-System<br />

eine grundlegen<strong>de</strong> Struktur, die durch<br />

nebenstehen<strong>de</strong> Abbildung ver<strong>de</strong>utlicht<br />

Applications<br />

wird. Die Basis <strong>de</strong>s Betriebssystems bil<strong>de</strong>t<br />

<strong>de</strong>r Kernel, <strong>de</strong>r Betriebssystemkern,<br />

Shell<br />

<strong>de</strong>r für die Ansteuerung <strong>de</strong>r Hardware<br />

verantwortlich ist. Die Hauptaufgaben<br />

Kernel<br />

<strong>de</strong>s Kernels sind die Prozessverwal-<br />

tung die Hauptspeicherverwaltung, die<br />

Ein/Ausgabeverwaltung und die Dateiverwaltung.<br />

Die Leistungsfähigkeit eines<br />

<strong>Unix</strong>-System hängt maßgeblich <strong>von</strong><br />

<strong>de</strong>r Qualität <strong>de</strong>r Implementierung dieser<br />

Basisfunktionen ab. Als nächste Schicht<br />

im Strukturmo<strong>de</strong>ll folgen systemnahe<br />

Programme wie die Shell und sog. Utilities.<br />

Die Shell ist für die kommandoorientierte<br />

Interaktion zwischen Benutzer<br />

cc<br />

Hardware<br />

Utilities<br />

und System verantwortlich, während<br />

die Utilities eine Sammlung nützlicher<br />

Abbildung 1.1.: Struktur <strong>de</strong>s Betriebssystems<br />

Programme darstellen (das Kommando<br />

ls ist eine <strong>de</strong>rartige Utility). Den Abschluss bil<strong>de</strong>n die Applications, also die eigentlichen Anwendungs-<br />

Programme. Der Compiler cc gehört ebenso zu <strong>de</strong>n Anwendungen wie z.B. das Office-Paket StarOffice.<br />

Für eine kurze Charakterisierung <strong>von</strong> <strong>Unix</strong> sollen folgen<strong>de</strong> Aspekte herangezogen wer<strong>de</strong>n.<br />

<strong>Unix</strong> ist ein Dialogsystem<br />

Dies ist zwar in <strong>de</strong>r heutigen Zeit nichts beson<strong>de</strong>res, bei <strong>de</strong>r Entstehung <strong>von</strong> <strong>Unix</strong> waren aber immer<br />

noch die batch-orientierten Systeme in <strong>de</strong>r Mehrzahl.<br />

<strong>Unix</strong> ist primär ein Multi-User/Multi-Tasking-Betriebssystem<br />

Multi-User be<strong>de</strong>utet, dass an einem <strong>Unix</strong>-System gleichzeitig mehrere Benutzer arbeiten können.<br />

Multi-Tasking heißt, dass je<strong>de</strong>r Benutzer auch mehrere Programme quasi gleichzeitig ablaufen lassen<br />

kann. Nebenbei sei bemerkt, dass es heute noch an<strong>de</strong>re Betriebssysteme gibt, die diese Funktionalitäten<br />

entwe<strong>de</strong>r überhaupt nicht o<strong>de</strong>r nur sehr eingeschränkt besitzen.<br />

<strong>Unix</strong> unterstützt das virtuelle Speicherkonzept<br />

Das be<strong>de</strong>utet, dass im Prinzip ein großes Programm auf relativ klein dimensionierter Hardware laufen<br />

kann. Erreicht wird dies durch die sog. virtuelle Speicheradressierung. Erst zur Laufzeit <strong>de</strong>s<br />

Programms wer<strong>de</strong>n die virtuellen Adressen in physikalische Adressen umgesetzt.


1. Einleitung 4<br />

<strong>Unix</strong> unterstützt das Pipe-Konzept<br />

Dabei können die Ausgabedaten eines Prozesses unmittelbar als Eingabedaten einem an<strong>de</strong>ren Prozess<br />

übergeben wer<strong>de</strong>n.<br />

<strong>Unix</strong> verfügt über eine hierarchische Dateiverwaltung<br />

Wie auch bei an<strong>de</strong>ren Betriebssystemen ist die Dateistruktur baumartig aufgebaut.<br />

<strong>Unix</strong> besitzt leistungsfähige Shells als Benutzerschnittstelle<br />

Die kommandoorientierte Interaktion mit <strong>de</strong>m System wird über Shells abgewickelt. Diese Shells<br />

bieten vielfältige Möglichkeiten für die Programmierung und Automatisierung <strong>von</strong> Vorgängen.<br />

<strong>Unix</strong> ist fast vollständig in C programmiert<br />

Die Sprache C kombiniert die Effizienz einer Assemblersprache mit <strong>de</strong>n Steuerstrukturen mo<strong>de</strong>rner<br />

Sprachkonzepte. Heute sind mehr als 95 % in C geschrieben.<br />

<strong>Unix</strong> ist einfach in Datennetze zu integrieren<br />

Alle Funktionen für die Integration in Datennetze sind bereits vorhan<strong>de</strong>n.<br />

<strong>Unix</strong> ermöglicht eine hohe Skalierbarkeit<br />

Das Betriebssystem kann Rechner unterstützen, die einen, zwei, aber auch 128 Prozessoren besitzen<br />

können. Die Leistungsfähigkeit steigt dabei fast linear. Ferner können durch die Vernetzung <strong>von</strong><br />

Rechner-Knoten in Kombination mit geeigneter Software noch weitere Leistungsreserven mobilisiert<br />

wer<strong>de</strong>n (<strong>Linux</strong>-Cluster-Computing).<br />

<strong>Unix</strong>-Rechner wer<strong>de</strong>n in <strong>de</strong>n verschie<strong>de</strong>nsten Bereichen eingesetzt: als Computeserver, Datenbankserver,<br />

Mailserver, Bootserver und natürlich als Web-Server, aber auch als Firewall-Systeme und für das Netzwerk-<br />

Management. Als Desktop-Systeme fin<strong>de</strong>n <strong>Unix</strong>-Rechner vor allem im technischen Computing als CAD-<br />

Arbeitsplätze Verwendung. Auch die Filmindustrie hat die Leistungsfähigkeit <strong>von</strong> <strong>Unix</strong> erkannt. So entstan<strong>de</strong>n<br />

Animationsfilme wie ”Das große Krabbeln”, ”Toy Story” o<strong>de</strong>r ”Spirit” vollständig auf <strong>Unix</strong>-Rechnern.<br />

Im Film ”Titanic” wur<strong>de</strong>n einige Sequenzen auf <strong>Linux</strong>-Rechnern gerechnet.<br />

<strong>Unix</strong> erfüllt in höchstem Maße die Ansprüche an Zuverlässigkeit und Skalierbarkeit, so dass es aus <strong>de</strong>m<br />

Bereich <strong>de</strong>r Mission-Critical-Anwendungen nicht mehr wegzu<strong>de</strong>nken ist. Im Desktop-Bereich hat sich<br />

in <strong>de</strong>n letzten Jahren vor allem <strong>Linux</strong> als ernsthafte Alternative zu einem an<strong>de</strong>ren, marktbeherrschen<strong>de</strong>n<br />

System etabliert.


2. Erste Schritte<br />

2.1. Zugang zu einem <strong>Unix</strong>-Rechner<br />

Der Zugang zu einem <strong>Unix</strong>-/<strong>Linux</strong>-System ist generell mit einer Autorisierung <strong>de</strong>s Benutzers verbun<strong>de</strong>n.<br />

Der Benutzer mel<strong>de</strong>t sich mit einem Account- bzw. Benutzernamen an und muss anschließend<br />

ein Passwort eingeben. Ein Einloggen auf einem <strong>Unix</strong>-/<strong>Linux</strong>-System kann direkt am Rechner selbst o<strong>de</strong>r<br />

aber über das Datennetz erfolgen.<br />

Abbildung 2.1.: Login an einer Sun-Workstation<br />

Das Login an <strong>de</strong>r Console eines <strong>Unix</strong>-/<strong>Linux</strong>-Rechners erfolgt in <strong>de</strong>r Regel über einen graphischen Login-<br />

Bildschirm. Obige Abbildung zeigt einen Login-Bildschirm auf einer Sun-Workstation. Über die Options<br />

können Login-Beson<strong>de</strong>rheiten wie alternative Benutzeroberflächen und das Command Line Login eingestellt<br />

wer<strong>de</strong>n. Mit <strong>de</strong>m Command Line Login kann ein Einloggen ohne Benutzeroberfläche erfolgen. Auf einer<br />

<strong>Linux</strong>-Console wird meist <strong>de</strong>r kdm-Login-Manager für die Eingabe <strong>von</strong> Benutzername und Passwort eingesetzt.<br />

Auch hier lassen sich bereits beim Login alternative Benutzeroberflächen anwählen (k<strong>de</strong>, gnome).<br />

Neben <strong>de</strong>m direkten Login an <strong>de</strong>r Console eines <strong>Unix</strong>-/<strong>Linux</strong>-Rechners gibt es noch verschie<strong>de</strong>ne Möglichkeiten,<br />

einen <strong>Unix</strong>-Rechner über das Datennetz zu nutzen. Dabei wird unterschie<strong>de</strong>n zwischen reinen<br />

Terminal-Verbindungen, Verbindungen zum Austausch <strong>von</strong> Dateien und Verbindungen, die die Nutzung <strong>von</strong><br />

graphischen <strong>Unix</strong>-Anwendungen zulassen.<br />

2.1.1. Login über das Datennetz<br />

Ausgangspunkt für das Login über das Datennetz ist ein lokaler Rechner, auf <strong>de</strong>m <strong>Unix</strong>/<strong>Linux</strong> o<strong>de</strong>r MS-<br />

Windows installiert ist. Die Konfiguration <strong>de</strong>s Rechners muss eine fehlerfreie Netz-Kommunikation erlauben<br />

(IP-Adresse, Netzmaske, usw.).


2. Erste Schritte 6<br />

Lokaler Rechner ist ein <strong>Unix</strong>/<strong>Linux</strong>-System<br />

Die Programme slogin und ssh bieten die <strong>de</strong>rzeit bevorzugte Metho<strong>de</strong>, sich <strong>von</strong> einem lokalen in einen<br />

entfernten <strong>Unix</strong>-Rechner einzuloggen. Dabei läuft die gesamte Datenkommunikation dieser sog. secure<br />

shell zwischen <strong>de</strong>n Rechnern verschlüsselt ab. Der entfernte Rechner (remote host) kann <strong>de</strong>n Zugang<br />

erlauben, verbieten o<strong>de</strong>r differenziert regeln. Beim erstmaligen Login wird im lokalen Home-Verzeichnis<br />

<strong>de</strong>r sog. public key <strong>de</strong>s remote host abgespeichert. Dies erfolgt im Rahmen eines interaktiven Dialogs.<br />

rechner> slogin hostname<br />

rechner> slogin ip-address<br />

rechner> ssh hostname<br />

rechner> ssh ip-address<br />

Remote Login mittels Rechnernamen<br />

Remote Login mittels IP-Adresse<br />

Remote Login mittels Rechnernamen<br />

Remote Login mittels IP-Adresse<br />

Abbildung 2.2.: Remote Login mittels secure shell<br />

In obigem Beispiel loggt sich ein Benutzer namens teu19147 mittels slogin <strong>von</strong> <strong>de</strong>m lokalen Rechner<br />

rciplx2 in <strong>de</strong>n Rechner rss6 ein. Da das secure-shell-Login zu diesem Rechner zum erstem Mal erfolgt,<br />

muss <strong>de</strong>r public key <strong>de</strong>s Rechners rss6 im lokalen Home-Verzeichnis <strong>de</strong>s Benutzers abgespeichert wer<strong>de</strong>n<br />

(in <strong>de</strong>r Datei .ssh/known_hosts). Diese Speicherung wird aber erst dann vorgenommen, wenn <strong>de</strong>r<br />

Benutzer auf die Frage<br />

Are you sure you want to continue connecting (yes/no)?<br />

mit yes antwortet. Dabei ist wichtig, dass die Antwort yes ausgeschrieben wird! Die Eingabe <strong>von</strong> y genügt<br />

nicht. Das System speichert daraufhin <strong>de</strong>n public key <strong>de</strong>s remote host in <strong>de</strong>r Datei .ssh/known_hosts<br />

und for<strong>de</strong>rt <strong>de</strong>n Benutzer auf, sein Passwort einzugeben. Beim wie<strong>de</strong>rholten Login in <strong>de</strong>n Rechner rss6<br />

ist eine Abspeicherung <strong>de</strong>s public keys nicht mehr notwendig. Nach <strong>de</strong>m slogin-Kommando wird sofort<br />

die Eingabe <strong>de</strong>s Passworts verlangt.<br />

Im allgemeinen än<strong>de</strong>rn sich die public keys <strong>de</strong>r entfernten Rechner nicht. Falls dies aufgrund einer Neuinstallation<br />

o<strong>de</strong>r nach Datenverlust doch einmal passiert, ist es notwendig, <strong>de</strong>n public key <strong>de</strong>s entsprechen<strong>de</strong>n<br />

Rechners aus <strong>de</strong>r Datei .ssh/known_hosts zu entfernen. Bei erneuter Verbindungsaufnahme wird dann<br />

<strong>de</strong>r neue public key abgespeichert.


2. Erste Schritte 7<br />

Die Kommandos slogin und ssh lassen sich völlig i<strong>de</strong>ntisch handhaben (slogin ist einfach ein symbolischer<br />

Link auf das Programm ssh). Bei<strong>de</strong> Kommandos besitzen die gleichen Optionen. Die folgen<strong>de</strong>n<br />

Beispiele wer<strong>de</strong>n daher nur mit <strong>de</strong>m Kommando ssh wi<strong>de</strong>rgegeben.<br />

rechner> ssh -l teu19147 rss6<br />

rechner> ssh teu19147@rss6<br />

rechner> ssh rss6 finger<br />

Remote Login zum Rechner rss6 als Benutzer<br />

teu19147<br />

Remote Login zum Rechner rss6 als Benutzer<br />

teu19147<br />

Remote Login mit anschließen<strong>de</strong>r Ausführung<br />

<strong>de</strong>s finger-Kommandos<br />

rechner> ssh rss6.rz.uni-regensburg.<strong>de</strong><br />

Remote Login mit full-qualified Internet-Name<br />

Letztes Beispiel zeigt, wie für die Adressierung eines Rechners <strong>de</strong>r full-qualified Hostname verwen<strong>de</strong>t wird.<br />

Dies ist immer dann erfor<strong>de</strong>rlich, wenn auf Rechner zugegriffen wird, die nicht im lokalen Nameserver<br />

verzeichnet sind.<br />

Ein Login <strong>von</strong> <strong>Unix</strong>- zu <strong>Unix</strong>-System ist auch mit Programmen wie telnet, rlogin und rsh möglich.<br />

Sie stehen in <strong>de</strong>r Regel auf allen <strong>Unix</strong>/<strong>Linux</strong>-Systemen zur Verfügung. Voraussetzung für ein erfolgreiches<br />

Login ist allerdings, dass <strong>de</strong>r Zielrechner diese Art <strong>de</strong>r Verbindung zulässt.<br />

rechner> telnet hostname<br />

rechner> telnet rss6<br />

rechner> telnet ip-address<br />

rechner> telnet 132.199.38.92<br />

rechner> rlogin hostname<br />

rechner> rlogin rss6<br />

rechner> rsh hostname<br />

rechner> rsh rss6<br />

Remote Login mittels Rechnernamen<br />

Remote Login zum Rechner rss6<br />

Remote Login mittels IP-Adresse<br />

Remote Login zum Rechner rss6<br />

Remote Login mittels Rechnernamen<br />

Remote Login zum Rechner rss6<br />

Remote Login mittels Rechnernamen<br />

Remote Login zum Rechner rss6<br />

Bei <strong>de</strong>r Eingabe <strong>de</strong>s Rechnernamens ist darauf zu achten, dass bei externen Rechnern, also Rechnern, die<br />

sich nicht im Intranet befin<strong>de</strong>n, <strong>de</strong>r full-qualified Internet-Name eingegeben wer<strong>de</strong>n muss. Die Kommandos<br />

rlogin und rsh ermöglichen ferner mit <strong>de</strong>r Option -l das Remote-Login unter einem an<strong>de</strong>ren Benutzernamen.<br />

rechner> rlogin rss6.rz.uni-regensburg.<strong>de</strong><br />

Remote Login mit full-qualified Internet-Name<br />

rechner> rlogin -l rar12345 rss6<br />

Remote Login zum Rechner rss6 als Benutzer rar12345<br />

rechner> rsh -l rar12345 rss6<br />

Remote Login zum Rechner rss6 als Benutzer rar12345<br />

Wie beim Login an <strong>de</strong>r Rechner-Console, wird die Eingabe <strong>de</strong>s korrekten Passworts verlangt. Die Abfrage<br />

nach <strong>de</strong>m Passwort kann bei <strong>de</strong>n Programmen rlogin und rsh unterdrückt wer<strong>de</strong>n, in<strong>de</strong>m auf<br />

<strong>de</strong>m Zielrechner im Home-Verzeichnis eine Datei namens .rhosts erstellt wird, die <strong>de</strong>n Namen <strong>de</strong>s Herkunftsrechners<br />

enthält. Das Login mittels telnet, rlogin und rsh ist allerdings mit einer erheblichen


2. Erste Schritte 8<br />

Sicherheitsproblematik behaftet. Diese drei Programme führen <strong>von</strong> sich aus keine Verschlüsselung <strong>de</strong>r zu<br />

transferieren<strong>de</strong>n Daten durch. Je<strong>de</strong>s Zeichen, das an <strong>de</strong>r Tastatur eingegeben wird, wird im Klartext über<br />

das Datennetz gesen<strong>de</strong>t. So ist es für einen böswilligen Benutzer relativ leicht, mit sog. ”Schnüffelprogrammen”<br />

Passwörter auszuspionieren. Seit einiger Zeit gibt es zwar die Möglichkeit, die Verschlüsselung auf<br />

Protokollebene (TCP, UDP) zu aktivieren (IPsec), allerdings bleibt dies aufgrund <strong>de</strong>s Aufwands meist auf<br />

kleine Netze beschränkt. An <strong>de</strong>r Uni Regensburg wer<strong>de</strong>n diese unsicheren Programme nicht verwen<strong>de</strong>t.<br />

Lokaler Rechner ist ein MS-Windows-System<br />

Voraussetzung für ein remote Login <strong>von</strong> MS-Windows zu einem <strong>Unix</strong>-/<strong>Linux</strong>-Rechner ist eine Terminalemulation,<br />

die auf <strong>de</strong>m MS-Windows-System installiert sein muss. Um auch eine sichere Kommunikation<br />

zu gewährleisten, sollte die Terminalemulation die Datenverschlüsselung unterstützen (ssh1- bzw. ssh2-<br />

Protokoll <strong>de</strong>r secure shell). An <strong>de</strong>r Universität Regensburg steht für diesen Zweck die SSH Secure Shell<br />

3.0 zur Verfügung. Diese Software muss auf <strong>de</strong>m PC installiert sein. Ein sicheres Login <strong>von</strong> einem MS-<br />

Windows-Rechner zu einem <strong>Unix</strong>-/<strong>Linux</strong>-Rechner wird im folgen<strong>de</strong>n geschil<strong>de</strong>rt.<br />

Als erstes erfolgt ein Login am PC mit <strong>de</strong>m NDS-Passwort.<br />

Nach<strong>de</strong>m MS-Windows hochgefahren ist, wird in einem MS-DOS-Eingabefenster das Kommando ssh2<br />

eingegeben. Es erscheint dann folgen<strong>de</strong>s Fenster. In diesem Fenster wird nun unter <strong>de</strong>m Menü-Punkt File<br />

<strong>de</strong>r Unterpunkt Connect angewählt.<br />

Abbildung 2.3.: ssh-Login <strong>von</strong> MS-Windows<br />

Abbildung 2.4.: Eingabe <strong>von</strong> Rechner und Benutzer<br />

Im nun erscheinen<strong>de</strong>n Fenster muss nun<br />

<strong>de</strong>r Rechner (Host Name) und <strong>de</strong>r User<br />

Name eingegeben wer<strong>de</strong>n. Als Host Name<br />

kann z.B. rss6 o<strong>de</strong>r je<strong>de</strong>r bliebige Name<br />

eines öffentlichen <strong>Unix</strong>- bzw. <strong>Linux</strong>-<br />

Rechners angegeben wer<strong>de</strong>n.


2. Erste Schritte 9<br />

Falls <strong>de</strong>r Hostkey <strong>de</strong>s Login-Rechners<br />

noch nicht bekannt ist, erscheint nun folgen<strong>de</strong>s<br />

Bild. Das Abspeichern <strong>de</strong>s public<br />

Hostkeys erfolgt nur beim ersten Verbindungsaufbau.<br />

Bei allen künftigen Logins<br />

auf diesen Rechner unterbleibt diese Abfrage.<br />

Abbildung 2.5.: Speichern <strong>de</strong>s public hostkeys<br />

Als nächste Interaktion muss das <strong>Unix</strong>-<br />

Passwort eingegeben wer<strong>de</strong>n.<br />

Abbildung 2.6.: Eingabe <strong>de</strong>s <strong>Unix</strong>-Passworts<br />

Nun kann auf <strong>de</strong>m <strong>Unix</strong>-System interaktiv gearbeitet wer<strong>de</strong>n. Mit <strong>de</strong>m Kommando exit erfolgt ein Logout.<br />

Soll die Verbindung zum <strong>Unix</strong>-System been<strong>de</strong>t wer<strong>de</strong>n, so erfolgt dies über die Menü-Punkte File und<br />

Disconnect.<br />

Abbildung 2.7.: Been<strong>de</strong>n <strong>de</strong>r ssh-Verbindung<br />

Neben <strong>de</strong>m interaktiven Login besitzt dieses Programm noch eine Funktion zum Dateitransfer, die im nächsten<br />

Abschnitt beschrieben wird.


2. Erste Schritte 10<br />

2.1.2. Dateitransfer über das Datennetz<br />

Die Übertragung <strong>von</strong> Dateien zwischen <strong>Unix</strong>-/<strong>Linux</strong>-Rechnern sowie zwischen <strong>Unix</strong>-/<strong>Linux</strong>-Rechnern und<br />

MS-Windows-Rechnern setzt wie beim Login eine Autorisierung <strong>de</strong>s Benutzers voraus. Die Funktionalität<br />

ist aber ganz speziell auf <strong>de</strong>n Transfer <strong>von</strong> Dateien ausgerichtet. Auf bei<strong>de</strong>n Rechnern müssen die<br />

entsprechen<strong>de</strong>n Programme installiert und aktiviert sein.<br />

Dateitransfer zwischen <strong>Unix</strong>/<strong>Linux</strong>-Rechnern<br />

Die Übertragung <strong>von</strong> Dateien (files) zwischen <strong>Unix</strong>-Rechnern wird meist mit Programmen wie scp und<br />

sftp durchgeführt. Das s im Namen weist darauf hin, dass es sich hier um eine sichere Art <strong>de</strong>r Datenübertragung<br />

han<strong>de</strong>lt. Alle Daten wer<strong>de</strong>n verschlüsselt transferiert. Das Programm ftp, das auf je<strong>de</strong>m<br />

<strong>Unix</strong>-System vorhan<strong>de</strong>n ist, kann zwar auch verwen<strong>de</strong>t wer<strong>de</strong>n, allerdings mit <strong>de</strong>m gleichen Sicherheitsrisiko<br />

wie bei <strong>de</strong>n Programmen telnet und rlogin. Passwörter und Daten wer<strong>de</strong>n bei ftp unverschlüsselt<br />

übertragen.<br />

rechner> scp file rechner:<br />

sicheres Kopieren einer Datei zu einem an<strong>de</strong>ren Rechner<br />

rechner> scp file rechner:subdir<br />

sicheres Kopieren einer Datei zu einem an<strong>de</strong>ren Rechner in ein untergeordnetes<br />

Verzeichnis<br />

rechner> scp file username@rechner:<br />

sicheres Kopieren einer Datei in das Home-Directory eines an<strong>de</strong>ren Benutzers<br />

auf einem an<strong>de</strong>ren Rechner<br />

rechner> scp -r directory rechner:<br />

sicheres, rekursives Kopieren eines kompletten Verzeichnisses zu einem an<strong>de</strong>ren<br />

Rechner<br />

Wie bei <strong>de</strong>n Kommandos ssh und slogin wird bei einem erstmaligen Verbindungsaufbau die Abspeicherung<br />

<strong>de</strong>s public hostkeys vorgenommen.<br />

Abbildung 2.8.: Sicheres Kopieren über das Datennetz mittels scp<br />

In obigem Beispiel wird vom Rechner rciplx8 eine Datei namens user51.ps zum Rechner rss6 in<br />

das dort lokal vorhan<strong>de</strong>ne Verzeichnis /tmp kopiert. Ein kleines Histogramm veranschaulicht <strong>de</strong>n Fortschritt<br />

<strong>de</strong>r Kopieraktion.


2. Erste Schritte 11<br />

Der Dateitransfer mittels sftp funktioniert genauso wie mit <strong>de</strong>m älteren ftp, nur mit <strong>de</strong>m Unterschied,<br />

dass die Daten verschlüsselt übertragen wer<strong>de</strong>n.<br />

Abbildung 2.9.: Sicherer Datentransfer mittels sftp<br />

Im vorliegen<strong>de</strong>n Beispiel wird eine Datei namens sz.sdw vom Rechner solaris zum Rechner rss6<br />

übertragen. Nach <strong>de</strong>m sftp-Login wird <strong>de</strong>r Transfer mit <strong>de</strong>m Kommando put sz.sdw angestoßen.<br />

Das Kommando exit been<strong>de</strong>t das Programm.<br />

sftp> help<br />

sftp> get filename<br />

sftp> put filename<br />

sftp> mkdir directory<br />

gibt Informationen zu sftp aus<br />

Datei vom remote Rechner holen<br />

Datei zum remote Rechner schicken<br />

neues Verzeichnis auf remote Rechner anlegen<br />

Weitere Informationen zu sftp können mit <strong>de</strong>m Kommando man sftp aus <strong>de</strong>n online manual pages<br />

abgerufen wer<strong>de</strong>n.<br />

Dateitransfer zwischen <strong>Unix</strong>/<strong>Linux</strong>- und MS-Windows-Rechnern<br />

Mit <strong>de</strong>m an <strong>de</strong>r Uni Regensburg vorhan<strong>de</strong>nen Programm ssh2 können <strong>von</strong> MS-Windows-Rechnern auch<br />

Dateiübertragungen <strong>von</strong> und zu <strong>Unix</strong>-Rechnern vorgenommen wer<strong>de</strong>n. Dabei wird im Secure-Shell-Fenster<br />

<strong>de</strong>r Menü-Punkt Window und dort <strong>de</strong>r Unterpunkt New File Transfer angewählt.<br />

Abbildung 2.10.: Sicherer Datentransfer mittels ssh2 unter MS-Windows


2. Erste Schritte 12<br />

Im neu erscheinen<strong>de</strong>n Fenster wird nun die gewünschte Operation gewählt. Upload überträgt Dateien vom<br />

Windows-PC zum <strong>Unix</strong>-Rechner, Download überträgt Dateien vom <strong>Unix</strong>-Rechner zum Windows-PC.<br />

Abbildung 2.11.: Sicherer Datentransfer mittels ssh2 unter MS-Windows: upload<br />

Im Upload-Fenster wer<strong>de</strong>n die Dateien markiert, die übertragen wer<strong>de</strong>n sollen. Anschließend wird auf<br />

Upload geklickt.<br />

Beim Übertragen <strong>von</strong> Dateien zwischen einem <strong>Unix</strong>-Rechner und einem MS-Windows-Rechner sollten die<br />

entsprechen<strong>de</strong>n Dateinamen-Konventionen beachtet wer<strong>de</strong>n. So können in einem Eingabefenster <strong>von</strong> MS-<br />

Windows nur Dateinamen beschränkter Länge abgebil<strong>de</strong>t wer<strong>de</strong>n. Auch auf die Groß- und Kleinschreibung<br />

muss Rücksicht genommen wer<strong>de</strong>n.<br />

<strong>Unix</strong>-/<strong>Linux</strong>-Systeme unterschei<strong>de</strong>n grundsätzlich zwischen Groß- und Kleinschreibung!<br />

Beson<strong>de</strong>rs bei Dateitransfers <strong>von</strong> <strong>Unix</strong> zu MS-Windows ist dies relevant. Hierzu ein Beispiel: Auf <strong>Unix</strong><br />

liegen zwei Dateien namens brief.txt und Brief.txt vor, die mittels secure ftp nach MS-Windows<br />

übertragen wer<strong>de</strong>n sollen. Für das <strong>Unix</strong>-System sind dies zwei verschie<strong>de</strong>ne Dateien. Wer<strong>de</strong>n die bei<strong>de</strong>n<br />

Dateien hintereinan<strong>de</strong>r übertragen, so wird beim zweiten Transfer <strong>de</strong>r Inhalt <strong>de</strong>r ersten Datei einfach<br />

überschrieben. MS-Windows kennt bzgl. <strong>de</strong>r Dateinamen keine Unterscheidung zwischen Groß- und Kleinschrift.<br />

Es gibt noch eine weitere Möglichkeit, <strong>von</strong> MS-Windows auf Dateien <strong>von</strong> <strong>Unix</strong>-Systemen zuzugreifen.<br />

Ermöglicht wird dies durch einen sog. samba-connect zwischen MS-Windows-Client und einem samba-<br />

Server, <strong>de</strong>r üblicherweise auf einem <strong>Unix</strong>-Fileserver installiert ist. Über <strong>de</strong>n Windows-Explorer kann damit<br />

ein <strong>Unix</strong>-Verzeichnis quasi als MS-Windows-Laufwerk zur Verfügung gestellt wer<strong>de</strong>n. Die Vorgehensweise<br />

wird in einem Web-Link erläutert.<br />

2.1.3. <strong>Unix</strong>-Desktop über die PC-Xserver-Emulation<br />

Auf MS-Windows-PCs kann ein Xserver-Programm aktiviert wer<strong>de</strong>n, das <strong>de</strong>n kompletten <strong>Unix</strong>-Desktop auf<br />

<strong>de</strong>m PC darstellen kann. Diese sog. X-Win32-Software ist auf allen öffentlichen MS-Windows-Rechnern<br />

installiert. Alle notwendigen Schritte für die Nutzung <strong>de</strong>s PCs als graphische <strong>Unix</strong>-Console wer<strong>de</strong>n in einem<br />

Web-Link erläutert.


2. Erste Schritte 13<br />

2.2. Passwörter<br />

Benutzer-Accounts auf <strong>Unix</strong>-Rechner sind grundsätzlich passwortgeschützt. Passwörter dürfen nicht an<br />

an<strong>de</strong>re Personen weitergegeben wer<strong>de</strong>n. Ausser<strong>de</strong>m ist darauf zu achten, dass das Passwort in bestimmten<br />

Zeitabstän<strong>de</strong>n geän<strong>de</strong>rt wird.<br />

Bei <strong>de</strong>r Wahl eines Passworts muss wie bei <strong>de</strong>n Dateinamen auf Groß- und Kleinschreibung geachtet wer<strong>de</strong>n.<br />

Das Passwort sollte nicht weniger als 6 Zeichen besitzen. <strong>Eine</strong> Kombination <strong>von</strong> Buchstaben, Ziffern<br />

und Son<strong>de</strong>rzeichen ist empfehlenswert. Die Zeichen @, $, # und ! können, aber sollten nicht unbedingt<br />

verwen<strong>de</strong>t wer<strong>de</strong>n. Ferner sollte auf nicht sichtbare Zeichen verzichtet wer<strong>de</strong>n.<br />

Das Än<strong>de</strong>rn eines <strong>Unix</strong>-Passworts erfolgt in <strong>de</strong>r Regel mit <strong>de</strong>m Kommando passwd. Diese Möglichkeit<br />

<strong>de</strong>r Passwortän<strong>de</strong>rung beschränkt sich allerdings auf Einzelplatz- o<strong>de</strong>r Standalone-Systeme. Oft wer<strong>de</strong>n<br />

mehrere Rechner zu einer Verwaltungseinheit, einer sog. Domain, zusammengefasst. Die meisten<br />

<strong>Unix</strong>/<strong>Linux</strong>-Rechner an <strong>de</strong>r Universität Regensburg sind in solch einer Domain integriert. Die Verwaltung<br />

<strong>de</strong>r Benutzer-Accounts und damit auch <strong>de</strong>r Passwörter wird daher über einen Namensdienst abgewickelt.<br />

Die unter <strong>Unix</strong> bekanntesten Namensdienste sind NIS, NIS+ und LDAP. Das Kommando zum Än<strong>de</strong>rn <strong>de</strong>s<br />

Passwortes hängt vom installierten Namensdienst ab.<br />

An <strong>de</strong>r Uni Regensburg wird auf allen <strong>Unix</strong>/<strong>Linux</strong>-Rechnern <strong>de</strong>r campusweiten <strong>Unix</strong>-Domäne das Kommando<br />

nispasswd zum Än<strong>de</strong>rn <strong>de</strong>s Passworts verwen<strong>de</strong>t. Als Namensdienst wird also NIS+ eingesetzt.<br />

rechner> nispasswd<br />

Old password: oldpassword<br />

New password: newpassword<br />

Verification: newpassword<br />

Nach einer kurzen Zeit ist das neue Passwort auf allen Rechnern <strong>de</strong>r Domäne gültig. Obiger Hinweis<br />

ist sehr wichtig. Nach einer Passwortän<strong>de</strong>rung wird diese Modifikation auf alle vorhan<strong>de</strong>nen NIS+Server<br />

repliziert. Dieser Replikations-Vorgang benötigt natürlich eine gewisse Zeit, und diese Zeit sollte erst verstreichen,<br />

bevor <strong>de</strong>r Benutzer sich erneut in einen <strong>Unix</strong>-Rechner einloggt. Wird dies nicht beachtet, kann es<br />

dazu kommen, dass <strong>de</strong>r Benutzer sich nicht mehr einloggen kann. <strong>Eine</strong> 5-minütige Wartezeit sollte daher<br />

eingehalten wer<strong>de</strong>n.<br />

Der Namensdienst NIS+ besitzt umfangreiche Möglichkeiten, <strong>de</strong>n Zugriff auf sog. NIS+Objekte zu regeln.<br />

Das be<strong>de</strong>utet, dass eine korrekte Autorisierung gegenüber NIS+ nur durch die explizite Angabe <strong>de</strong>s<br />

Passworts beim Login erreicht wird. Wird ein Login mittels public-key-Verfahren initiiert, so ist danach<br />

<strong>de</strong>r Benutzer zwar im <strong>Unix</strong>-System eingeloggt, im NIS+Namensdienst ist er aber nicht ordnungsgemäß angemel<strong>de</strong>t<br />

(session-key fehlt). Als Konsequenz kann <strong>de</strong>r Benutzer in dieser Situation sein Passwort nicht<br />

än<strong>de</strong>rn. <strong>Eine</strong> nachträgliche Autorisierung gegenüber NIS+ erfolgt mit <strong>de</strong>m Kommando keylogin. Dabei<br />

muss nochmals das Login-Passwort eingegeben wer<strong>de</strong>n.<br />

Neben <strong>de</strong>m <strong>Unix</strong>-Passwort kann ein Benutzer noch über weitere Passwörter verfügen. So erfor<strong>de</strong>rt <strong>de</strong>r oben<br />

geschil<strong>de</strong>rte samba-connect das einmalige Setzen <strong>de</strong>s sog. Samba-Passworts. Auch beim Login in einen<br />

MS-Windows-Rechner wird ein an<strong>de</strong>res Passwort verwen<strong>de</strong>t, das sog. NDS-Passwort. Bei <strong>de</strong>r Än<strong>de</strong>rung<br />

eines dieser drei Passwörter wer<strong>de</strong>n nicht gleichzeitig die an<strong>de</strong>ren Passwörter geän<strong>de</strong>rt.


2. Erste Schritte 14<br />

2.3. Benutzeroberflächen und Benutzerumgebung<br />

Graphische Benutzeroberflächen dienen dazu, die Interaktion zwischen Benutzer und Rechner möglichst<br />

einfach zu gestalten. Alle Aktionen sollen leicht intuitiv erfasst wer<strong>de</strong>n können. Grundsätzlich kann je<strong>de</strong>s<br />

<strong>Unix</strong>/<strong>Linux</strong>-System auch ohne graphische Benutzeroberfläche betrieben wer<strong>de</strong>n. Auf Server-Systemen wird<br />

sogar bewusst darauf verzichtet, da dies nur unnütz Plattenplatz und Rechenzeit kosten wür<strong>de</strong>.<br />

Alle graphischen Benutzeroberflächen unter <strong>Unix</strong>/<strong>Linux</strong> basieren auf <strong>de</strong>m system- und netzwerk-unabhängigen<br />

X Window System.<br />

Der Ursprung <strong>de</strong>s X Window Systems liegt in zwei Projekten <strong>de</strong>r frühen 80er Jahre: ein Window-Projekt<br />

<strong>de</strong>r Standford Universität, bekannt als W und ein Projekt Athena <strong>de</strong>s Massachusetts Institute of Technology<br />

(MIT). 1983 gegrün<strong>de</strong>t und <strong>von</strong> MIT, Digital und IBM finanziert, hatte das Projekt Athena u.a. die Zielsetzung,<br />

ein netzwerkunabhängiges Graphikprotokoll innerhalb <strong>de</strong>r bunt gemischten Rechnerumgebung <strong>de</strong>r<br />

Universität zu entwickeln. Die MIT-Gruppe nahm W in ihr Entwicklungssystem auf und gab ihm <strong>de</strong>n zufälligen<br />

Namen X Window System. 1986 bot MIT die erste kommerzielle Version <strong>de</strong>s X Window Systems<br />

(X10) an und bil<strong>de</strong>te 1987 eine breitere Industriepartnerschaft, das X Konsortium, um eine kontinuierliche<br />

Entwicklung zu gewährleisten. Konsortiumsgründungsmitglie<strong>de</strong>r waren u.a. Tektronix, IBM, Sun, HP und<br />

AT&T.<br />

Das X Window System ist ein Softwarestandard, <strong>de</strong>r einen Rahmen für fensterbetriebene Anwendungen<br />

über das Netzwerk bietet. Es han<strong>de</strong>lt als eine Art Mittelsmann zwischen einer Anwendung und einem<br />

Darstellungssystem (X Terminal, Workstation, PC). Bei einer Benutzeroberfläche, die auf <strong>de</strong>m X Window<br />

System basiert, spielen grundsätzlich drei Komponenten zusammen: X-Server, X-Client und Windowmanager.<br />

Der X-Server läuft als eigener Prozess auf <strong>de</strong>m Darstellungssystem und verarbeitet <strong>de</strong>n Input <strong>von</strong> Devices<br />

wie Tastatur und Maus. Auch <strong>de</strong>r Input vom X-Client wird für die Darstellung verwen<strong>de</strong>t.<br />

Der X-Client ist die eigentliche Anwendung (z.B. xclock, xterm, xmaple) und kommuniziert mit <strong>de</strong>m X-<br />

Server über das standardisierte X11-Protokoll.<br />

Der Windowmanager ist verantwortlich für Fensterrahmen, Verschieben, Vergrößern und Verkleinern und<br />

Iconisiern <strong>von</strong> Fenstern. Je nach verwen<strong>de</strong>tem Windowmanager sieht das Layout auf <strong>de</strong>m Desktop etwas<br />

unterschiedlich aus. Das sog. ”Look and Feel” wird also vom Windowmanager bestimmt. Bekannte Windowmanager<br />

sind z.B. twm, mwm (Motif Window Manager), fvwm und dtwm (<strong>de</strong>r Windowmanager unter<br />

CDE). Bei <strong>Linux</strong>-Systemen sind außer<strong>de</strong>m die Windowmanager kwin unter KDE und icewm-gnome unter<br />

Gnome weit verbreitet.<br />

Durch die Aufteilung <strong>de</strong>r bei<strong>de</strong>n Funktionen Anwendung und Darstellung ist es möglich, X-Client und<br />

X-Server auf unterschiedlichen Rechnern ablaufen zu lassen. So kann <strong>de</strong>r X-Client z.B. auf einer Sun<br />

Workstation laufen, als Darstellungssystem wird aber ein PC mit X-Server- Software verwen<strong>de</strong>t. Dadurch<br />

kann die gleiche Benutzeroberfläche, die man unmittelbar an <strong>de</strong>r Workstation zur Verfügung hat, auch auf<br />

<strong>de</strong>m PC verwen<strong>de</strong>t wer<strong>de</strong>n.<br />

Für die individuelle Gestaltung <strong>de</strong>s Desktops kommen grundsätzlich zwei Möglichkeiten in Frage: Das<br />

interaktive Verän<strong>de</strong>rn <strong>de</strong>s Layouts mit anschließen<strong>de</strong>m Abspeichern und das Modifizieren <strong>von</strong> speziellen<br />

Dateien. Je nach<strong>de</strong>m, welcher Windowmanager eingestellt ist, muss entwe<strong>de</strong>r nach <strong>de</strong>r ersten o<strong>de</strong>r <strong>de</strong>r<br />

zweiten Metho<strong>de</strong> vorgegangen wer<strong>de</strong>n.<br />

Erfolgte das Login unter CDE, KDE o<strong>de</strong>r Gnome, so können mittels kleiner Hilfsprogramme (StyleManager,<br />

ControlCenter) vielfältige Modifikationen <strong>de</strong>s Desktops interaktiv vorgenommen wer<strong>de</strong>n (Hintergrundfarbe,<br />

Fensterrahmen, Mausverhalten usw.). Beim Ausloggen wird dann das aktuell vorhan<strong>de</strong>ne Desktop-<br />

Layout automatisch abgespeichert.


2. Erste Schritte 15<br />

Etwas schwieriger stellt sich die Modifikation <strong>de</strong>s Layouts unter <strong>de</strong>n Windowmanagern twm und fvwm dar.<br />

Für eine individuelle Gestaltung müssen hier diverse Dateien editiert wer<strong>de</strong>n. Im einzelnen han<strong>de</strong>lt es sich<br />

um die Dateien .xinitrc, .twmrc bzw. .fvwmrc und .X<strong>de</strong>faults bzw. .Xresources. Um zu<br />

erreichen, dass das Programm xterm (Terminalemulation) immer mit bestimmten gewünschten Einstellungen<br />

gestartet wird, können z.B. folgen<strong>de</strong> Definitionen in die Dateien .X<strong>de</strong>faults und .Xresources<br />

eingetragen wer<strong>de</strong>n.<br />

XTerm.VT100.Background: gray90<br />

XTerm.VT100.Foreground: black<br />

XTerm.VT100.font: 8x13<br />

XTerm*saveLines: 200<br />

Die erste Zeile legt die Hintergrundfarbe (Background) <strong>de</strong>r Terminalemulation auf einen bestimmten<br />

Grau-Ton fest (gray90). Die zweite Zeile <strong>de</strong>finiert die Vor<strong>de</strong>rgrundfarbe, also die Schrift (black). In <strong>de</strong>r<br />

dritten Zeile steht die Größe <strong>de</strong>s verwen<strong>de</strong>ten Fonts und die vierte Zeile legt fest, wieviel Zeilen (200) <strong>de</strong>r<br />

Text im Fenster zurückgescrollt wer<strong>de</strong>n kann. Derartige Modifikationen erfor<strong>de</strong>rn eine gewisse Erfahrung<br />

im Umgang mit <strong>de</strong>m X Window System. Gute Hilfen bieten hier die entsprechen<strong>de</strong>n Dokumentationen und<br />

die online manual-pages.<br />

Im folgen<strong>de</strong>n wird eine kurze Übersicht über die drei am häufigsten verwen<strong>de</strong>ten Desktop-Systeme KDE,<br />

Gnome und CDE gegeben.<br />

KDE-Desktop


2. Erste Schritte 16<br />

KDE ist im Prinzip in je<strong>de</strong>r <strong>Linux</strong>-Distribution enthalten und bietet eine Fülle <strong>von</strong> Anwen<strong>de</strong>rprogrammen.<br />

Augenfälliges Merkmal <strong>de</strong>s Desktops ist <strong>de</strong>r Session-Manager an <strong>de</strong>r Unterkante <strong>de</strong>s Bildschirms. Dieser<br />

Session-Manager ist quasi die Schaltzentrale für <strong>de</strong>n Desktop. Ungefähr in <strong>de</strong>r Mitte <strong>de</strong>s Session-Managers<br />

befin<strong>de</strong>n sich vier Schaltknöpfe (One - Four) für die Wahl <strong>de</strong>s virtuellen Bildschirms. Links daneben<br />

sind zwei Knöpfe zu sehen, die für das Logout und für <strong>de</strong>n LockScreen (Schloss) verantwortlich sind.<br />

Alle weiteren Icons ermöglichen entwe<strong>de</strong>r <strong>de</strong>n Start <strong>von</strong> Anwendungen (z.B. Editor) o<strong>de</strong>r <strong>de</strong>n Aufruf <strong>von</strong><br />

Popup-Menüs (erkenntlich an <strong>de</strong>n kleinen schwarzen Pfeilen).<br />

Gnome-Desktop<br />

Auch unter <strong>de</strong>m Gnome-Desktop gibt es in <strong>de</strong>r Standard-Konfiguration einen Session-Manager am unteren<br />

Bildschirmrand. Dieses ”Panel” enthält einige Icons für <strong>de</strong>n Start <strong>von</strong> Anwendungen (mit linker Maustaste<br />

nur einmal klicken) und dient auch als Ablageort für laufen<strong>de</strong> Anwendungen, die iconisiert wur<strong>de</strong>n. Zusätzlich<br />

befin<strong>de</strong>t sich am oberen Bildschirmrand eine weitere Leiste. In dieser Leiste lassen sich zum einen<br />

diverse Popup-Menüs aufrufen, zum an<strong>de</strong>ren befin<strong>de</strong>n sich dort die Schaltflächen für die Wahl <strong>de</strong>s virtuellen<br />

Bildschirms. Auf <strong>de</strong>r restlichen freien Bildschirmfläche wer<strong>de</strong>n gewöhnlich die graphischen Anwendungen<br />

plaziert. In obigem Beispiel sind dies xclock, xconsole, gnome-terminal und Control Center.<br />

Das Programm Contol Center bietet die Möglichkeit, <strong>de</strong>n Desktop individuell nach eigenen<br />

Wünschen einzustellen.


2. Erste Schritte 17<br />

CDE-Desktop<br />

Die CDE-Oberfläche (Common Desktop Environment) ist eine graphische Benutzeroberfläche, die architekurunabhängig<br />

auf <strong>Unix</strong>-Rechnern <strong>von</strong> Sun, HP, IBM und Digital zur Verfügung steht. Wie alle an<strong>de</strong>ren<br />

Benutzeroberflächen, basiert auch CDE auf <strong>de</strong>m X11-Protokoll-Standard. Kennzeichen <strong>de</strong>r CDE-<br />

Oberfläche ist wie auch bei KDE und Gnome ein Session-Manager am unteren Bildschirmrand. Dieser<br />

Session-Manager besitzt eine Reihe <strong>von</strong> Grundfunktionen, die individuell noch erweitert wer<strong>de</strong>n können.<br />

Uhr<br />

Lock Screen<br />

Default<br />

Printer<br />

Desktop<br />

Customizing<br />

Desktop-Hilfen<br />

Kalen<strong>de</strong>r<br />

Manager<br />

File Editor<br />

Manager<br />

Graphisches<br />

Mailtool<br />

Vier virtuelle<br />

Bildschirme<br />

Logout<br />

Application<br />

Manager<br />

Abfalleimer<br />

Befin<strong>de</strong>t sich oberhalb eines Symbols im Session-Manager ein kleiner Pfeil, so kann hier ein Popup-Menü<br />

mit weiteren Funktionen aktiviert wer<strong>de</strong>n (in obigem Bild z.B. über <strong>de</strong>m Editor-Symbol). <strong>Eine</strong> gute <strong>Einführung</strong><br />

in die Handhabung <strong>de</strong>s Desktops erhält man über das Symbol Desktop-Help im Session-Manager-<br />

Window (das Symbol mit <strong>de</strong>m Fragezeichen).


2. Erste Schritte 18<br />

Die drei gezeigten Desktop-Varianten dürften wohl <strong>de</strong>n Hauptteil aller weltweit eingesetzten graphischen<br />

Benutzeroberflächen auf <strong>Unix</strong>/<strong>Linux</strong>-Systemen ausmachen. Als gemeinsames Element tritt hierbei <strong>de</strong>r<br />

Session-Manager hervor. Auch im gesamten läßt sich eine Ähnlichkeit in <strong>de</strong>r Handhabung feststellen, was<br />

das abwechseln<strong>de</strong> Arbeiten auf verschie<strong>de</strong>nen Systemen vereinfacht. Die Wahl eines bestimmten Desktops<br />

bzw. Desktop-Layouts wird sich sicherlich aus <strong>de</strong>m persönlichen Geschmacksempfin<strong>de</strong>n <strong>de</strong>s Benutzers<br />

ergeben. Die Funktionalität ist überall gleich.<br />

Die Benutzerumgebung wird nicht alleine durch die graphische Benutzeroberfläche bestimmt. Beim Login<br />

nimmt das System eine ganze Reihe <strong>von</strong> Definitionen vor, die aus sog. Setup-Dateien gelesen wer<strong>de</strong>n.<br />

Diese Definitionen wer<strong>de</strong>n meist in globalen Variablen abgelegt. So kennt CDE z.B. Variable wie<br />

DTXSERVERLOCATION o<strong>de</strong>r DTDATABASESEARCHPATH, Gnome setzt eine Variable namens GNO-<br />

ME_SESSION_NAME und KDE kennt Definitionen wie GTK_RC_FILES und KDE_MULTIHEAD. Zusätzlich<br />

kommen auch noch die Definitionen aus <strong>de</strong>n Login-Setup-Dateien hinzu, die beispielsweise die<br />

Wirkungsweise <strong>von</strong> bestimmten ctrl-keys regeln o<strong>de</strong>r die bevorzugte Terminalemulation festlegen (siehe<br />

Kapitel ”Der Login-Prozess”).<br />

2.4. <strong>Unix</strong>-Dokumentation<br />

Der Nutzen je<strong>de</strong>r Software hängt entschei<strong>de</strong>nd <strong>von</strong> <strong>de</strong>r Qualität <strong>de</strong>r verfügbaren Software-Dokumentation<br />

ab. Die Dokumentation <strong>von</strong> <strong>Unix</strong>/<strong>Linux</strong>-Betriebssystemen kann in unterschiedlichem Umfang und unterschiedlicher<br />

Form erfolgen. Neben <strong>de</strong>r <strong>Unix</strong>-Dokumentation in Buchform (je nach System 10 - 20 Ordner)<br />

stehen <strong>de</strong>m Benutzer auch on-line-Hilfen zur Verfügung.<br />

Manual-Pages geben einen kompakten Überblick über die wichtigsten Kommandos und Themen.<br />

Desktop-Hilfen bieten eine Art <strong>Einführung</strong> zur Handhabung <strong>de</strong>r graphischen Benutzeroberfläche.<br />

Hypertext-Systeme stellen die umfassendste Dokumentation <strong>de</strong>s Systems dar. Die gesamte System-<br />

Dokumentation ist als Web-Dokument verfügbar.<br />

Die klassische Form <strong>de</strong>r Dokumentation bil<strong>de</strong>n die Manual-Pages. Sie sind in je<strong>de</strong>r System-Distribution<br />

vorhan<strong>de</strong>n und glie<strong>de</strong>rn sich thematisch in acht Teile (sections):<br />

1 User Commands<br />

2 System Calls<br />

3 Subroutines<br />

4 Special files<br />

5 File formats, conventions<br />

6 Games<br />

7 Macro packages and language conventions<br />

8 Maintenance, commands and procedures<br />

Innerhalb dieser acht Sektionen wird eine alphabetische Reihenfolge eingehalten. Die Dokumentation <strong>de</strong>r<br />

einzelnen Themen ist maximal komprimiert.


2. Erste Schritte 19<br />

Ein Dokumentationseintrag besteht meist aus folgen<strong>de</strong>n Teilen:<br />

NAME<br />

SYNOPSIS<br />

DESCRIPTION<br />

OPTIONS<br />

FILES<br />

SEE ALSO<br />

DIAGNOSTICS<br />

BUGS<br />

EXAMPLES<br />

Name und Kurzbeschreibung <strong>de</strong>s Themas<br />

Syntax <strong>de</strong>s Kommandos mit Optionen und Argumenten<br />

”Detaillierte Beschreibung”<br />

Beschreibung aller wählbaren Optionen<br />

mit <strong>de</strong>m Thema zusammenhängen<strong>de</strong> Dateien<br />

Hinweise auf verwandte Themen<br />

Erklärung <strong>von</strong> stark verkürzten Fehlermeldungen<br />

bekannte Fehler<br />

Verwendungsbeispiele (nicht immer vorhan<strong>de</strong>n)<br />

Die Anzahl und Art <strong>de</strong>r Unterpunkte eines Dokumentationseintrages können <strong>von</strong> Fall zu Fall unterschiedlich<br />

sein. So kann durchaus einmal <strong>de</strong>r Abschnitt DIAGNOSTICS fehlen, während dafür Punkte wie USAGE<br />

und NOTES erwähnt wer<strong>de</strong>n. Auch <strong>de</strong>r Umfang <strong>de</strong>r DESCRIPTION kann sehr verschie<strong>de</strong>n sein. Oft ist die<br />

DESCRIPTION ausreichend, manchmal wünscht man sich aber eine ausführlichere Beschreibung.<br />

Der wichtigste Teil <strong>de</strong>r Doku-Einträge ist die Synopsis, wobei bei Kommandos folgen<strong>de</strong>s gilt:<br />

kommando ist wörtlich zu übernehmen<br />

[...] alles in eckigen Klammern ist optional<br />

file Dateiname<br />

... eine Wie<strong>de</strong>rholung <strong>de</strong>s vorherigen Arguments ist möglich<br />

Die Einträge <strong>de</strong>r Manual-Pages können mit <strong>de</strong>m Kommando man kommando abgerufen wer<strong>de</strong>n. <strong>Eine</strong><br />

<strong>Einführung</strong> in die Handhabung <strong>de</strong>s man-Kommandos erhält man durch <strong>de</strong>n Befehl man man.<br />

rechner> man ls<br />

User Commands<br />

ls(1)<br />

NAME<br />

ls - list contents of directory<br />

SYNOPSIS<br />

/usr/bin/ls [-aAbcCdfFghilLmnopqrRstux1@] [file...]<br />

/usr/xpg4/bin/ls [-aAbcCdfFghilLmnopqrRstux1@] [file...]<br />

DESCRIPTION<br />

For each file that is a directory, ls lists the contents of<br />

the directory. For each file that is an ordinary file, ls<br />

repeats its name and any other information requested. The<br />

output is sorted alphabetically by <strong>de</strong>fault. When no argument<br />

is given, the current directory is listed. When several<br />

arguments are given, the arguments are first sorted<br />

appropriately, but file arguments appear before directories<br />

and their contents.<br />

...<br />

Obiges Listing zeigt <strong>de</strong>n Bildschirm-Output <strong>de</strong>s Kommandos man ls auf einem <strong>Unix</strong>-System (Sun).


2. Erste Schritte 20<br />

Das gleiche Kommando auf einem <strong>Linux</strong>-System ausgeführt zeigt folgen<strong>de</strong>n Output.<br />

rechner> man ls<br />

VDIR(1) FSF VDIR(1)<br />

NAME<br />

ls - zeigt Verzeichnisinhalt an<br />

ÜBERSICHT<br />

ls [OPTION]... [DATEI]...<br />

BESCHREIBUNG<br />

Auflistung <strong>von</strong> Informationen <strong>de</strong>r DATEIen (Standardvorgabe<br />

ist das momentane Verzeichnis). Alphabetisches Sortieren<br />

<strong>de</strong>r Einträge, falls we<strong>de</strong>r -cftuSUX noch --sort angegeben.<br />

-a, --all<br />

Einträge, die mit . beginnen, nicht verstecken.<br />

-A, --almost-all<br />

Keine Anzeige implizierter . und ..<br />

...<br />

Da auf <strong>Linux</strong>-Rechnern meist ”Deutsch” als Sprachumgebung eingestellt ist, wird bei <strong>de</strong>n manual-pages<br />

auch <strong>de</strong>utscher Text angezeigt. Aber noch an<strong>de</strong>re Unterschie<strong>de</strong> zeigen sich. Der Beschreibungstext bei<br />

<strong>de</strong>r <strong>Linux</strong>-Dokumentation ist sehr kurz, während unter <strong>Unix</strong> doch eine ausführlichere Beschreibung <strong>de</strong>s<br />

Kommandos wi<strong>de</strong>rgegeben wird. Oft wird man auch feststellen können, dass sich die Optionen für das<br />

gleiche Kommando auf <strong>de</strong>n verschie<strong>de</strong>nen <strong>Unix</strong>- bzw. <strong>Linux</strong>-Varianten etwas unterschei<strong>de</strong>n.<br />

Zwei weitere Anwendungsmöglichkeiten <strong>de</strong>s man-Kommandos sind die Schlüsselwortsuche und <strong>de</strong>r gezielte<br />

Zugriff auf Themen in speziellen Sektionen.<br />

rechner> man -k key<br />

Schlüsselwortsuche in <strong>de</strong>n manual-pages; als key kann je<strong>de</strong>r beliebige Begriff<br />

verwen<strong>de</strong>t wer<strong>de</strong>n, <strong>de</strong>r in irgen<strong>de</strong>iner Weise in <strong>de</strong>r Dokumentation steht.<br />

rechner> man -f key<br />

Konkrete Suche nach einem bestimmten Begriff (key); es wer<strong>de</strong>n aus <strong>de</strong>n<br />

kompletten manual-pages nur die Einträge herausgesucht, die <strong>de</strong>m gesuchten<br />

Begriff korrekt entsprechen.<br />

rechner> man -k mount<br />

Alle mit mount zusammenhängen<strong>de</strong> Themen samt Kurzbeschreibung wer<strong>de</strong>n<br />

aufgelistet.<br />

rechner> man -f mount<br />

Es wer<strong>de</strong>n nur Einträge, die <strong>de</strong>n korrekten Begriff mount im NAME-Feld<br />

besitzen, angezeigt.<br />

Über eine Schlüsselwortsuche können zu einem bestimmten Begriff manchmal mehrere Einträge erscheinen.<br />

Hinter <strong>de</strong>n Einträgen stehen in Klammern die Sektionen, in <strong>de</strong>nen die Begriffe dokumentiert wer<strong>de</strong>n. Mit


2. Erste Schritte 21<br />

Hilfe dieser Sektionsnummern kann dann gezielt auf <strong>de</strong>n gewünschten Dokumentationseintrag zugegriffen<br />

wer<strong>de</strong>n. Unter <strong>Linux</strong> erfolgt dies mit <strong>de</strong>r Option -S und unter Sun Solaris mit <strong>de</strong>r Option -s.<br />

rechner> man -f autofs<br />

autofs (8)<br />

autofs (5)<br />

- Control Script for automounter<br />

- Format of the automounter maps<br />

rechner> man -S 8 autofs<br />

rechner> man -s 2 mount<br />

Die Manual-Pages stellen die grundlegen<strong>de</strong> online-Dokumentation auf je<strong>de</strong>m <strong>Unix</strong>/<strong>Linux</strong>-System dar. Trotz<br />

<strong>de</strong>r manchmal etwas knappen Beschreibung sind sie eine gute Hilfe bei <strong>de</strong>r täglichen Arbeit. <strong>Eine</strong> Vertiefung<br />

in ein spezielles Thema erlauben die Manual-Pages allerdings nicht. Umfangreichere Dokumentationen<br />

bieten entwe<strong>de</strong>r gedruckte Medien o<strong>de</strong>r sog. Dokumentations-Server. Aufgrund <strong>de</strong>r besseren<br />

Aktualität sind Dokumentations-Server vorzuziehen. Sie enthalten die komplette gedruckte Dokumentation<br />

und unterstützen die themenbezogene Suche. <strong>Eine</strong> gute Dokumentation <strong>von</strong> Sun Solaris ist unter<br />

<strong>de</strong>r Web-Adresse docs.sun.com zu fin<strong>de</strong>n. Zahlreiche <strong>Linux</strong>-Dokumentationen sind nicht nur als<br />

gedruckte Bücher im Buchhan<strong>de</strong>l, son<strong>de</strong>rn auch als Web-Dokumente im Internet vertreten. Die Adresse<br />

www.tldp.org/gui<strong>de</strong>s.html soll hier nur als Beispiel genannt wer<strong>de</strong>n.<br />

2.5. Spezialzeichen und reguläre Ausdrücke<br />

Beim interaktiven Arbeiten auf Kommandozeilenebene gibt es eine Reihe <strong>von</strong> Zeichen, die für die Interpretation<br />

<strong>de</strong>r Eingabe eine spezielle Be<strong>de</strong>utung haben.<br />

* expandiert zu einem beliebigen String<br />

? expandiert zu genau einem Zeichen<br />

[...] expandiert zu genau einem Zeichen aus <strong>de</strong>r angegebenen Zeichenliste<br />

~ expandiert zum HOME-Directory<br />

{...} expandiert zu <strong>de</strong>n angegebenen Strings<br />

$ Zeichen für die Referenz auf eine shell-Variable<br />

\ maskiert das nachfolgen<strong>de</strong> Son<strong>de</strong>rzeichen, Fortsetzung einer Zeile<br />

’...’ maskiert <strong>de</strong>n in Hochkommas eingschlossenen Text<br />

"..." maskiert <strong>de</strong>n in <strong>de</strong>n doppelten Hochkommas eingeschlossenen Text<br />

ausser <strong>de</strong>n Zeichen $ \ ‘<br />

Unter <strong>de</strong>r Maskierung <strong>von</strong> Zeichen versteht man das Verbergen vor einer Interpretation seitens <strong>de</strong>r loginshell.<br />

Dies ist vor allem dann erfor<strong>de</strong>rlich, wenn eine Zeichenkette (string) mit Son<strong>de</strong>rzeichen an ein externes<br />

Kommando weitergegeben wer<strong>de</strong>n soll.<br />

Einige <strong>de</strong>r oben erwähnten Spezialzeichen wer<strong>de</strong>n auch bei <strong>de</strong>r Beschreibung regulärer Ausdrücke verwen<strong>de</strong>t.<br />

Ein regulärer Ausdruck ist eine Folge <strong>von</strong> Textzeichen und/o<strong>de</strong>r Spezialzeichen. Die Spezialzeichen<br />

stellen Operatoren dar, mit <strong>de</strong>ren Hilfe komplexe Textmuster beschrieben wer<strong>de</strong>n können. Derartige Muster<br />

können in verschie<strong>de</strong>nen Kommandos als Textfilter verwen<strong>de</strong>t wer<strong>de</strong>n.


2. Erste Schritte 22<br />

Die Operatoren in regulären Ausdrücken haben folgen<strong>de</strong> Be<strong>de</strong>utung:<br />

. Platzhalter für ein beliebiges Zeichen<br />

[...] Platzhalter für genau ein Zeichen aus <strong>de</strong>r angegebenen Menge<br />

a* a kann nullmal o<strong>de</strong>r öfter hintereinan<strong>de</strong>r vorkommen<br />

a? a kann nullmal o<strong>de</strong>r einmal vorkommen<br />

a+ a kann einmal o<strong>de</strong>r öfter hintereinan<strong>de</strong>r vorkommen<br />

^ Vorkommen am Zeilenanfang<br />

$ Vorkommen am Zeilenen<strong>de</strong><br />

| o<strong>de</strong>r-Verknüpfung<br />

Reguläre Ausdrücke wer<strong>de</strong>n bei <strong>de</strong>r Verwendung mit <strong>de</strong>n Kommandos grep und egrep in einfache<br />

Hochkommas eingeschlossen, bei <strong>de</strong>r Verwendung mit awk stehen sie zwischen Schrägstrichen (/).<br />

rechner> egrep ’^....[km]’ .mailrc<br />

set keep<br />

set keepsave<br />

set metoo<br />

set keepmovedialog=’0’<br />

set keepaddattachdialog=’0’<br />

In obigem Beispiel wer<strong>de</strong>n mit <strong>de</strong>m Kommando egrep aus <strong>de</strong>r Datei .mailrc alle Zeilen herausgefiltert,<br />

die <strong>de</strong>m angegebenen Textmuster entsprechen (die ersten vier Zeichen können beliebig aussehen, das<br />

fünfte Zeichen darf aus einem k o<strong>de</strong>r m bestehen und das Muster muss am Zeilenanfang erscheinen).<br />

Für die Interaktion auf Kommandozeilenebene sind noch einige Control-Tastensequenzen relevant. So<br />

löscht u <strong>de</strong>n Text in <strong>de</strong>r aktuellen Eingabezeile, c bricht das laufen<strong>de</strong> Programm<br />

ab, z suspendiert ein laufen<strong>de</strong>s Programm und d been<strong>de</strong>t eine Eingabe auf Standard-<br />

Input. Die Eingabe <strong>von</strong> q been<strong>de</strong>t bei Auflistungen durch die Kommandos man und more die Ausgabe.


3. Kommandos und Prozesse<br />

Beim Hochfahren (Booten) eines <strong>Unix</strong>/<strong>Linux</strong>-Systems wird eine Reihe <strong>von</strong> Prozessen gestartet. Ausgehend<br />

<strong>von</strong> einem Wurzel-Prozess wird so nach und nach eine baumartige, hierarchische Struktur <strong>von</strong> Prozessen<br />

erzeugt.<br />

PID 1<br />

Vater-Prozess<br />

PID 23 PID 34<br />

Kind-Prozesse<br />

PID 45 PID 47 PID 52<br />

Enkelkind-Prozesse<br />

Abbildung 3.1.: Hierarchische Prozess-Struktur<br />

Ein Prozess ist ein in einem <strong>de</strong>finierten Hard- und Software-Kontext laufen<strong>de</strong>s Programm. Innerhalb eines<br />

Prozesses können mehrere Programme abgearbeitet wer<strong>de</strong>n, an<strong>de</strong>rerseits kann ein Prozess auch weitere<br />

untergeordnete sog. Kindprozesse erzeugen. Je<strong>de</strong>r Prozess besitzt eine einein<strong>de</strong>utige Prozessi<strong>de</strong>ntifikationsnummer<br />

(PID) und ist einem ein<strong>de</strong>utigen Benutzer zugeordnet (UID). Neue Prozesse können nur <strong>von</strong><br />

einem bereits laufen<strong>de</strong>n Prozess gestartet wer<strong>de</strong>n, so dass daraus eine gesamte Prozess-Hierarchie entsteht.<br />

Der Urvater aller Prozesse ist <strong>de</strong>r init-Prozess. Er besitzt die PID 1. Wie aus <strong>de</strong>r Prozess-Hierarchie zu<br />

erkennen ist, sind die Prozesse <strong>von</strong>einan<strong>de</strong>r abhängig. Da ein übergeordneter Prozess in <strong>de</strong>r Regel einen<br />

untergeordneten Prozess kontrolliert, be<strong>de</strong>utet eine Termination eines Prozesses auch ein Sterben aller <strong>von</strong><br />

ihm abhängigen untergeordneten Prozesse.<br />

Unter <strong>Unix</strong>/<strong>Linux</strong> wird zwischen Vor<strong>de</strong>rgrund- und Hintergrundprozessen unterschie<strong>de</strong>n. Vor<strong>de</strong>rgrundprozesse<br />

sind interaktive Prozesse, die über ein Gerät (Device) kontrolliert wer<strong>de</strong>n (z.B. Login-shell). Die<br />

Klasse <strong>de</strong>r Hintergrundprozesse wird eingeteilt in interaktive Hintergrundprozesse und in sog. Daemon-<br />

Prozesse. Daemon-Prozesse sind Endlosprozesse, die auf ein bestimmtes Ereignis warten und keinem<br />

Device zugeordnet sind. Der Prozess nfsd ist ein solcher Daemon-Prozess. Er ist dafür zuständig, ein<br />

Filesystem remote über das Datennetz zur Verfügung zu stellen.


3. Kommandos und Prozesse 24<br />

3.1. Der Login-Prozess<br />

Beim Login wird ebenfalls ausgehend vom init-Prozess eine Hierarchie <strong>von</strong> Benutzer-Prozessen aufgebaut,<br />

an <strong>de</strong>ren En<strong>de</strong> <strong>de</strong>r Start aller Anwendungen steht. Während <strong>de</strong>s Login-Vorgangs wer<strong>de</strong>n, abhängig <strong>von</strong><br />

<strong>de</strong>r Login-shell und <strong>de</strong>m zu starten<strong>de</strong>n Desktop, verschie<strong>de</strong>ne Dateien ausgelesen und die dort befindlichen<br />

Definitionen aktiviert. Diese Dateien wer<strong>de</strong>n auch setup-Dateien genannt.<br />

init login passwd- und group-Daten<br />

/etc/csh.cshrc<br />

/etc/csh.login<br />

$HOME/.cshrc<br />

$HOME/.login<br />

<strong>de</strong>sktopsetup<br />

shell<br />

Start <strong>von</strong> Anwendungen<br />

Abbildung 3.2.: Login-Vorgang beim tcsh-Login<br />

Je<strong>de</strong>r Login-Vorgang beginnt mit <strong>de</strong>r I<strong>de</strong>ntitäts-Prüfung <strong>de</strong>s Benutzers (passwd, group). Mit <strong>de</strong>n Dateien<br />

/etc/csh.cshrc und /etc/csh.login wer<strong>de</strong>n zunächst globale Einstellungen vorgenommen, die<br />

für je<strong>de</strong>n Benutzer gelten, <strong>de</strong>r sich auf <strong>de</strong>m System einloggt. Alle weiteren Dateien befin<strong>de</strong>n sich im HOME-<br />

Verzeichnis <strong>de</strong>s Benutzers und sind für die individuellen Einstellungen verantwortlich.<br />

/etc/csh.cshrc<br />

/etc/csh.login<br />

$HOME/.cshrc<br />

In dieser Datei wer<strong>de</strong>n globale Pfa<strong>de</strong>, Variable und aliases gesetzt.<br />

set path = ( /usr/local/bin /usr/bin )<br />

setenv MAIL ${HOME}/Mail/Inbox<br />

setenv EDITOR vi<br />

alias rm ’rm -i’<br />

Hier befin<strong>de</strong>n sich meist globale Einstellungen zum Terminaltyp.<br />

/usr/bin/stty -istrip<br />

setenv TERM vt100<br />

Individuelle Erweiterungen zu <strong>de</strong>n globalen Einstellungen.<br />

set path = ( $path $HOME/bin )<br />

source ~/.myalias


3. Kommandos und Prozesse 25<br />

$HOME/.login<br />

Individuelle Terminal-Settings. Definitionen für spezielle Anwendungen.<br />

setenv ENVIRONMENT ’NOBATCH’<br />

All diese Dateien legen mit ihren Definitionen die gesamte Benutzerumgebung fest. Je nach<strong>de</strong>m, welche<br />

Login-shell für einen Benutzer eingetragen ist, wer<strong>de</strong>n die für diese Login-shell relevanten Dateien<br />

ausgelesen und die dort vorhan<strong>de</strong>nen Einstellungen aktiviert. Die oben erwähnten Dateien sind für die<br />

tcsh als Login-shell gültig. Wird die bash als Login-shell benutzt, so wer<strong>de</strong>n für die Definitionen<br />

beim Login die Dateien /etc/profile, $HOME/.bash_profile, $HOME/.bash_login und<br />

$HOME/.profile benutzt. Für das Desktop-Setup sind je nach gewählter Oberfläche die im HOME-<br />

Verzeichnis vorhan<strong>de</strong>nen Unterverzeichnisse .dt ( für CDE), .k<strong>de</strong> bzw. .k<strong>de</strong>2 ( für KDE) und<br />

.gnome... (für Gnome) sowie die setup-Dateien .dtprofile und .k<strong>de</strong>rc verantwortlich.<br />

3.2. Kommandoeingabe<br />

Kommandos sind Bildschirm-Eingaben (meist in einem Terminal-Fenster), die <strong>von</strong> <strong>de</strong>r aktuell laufen<strong>de</strong>n<br />

shell (Kommandointerpreter) abgearbeitet wer<strong>de</strong>n. Unter <strong>Unix</strong>/<strong>Linux</strong> existieren drei verschie<strong>de</strong>ne Typen<br />

<strong>von</strong> Kommandos:<br />

shell-interne Kommandos (z.B. cd, echo); diese Kommandos wer<strong>de</strong>n innerhalb <strong>de</strong>r shell abgewickelt;<br />

es wird kein eigener Sub-Prozess gestartet<br />

externe Kommandos; die Abarbeitung erfolgt in einem untergeordneten Prozess<br />

Benutzerprogramme und -prozeduren<br />

Das einfache Kommando<br />

command [ arguments ]<br />

rechner> date<br />

rechner> id<br />

rechner> finger<br />

rechner> logname<br />

rechner> mkdir text<br />

Ausgabe <strong>de</strong>s aktuellen Datums<br />

Ausgabe <strong>de</strong>r eigenen Benutzeri<strong>de</strong>ntität<br />

Auflisten aller eingeloggten Benutzer<br />

Ausgabe <strong>de</strong>s Login-Namens<br />

Anlegen eines Subdirectories namens text<br />

Die Kommandofolge<br />

command1; command2; command3; ...<br />

rechner> date; finger; ls /tmp<br />

Ausgabe <strong>de</strong>s aktuellen Datums, <strong>de</strong>r eingeloggten Benutzer und Auflisten <strong>de</strong>s<br />

Verzeichnisses /tmp<br />

Die Kommandofolge besteht also aus mehreren einzelnen Kommandos, die jeweils durch ein Semikolon<br />

getrennt <strong>von</strong> links nach rechts abgearbeitet wer<strong>de</strong>n. Als Argumente können Dateinamen, Optionen und<br />

Ausdrücke verwen<strong>de</strong>t wer<strong>de</strong>n. Argumente wer<strong>de</strong>n durch Leerzeichen <strong>von</strong>einan<strong>de</strong>r getrennt.


3. Kommandos und Prozesse 26<br />

Die Kommandogruppe<br />

( command1; command2; command3; ... )<br />

rechner> ( date; finger; ls /tmp )<br />

Ausgabe <strong>de</strong>s aktuellen Datums, <strong>de</strong>r eingeloggten Benutzer und Auflisten <strong>de</strong>s<br />

Verzeichnisses /tmp<br />

Die Gruppierung erfolgt durch Einschluss einer Kommandofolge in run<strong>de</strong> Klammern. Im Gegensatz zur<br />

Kommandofolge wer<strong>de</strong>n die Anweisungen in <strong>de</strong>r Kommandogruppe in einem separaten untergeordneten<br />

Prozess abgearbeitet.<br />

Das Pipelining<br />

command1 | command2 | command3 | ...<br />

rechner> ps -ef | grep root | head -10<br />

Das Kommando ps -ef gibt alle laufen<strong>de</strong>n Prozesse aus, grep root filtert<br />

aus <strong>de</strong>r gesamten Liste nur die Prozesse heraus, die <strong>de</strong>m Benutzer root<br />

gehören und head -10 gibt <strong>von</strong> <strong>de</strong>r verbleiben<strong>de</strong>n Liste die ersten 10 Zeilen<br />

am Bildschirm aus.<br />

rechner> ( ls -l /tmp; ls -l /var ) | wc -l<br />

Übergabe <strong>de</strong>s gesammelten Outputs bei<strong>de</strong>r ls-Kommandos an das Kommando<br />

wc<br />

Der Output <strong>von</strong> command1 wird unmittelbar als Input für command2 verwen<strong>de</strong>t, <strong>de</strong>r Output <strong>von</strong> command2<br />

als Input für command3 usw. Im zweiten Beispiel wird die Be<strong>de</strong>utung <strong>de</strong>r Kommandogruppe<br />

<strong>de</strong>utlich. Wür<strong>de</strong>n die run<strong>de</strong>n Klammern wegfallen, so wür<strong>de</strong> das wc-Kommando nur <strong>de</strong>n Output vom unmittelbar<br />

davor stehen<strong>de</strong>n ls-Kommando erhalten.<br />

3.3. Prozesskontrolle<br />

Ein laufen<strong>de</strong>s <strong>Unix</strong>/<strong>Linux</strong>-System besteht aus einer Vielzahl <strong>von</strong> Prozessen, die entwe<strong>de</strong>r beim Booten <strong>de</strong>s<br />

Systems o<strong>de</strong>r durch Benutzer-Aktivitäten (Login, Programmaufruf) erzeugt wer<strong>de</strong>n. Je<strong>de</strong>r Prozess ist einem<br />

Benutzer zugeordnet und kann daher auch <strong>von</strong> diesem Benutzer kontrolliert wer<strong>de</strong>n. Viele Prozesse gehören<br />

z.B. <strong>de</strong>m Benutzer root und können nur vom Benutzer root, also <strong>de</strong>m Systemadministrator, beeinflußt<br />

wer<strong>de</strong>n. Auf alle Prozesse, die einem Benutzer gehören, hat dieser Benutzer selbst administrativen Einfluß.<br />

Für das Auflisten <strong>de</strong>r Prozess-Tabelle wird das Kommando ps verwen<strong>de</strong>t. Immer wenn Informationen über<br />

laufen<strong>de</strong> Prozesse benötigt wer<strong>de</strong>n, sollte dieses Kommando benutzt wer<strong>de</strong>n. Je nach gewählter Option<br />

liefert ps Informationen über alle Prozesse o<strong>de</strong>r nur über Prozesse, die <strong>von</strong> <strong>de</strong>r aktuellen Position in <strong>de</strong>r<br />

Prozess-Hierarchie erzeugt wur<strong>de</strong>n.<br />

rechner> ps -f<br />

UID PID PPID C STIME TTY TIME CMD<br />

puw09523 10005 9997 0 Oct 02 pts/4 0:01 tcsh<br />

puw09523 13853 10005 0 08:24:44 pts/4 0:02 xdvi -bg white in<strong>de</strong>x<br />

puw09523 13855 13853 0 08:25:01 pts/4 0:03 gs -sDEVICE=x11 -dNOPAUSE<br />

puw09523 13848 10005 0 08:15:18 pts/4 0:01 /usr/openwin/bin/textedit


3. Kommandos und Prozesse 27<br />

rechner> ps -l<br />

F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD<br />

8 S 9523 10005 9997 0 41 20 f5bb2cc0 325 f5bb2e90 pts/4 0:01 tcsh<br />

8 S 9523 13853 10005 0 57 20 f6000010 775 f5e64066 pts/4 0:02 xdvi<br />

8 S 9523 13855 13853 0 67 20 f60a4980 1213 f606f8d4 pts/4 0:03 gs<br />

8 S 9523 13848 10005 0 51 20 f60a3cc0 1070 f5e6430e pts/4 0:01 textedit<br />

Mit <strong>de</strong>n oben gezeigten Kommandos sieht man alle eigenen Prozesse, die <strong>von</strong> <strong>de</strong>r aktuellen Position <strong>de</strong>r<br />

Prozess-Hierarchie erzeugt wur<strong>de</strong>n. Dabei kann auch an Hand <strong>de</strong>r PID- und PPID-Nummern das Abhängigkeitsverhältnis<br />

in <strong>de</strong>r Prozess-Hierarchie nachvollzogen wer<strong>de</strong>n. Sollen alle Prozesse angezeigt wer<strong>de</strong>n,<br />

die auf <strong>de</strong>m System laufen, so erfolgt dies mit <strong>de</strong>m Kommando ps -ef | more.<br />

Die vom ps-Kommando gelieferten Daten haben im einzelnen folgen<strong>de</strong> Be<strong>de</strong>utung:<br />

UID<br />

PID<br />

PPID<br />

STIME<br />

TIME<br />

TTY<br />

ADDR<br />

WCHAN<br />

CMD<br />

PRI<br />

NI<br />

SZ<br />

C<br />

F<br />

S<br />

Benutzer-I<strong>de</strong>ntifikation <strong>de</strong>s Prozesseigentümers<br />

einein<strong>de</strong>utige Prozess-Nummer<br />

Prozess-Nummer <strong>de</strong>s Eltern-Prozesses (Parent PID)<br />

Uhrzeit, wann <strong>de</strong>r Prozess gestartet wur<strong>de</strong><br />

bisher vom Prozess verbrauchte CPU-Zeit<br />

das <strong>de</strong>m Prozess zugeordnete Pseudo-Terminal<br />

Hauptspeicher- o<strong>de</strong>r Plattenadresse <strong>de</strong>s Prozesses<br />

Adresse eines Events, auf <strong>de</strong>n <strong>de</strong>r Prozess wartet<br />

Name <strong>de</strong>s Kommandos, das <strong>de</strong>n Prozess gestartet hat<br />

aktuelle Priorität <strong>de</strong>s Prozesses (je kleiner <strong>de</strong>sto grösser die Priorität)<br />

nice-Parameter für die Prioritätsberechnung<br />

Grösse <strong>de</strong>s Prozesses im Hauptspeicher in kByte<br />

systeminterner Scheduling-Parameter<br />

systeminterne flags (hat nur noch historische Be<strong>de</strong>utung)<br />

Status (S=sleeping, O=running, R=runnable, Z=zombie, T=stopped)<br />

Das ps-Kommando stellt ein wichtiges Hilfsmittel zur Prozess-Überwachung dar. Kombiniert mit <strong>de</strong>n<br />

Kommandos grep und sort ermöglicht es verschie<strong>de</strong>ne Selektionen aus <strong>de</strong>r kompletten Prozess-Liste.<br />

rechner> ps -ef | grep ssh<br />

Selektion aller ssh-Prozesse<br />

Es gibt noch weitere Kommandos, die Informationen über laufen<strong>de</strong> Prozesse liefern. So geben die Befehle<br />

ptree unter Sun Solaris und pstree unter <strong>Linux</strong> alle Prozesse in hierarchischer Struktur aus.<br />

rechner> ptree $LOGNAME | more<br />

rechner> pstree -p $LOGNAME | more<br />

Prozess-Hierarchie unter Solaris<br />

Prozess-Hierarchie unter <strong>Linux</strong><br />

Bei<strong>de</strong> Kommandos listen die Prozess-Struktur <strong>de</strong>s eingeloggten Benutzers auf.<br />

Das Verhalten <strong>de</strong>r eigenen Prozesse kann vom Prozesseigentümer gesteuert wer<strong>de</strong>n. So ist es möglich,<br />

Prozesse zu suspendieren, zu terminieren und mit vermin<strong>de</strong>rter Priorität zu starten. Auch das Absetzen <strong>von</strong><br />

Hintergrundprozessen und die Beobachtung <strong>de</strong>r Prozess-Aktivität wird in diesem Zusammenhang erwähnt.<br />

Prozess als Hintergrund-Prozess starten<br />

command [ arguments ] &<br />

nohup command [ arguments ] &


3. Kommandos und Prozesse 28<br />

Ein Prozess wird durch Anfügen <strong>de</strong>s Zeichens & in <strong>de</strong>n Hintergrund versetzt. Als Information erhält man<br />

vom System eine relative [jobid] in eckigen Klammern und eine einein<strong>de</strong>utige Prozessi<strong>de</strong>ntifikationsnummer<br />

(PID). Standardausgabe- und Standardfehlerausgabe-Medium bleibt weiterhin das Pseudoterminal,<br />

<strong>von</strong> <strong>de</strong>m aus <strong>de</strong>r Hintergrundprozess gestartet wur<strong>de</strong>. Das Starten eines Hintergrundprozesses mit <strong>de</strong>m<br />

Kommando nohup verhin<strong>de</strong>rt ein Terminieren <strong>de</strong>s Prozesses beim Ausloggen aus <strong>de</strong>m System. Der Sinn<br />

<strong>von</strong> Hintergrundprozessen ist <strong>de</strong>r, dass zum einen die interaktive Terminal-Eingabe nicht blockiert wird,<br />

und zum an<strong>de</strong>ren ein Logout aus <strong>de</strong>m System möglich ist, ohne einen Abbruch <strong>de</strong>s Hintergrundprozesses<br />

zu bewirken (beim Start mit nohup). Der Prozess wird mit nohup quasi aus <strong>de</strong>r Hierarchie entkoppelt.<br />

Mit <strong>de</strong>m Kommando jobs -l wer<strong>de</strong>n alle gestarteten Hintergrundprozesse mit ihrem Status aufgelistet.<br />

rechner> xclock &<br />

[1] 22656<br />

rechner> xterm &<br />

[2] 22660<br />

rechner> jobs -l<br />

[1] + 22656 Läuft xclock<br />

[2] - 22660 Läuft xterm<br />

In vorliegen<strong>de</strong>m Beispiel wer<strong>de</strong>n zwei graphische Anwendungen (xclock, xterm) als Hintergrundprozesse<br />

gestartet. In <strong>de</strong>r Job-Liste wer<strong>de</strong>n die entsprechen<strong>de</strong>n jobids und PIDs wi<strong>de</strong>rgegeben. Ein Prozess<br />

kann auch noch nachträglich in <strong>de</strong>n Hintergrund versetzt wer<strong>de</strong>n, in<strong>de</strong>m nach <strong>de</strong>r Kommandoeingabe die<br />

Tastensequenz z gedrückt wird und anschließend die Anweisung bg (für background) abgesetzt<br />

wird. Durch das z wird <strong>de</strong>r Vor<strong>de</strong>rgrundprozess suspendiert, also in einen Wartezustand<br />

versetzt.<br />

Prozess in <strong>de</strong>n Vor<strong>de</strong>rgrund holen<br />

%jobid<br />

fg %jobid<br />

Die jobid kann dazu benutzt wer<strong>de</strong>n, einen im Hintergrund laufen<strong>de</strong>n Prozess in <strong>de</strong>n Vor<strong>de</strong>rgrund zurückzuholen.<br />

Danach steht aber das Terminal für weitere Eingaben nicht mehr zur Verfügung. Allerdings kann<br />

mit z eine Suspendierung erfolgen, mit <strong>de</strong>r Alternative, <strong>de</strong>n Prozess erneut in <strong>de</strong>n Hintergrund<br />

schicken zu können.<br />

%jobid &<br />

bg %jobid<br />

Prozess suspendieren<br />

stop %jobid<br />

stop PID<br />

rechner> stop 22656<br />

rechner> jobs -l<br />

[1] + 22656 Angehalten (Signal) xclock<br />

[2] - 22660 Läuft xterm<br />

Für die Suspendierung <strong>von</strong> Prozessen kann neben <strong>de</strong>r oben beschriebenen Tastensequenz z auch<br />

das Kommando stop verwen<strong>de</strong>t wer<strong>de</strong>n. Dabei kann man wahlweise die jobid o<strong>de</strong>r die PID angeben.


3. Kommandos und Prozesse 29<br />

Prozess terminieren<br />

kill PID<br />

kill -9 PID<br />

rechner> kill 22656<br />

rechner> jobs -l<br />

[1] 22656 Been<strong>de</strong>t xclock<br />

[2] + 22660 Läuft xterm<br />

Das vollständige Been<strong>de</strong>n eines Prozesses wird mit <strong>de</strong>m Kommando kill erreicht. Mit <strong>de</strong>r Option -9 wird<br />

<strong>de</strong>r Prozess bedingungslos abgebrochen, ohne diese Option versucht das System möglicherweise geöffnete<br />

Dateien noch ordnungsgemäß zu schließen. In <strong>de</strong>r Job-Liste wird <strong>de</strong>r entsprechen<strong>de</strong> Prozess als ”Been<strong>de</strong>t”<br />

markiert.<br />

Prozess-Priorität vermin<strong>de</strong>rn<br />

nice [ +n|-n ] [ command ]<br />

renice n PID<br />

rechner> ps -l | egrep ’(UID|22660)’<br />

F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD<br />

000 S 9523 22660 1244 0 69 0 - 1172 select pts/2 00:00:00 xterm<br />

rechner> renice 5 22660<br />

22660: Alte Priorität: 0, neue Priorität: 5<br />

rechner> ps -l | egrep ’(UID|22660)’<br />

F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD<br />

000 S 9523 22660 1244 0 72 5 - 1172 select pts/2 00:00:00 xterm<br />

Das nice-Kommando startet einen Prozess mit vermin<strong>de</strong>rter Priorität. Ohne die Angabe eines Wertes n<br />

wird standardmäßig 4 gesetzt. Das renice-Kommando vermin<strong>de</strong>rt die Priorität eines bereits laufen<strong>de</strong>n<br />

Prozesses. Es ist nur eine Reduzierung <strong>de</strong>r Prozess-Priorität möglich. Je höher <strong>de</strong>r Wert n, <strong>de</strong>sto niedriger<br />

ist die Priorität. In <strong>de</strong>r Prozess-Liste kann <strong>de</strong>r gesetzte Prioritätswert in <strong>de</strong>r Spalte NI abgelesen wer<strong>de</strong>n.<br />

<strong>Eine</strong> Vermin<strong>de</strong>rung <strong>de</strong>r Priorität ist immer dann sinnvoll, wenn verhin<strong>de</strong>rt wer<strong>de</strong>n soll, dass langlaufen<strong>de</strong><br />

Programme die gleichzeitige interaktive Arbeit zu sehr behin<strong>de</strong>rn. Unter Sun Solaris wird die Priorität in<br />

<strong>de</strong>r Spalte NI vom Ausgangswert 20 hochgezählt.<br />

Prozess-Aktivität beobachten<br />

strace command [ arguments ]<br />

strace -p PID<br />

truss command [ arguments ]<br />

truss -p PID


3. Kommandos und Prozesse 30<br />

Das Kommando strace wird unter <strong>Linux</strong>, das Kommando truss unter Sun Solaris verwen<strong>de</strong>t. Bei<strong>de</strong><br />

liefern als Output die vom System benutzten System-Calls.<br />

Es existieren noch weitere Hilfsprogramme, mit <strong>de</strong>nen die Prozess-Aktivität auf <strong>de</strong>m gesamten System<br />

beobachtet wer<strong>de</strong>n kann. Ein weit verbreitetes Tool ist das Programm top. top stellt alle Prozesse als<br />

dynamische Tabelle dar, die alle 5 bis 10 Sekun<strong>de</strong>n aktualisiert wird.<br />

Abbildung 3.3.: Das Programm top zur Prozess-Beobachtung<br />

Die Prozesse wer<strong>de</strong>n sortiert nach ihrem CPU-Verbrauch wi<strong>de</strong>rgegeben, d.h. <strong>de</strong>r Prozess, <strong>de</strong>r am meisten<br />

CPU-Zeit verbraucht, steht ganz oben. Außer<strong>de</strong>m sind <strong>de</strong>r Tabelle noch Angaben über Memory- und Swap-<br />

Ausnutzung zu entnehmen. Das Programm wird einfach durch Eingabe <strong>von</strong> q been<strong>de</strong>t.<br />

Meist enthalten die graphischen Benutzeroberflächen auch noch Programme, die eine Beobachtung <strong>de</strong>r<br />

Prozess-Aktivität zulassen. Unter Sun Solaris und CDE ist dies das Programm sdtprocess, unter <strong>Linux</strong><br />

sind dies die Tools gtop und kpm.


4. Das Dateisystem<br />

Das Dateisystem unter <strong>Unix</strong>/<strong>Linux</strong> ist hierarchisch geglie<strong>de</strong>rt. Ausgehend vom root directory / verzweigen<br />

sich Unterverzeichnisse mit System- und Benutzerdaten. Unter einem Dateisystem wird grundsätzlich eine<br />

komplette Hierarchie <strong>von</strong> Verzeichnissen und Dateien auf einer Festplatte o<strong>de</strong>r einem Festplatten-Array<br />

verstan<strong>de</strong>n. Meist kommen heute Festplatten-Arrays zum Einsatz, die aufgrund ihrer Konfiguration (RAID)<br />

eine hohe Fehlertoleranz aufweisen.<br />

/<br />

bin <strong>de</strong>v etc usr home<br />

rar12345<br />

Mail<br />

text<br />

Abbildung 4.1.: Hierarchisches Dateisystem<br />

Im Verzeichnis /etc stehen u.a. Konfigurationsdateien für das System, das Directory /<strong>de</strong>v enthält spezielle<br />

Dateien für die Kommunikation mit Geräten und im Verzeichnis /bin stehen ausführbare Programme.<br />

Benutzerdaten wer<strong>de</strong>n in <strong>de</strong>r Regel auf geson<strong>de</strong>rten Platten abgelegt (/home). Die Informationen über<br />

die Struktur <strong>de</strong>s gesamten Dateisystems ist auf je<strong>de</strong>r Platte in speziellen Blöcken und in <strong>de</strong>n sog. I-No<strong>de</strong>-<br />

Tabellen gespeichert.<br />

Je<strong>de</strong>s HOME-Verzeichnis ist ein Unterverzeichnis in einem großen Dateisystem (in obigem Beispiel wäre<br />

dies /home/rar12345 auf <strong>de</strong>m Dateisystem /home). Alle <strong>Unix</strong>/<strong>Linux</strong>-Benutzer an <strong>de</strong>r Uni Regensburg<br />

besitzen aber noch weitere Verzeichnisse in an<strong>de</strong>ren Dateisystemen (/temp, /secure), die sie zur Speicherung<br />

ihrer Daten verwen<strong>de</strong>n können. Das secure-Verzeichnis kann allerdings nur nach einem Login<br />

auf einem Sun Solaris System genutzt wer<strong>de</strong>n. Die Daten auf <strong>de</strong>n Dateisystemen /home und /secure<br />

wer<strong>de</strong>n täglich gesichert. Das Dateisystem /temp sollte nur zur temporären Speicherung <strong>von</strong> Daten verwen<strong>de</strong>t<br />

wer<strong>de</strong>n, da da<strong>von</strong> keine Sicherung erfolgt. Je<strong>de</strong>r Benutzer kann in seinen Verzeichnissen bis zu<br />

einer Maximal-Grenze (diskquota) Daten ablegen.


4. Das Dateisystem 32<br />

4.1. Dateiarten und Dateinamen<br />

Unter <strong>Unix</strong> existieren drei Dateiarten:<br />

Directories d Inhaltsverzeichnisse<br />

Normale Dateien - können Daten aller Art enthalten<br />

Spezielle Dateien c charakter-orientierte Gerätedateien<br />

b block-orientierte Gerätedateien<br />

p named pipes für die Prozesskommunikation<br />

Die mittlere Spalte zeigt für <strong>de</strong>n entsprechen<strong>de</strong>n Dateityp <strong>de</strong>n Kennbuchstaben, <strong>de</strong>r bei einem ausführlichen<br />

Directory-Listing mit <strong>de</strong>m Kommando ls -l ausgegeben wird.<br />

rechner> ls -l<br />

-rw-r----- 1 rar12345 stud 19 Sep 9 08:56 else<br />

-rw-r----- 2 rar12345 stud 63 Sep 9 08:58 franz<br />

-rw-r----- 1 rar12345 stud 0 Sep 9 08:55 hugo<br />

-rw-r----- 2 rar12345 stud 63 Sep 9 08:58 ina<br />

lrwxrwxrwx 1 rar12345 stud 4 Sep 9 08:59 sara -> else<br />

drwxr-x--x 2 rar12345 stud 117 Sep 9 09:27 text<br />

Die einzelnen Spalten <strong>de</strong>r Ausgabe haben folgen<strong>de</strong> Be<strong>de</strong>utung:<br />

-rw-r----- das erste Bit dokumentiert <strong>de</strong>n Typ <strong>de</strong>r Datei, in <strong>de</strong>n neun<br />

folgen<strong>de</strong>n Bits ist <strong>de</strong>r Zugriffsschutz gespeichert<br />

2 Anzahl <strong>de</strong>r Hardlinks auf die Datei<br />

rar12345 Datei-Eigentümer<br />

stud Zuordnung zu einer Gruppe (i.d.R. die Login-group)<br />

63 Größe <strong>de</strong>r Datei in Bytes<br />

Sep 9 08:58 Datum <strong>de</strong>r letzten Modifikation<br />

franz Dateiname<br />

In obigem Directory-Listing sind zwei Beson<strong>de</strong>rheiten zu sehen. Die Datei ina ist ein sog. Hardlink auf<br />

die Datei franz (erkennbar an <strong>de</strong>r Zahl 2 in <strong>de</strong>r Spalte <strong>de</strong>r Hardlinks) und die Datei sara ist ein sog.<br />

Symbolic Link auf die Datei else.<br />

Als Hardlink versteht man einen Verweis <strong>von</strong> einer Datei auf eine an<strong>de</strong>re Datei. Die Dateinamen können<br />

unterschiedlich sein, <strong>de</strong>r Inhalt dagegen ist i<strong>de</strong>ntisch. Hardlinks können nur zwischen Dateien <strong>de</strong>s gleichen<br />

Dateisystems geschlossen wer<strong>de</strong>n. Zeigt kein Verweis auf eine Datei, so ist die Anzahl <strong>de</strong>r Hardlinks<br />

dieser Datei gleich 1. Hardlinks wer<strong>de</strong>n mit <strong>de</strong>m Kommando ln vorhan<strong>de</strong>ne_Datei neue_Datei<br />

angelegt.<br />

Bei Symbolic Links erscheint als Typkennzeichnung ein l im Directory-Listing (siehe oben). Mit Symbolic<br />

Links können sowohl Verweise zu Dateien als auch zu Directories geschlossen wer<strong>de</strong>n. Im Gegensatz zu<br />

<strong>de</strong>n Hardlinks können Symbolic Links auch über die Grenzen <strong>von</strong> Filesystemen hinausreichen. Symbolic<br />

Links wer<strong>de</strong>n erzeugt mit <strong>de</strong>m Kommando ln -s vorhan<strong>de</strong>ne_Datei neue_Datei.<br />

Dateinamen dürfen unter <strong>Unix</strong> aus maximal 256 Zeichen bestehen. Es sind grundsätzlich alle Zeichen<br />

erlaubt auch Son<strong>de</strong>r- und Kontrollzeichen. Auf Dateinamen mit nicht darstellbaren Zeichen sollte allerdings<br />

verzichtet wer<strong>de</strong>n.


4. Das Dateisystem 33<br />

Beispiele für gültige Dateinamen:<br />

’1 2 345’<br />

’Heute ist Dienstag’<br />

’X’<br />

’g*:8’<br />

’ha.ha.ha.ha’<br />

’programm’<br />

In obiger Liste ist <strong>de</strong>r Dateiname jeweils <strong>von</strong> Hochkommas eingeschlossen. <strong>Eine</strong> Aufteilung in Dateiname<br />

und Dateiextension, wie unter DOS, gibt es nicht.<br />

Achtung: Auch bei Dateinamen gilt: UNIX unterschei<strong>de</strong>t Gross- und Kleinschreibung !!!<br />

Die freie Wahl <strong>von</strong> Dateinamen hat natürlich dort seine Grenzen, wo für bestimmte Zwecke Dateinamen-<br />

Konventionen bestehen. So wer<strong>de</strong>n z.B. C-Quelldateien mit <strong>de</strong>r Endung .c gekennzeichnet, Fortran-<br />

Quellen en<strong>de</strong>n mit .f und Objektdateien mit .o. Ferner gibt es unter <strong>Unix</strong> eine Reihe <strong>von</strong> Dateien, die<br />

mit einem Punkt beginnen (sog. Dot-files). Diese Dot-files wer<strong>de</strong>n auch ”hid<strong>de</strong>n files” genannt und fungieren<br />

primär als setup-files (.login, .cshrc). Sie sind mit <strong>de</strong>m Kommando ls -a aufzulisten.<br />

Der Datei- bzw. Directory-Name dokumentiert nur <strong>de</strong>n letzten Teil in <strong>de</strong>r Bezeichnung <strong>de</strong>r kompletten<br />

Hierarchie im Dateisystem. Strenggenommen setzt sich ein Datei- bzw. Directory-Name auch aus <strong>de</strong>n<br />

davor befindlichen Verzeichnisnamen zusammen. Hat sich z.B. <strong>de</strong>r Benutzer rar12345 eingeloggt und<br />

danach mit <strong>de</strong>m Kommando cd briefe in das Unterverzeichnis briefe gesetzt, so lautet die komplette<br />

Bezeichnung <strong>de</strong>s Unterverzeichnisses /home/rar12345/briefe. Auf Dateien, die sich in diesem<br />

Unterverzeichnis befin<strong>de</strong>n, kann <strong>de</strong>r Benutzer nun entwe<strong>de</strong>r mit <strong>de</strong>r absoluten o<strong>de</strong>r relativen Pfadangabe<br />

Bezug nehmen.<br />

rechner> ls -l /home/rar12345/briefe/einladung.txt<br />

rechner> ls -l ./einladung.txt<br />

rechner> ls -l einladung.txt<br />

absolute Referenz<br />

relative Referenz<br />

relative Referenz<br />

An dieser Stelle soll die mit <strong>de</strong>n bereits besprochenen Spezialzeichen zusammenhängen<strong>de</strong> Dateinamen-<br />

Expandierung dokumentiert wer<strong>de</strong>n. Als Ausgangspunkt wird ein Unterverzeichnis namens text verwen<strong>de</strong>t<br />

mit <strong>de</strong>n darin befindlichen Dateien alfred, berta, c1, c2, c3, christa, g*:8 und zorro.<br />

Zum Auflisten wird das Kommando ls -l verwen<strong>de</strong>t.<br />

rechner> ls -l c*<br />

rechner> ls -l ??r*<br />

rechner> ls -l ?????<br />

rechner> ls -l [ab]*<br />

rechner> ls -l c[13]*<br />

rechner> ls -l [c-z]*<br />

rechner> ls -l ?[e-h]*<br />

rechner> ls -l ?[*]*<br />

rechner> ls -l ?\**<br />

rechner> ls -l ~<br />

rechner> ls -l *{red,sta}<br />

rechner> ls -l .<br />

rechner> ls -l ..<br />

alle Dateien, die mit c beginnen<br />

alle Dateien, die als dritten Buchstaben ein r besitzen<br />

alle Dateien, die genau aus 5 Zeichen bestehen<br />

alle Dateien, die mit a o<strong>de</strong>r b beginnen<br />

die Dateien c1 und c3<br />

alle Dateien, <strong>de</strong>ren erster Buchstabe zwischen c und z liegt<br />

alle Dateien, <strong>de</strong>ren zweiter Buchstabe zwischen e und h<br />

liegt<br />

alle Dateien, <strong>de</strong>ren zweites Zeichen ein * ist<br />

alle Dateien, <strong>de</strong>ren zweites Zeichen ein * ist<br />

alle Dateien im HOME-Directory<br />

alle Dateien, die mit <strong>de</strong>n strings red und sta en<strong>de</strong>n<br />

alle Dateien im aktuellen Directory<br />

alle Dateien im übergeordneten Directory


4. Das Dateisystem 34<br />

4.2. Kommandos mit Dateien<br />

Das Kommando ls -l zum Auflisten <strong>von</strong> Inhaltsverzeichnissen haben wir bereits kennengelernt. Im folgen<strong>de</strong>n<br />

sollen die wichtigsten Kommandos besprochen wer<strong>de</strong>n, die in Verbindung mit Dateien Verwendung<br />

fin<strong>de</strong>n.<br />

Inhalt einer Datei am Bildschirm ausgeben<br />

cat [ -options ] [ filename ... ]<br />

rechner> cat .mailrc<br />

rechner> cat -n .mailrc<br />

zeigt Inhalt <strong>de</strong>r Datei .mailrc<br />

zeigt Inhalt <strong>de</strong>r Datei mit Zeilennummerierung<br />

Die Ausgabe einer Datei auf <strong>de</strong>m Bildschirm ist natürlich nur dann sinnvoll, wenn die Datei auch lesbaren<br />

Text enthält (ASCII-Datei).<br />

Inhalt einer Datei seitenweise am Bildschirm ausgeben<br />

more [ -options ] [ filename ... ]<br />

rechner> more .mailrc<br />

zeigt Inhalt <strong>de</strong>r Datei .mailrc seitenweise<br />

rechner> more +/record .mailrc beginnt die Auflistung 2 Zeilen vor <strong>de</strong>m<br />

Muster record<br />

rechner> more +15 .mailrc beginnt die Auflistung ab Zeile 15<br />

more ist ein mächtiges Kommando zum Auflisten <strong>von</strong> Textdateien. Während <strong>de</strong>s Auflistens kann vorwärts<br />

und rückwärts ( b) geblättert wer<strong>de</strong>n, es können Textmuster gesucht und Leerzeilen komprimiert<br />

wer<strong>de</strong>n. Durch Betätigung <strong>de</strong>r Leertaste wird immer um eine Seite bzw. Bildschirm weitergeblättert. Die<br />

Auflistung kann durch Eingabe <strong>von</strong> q vorzeitig abgebrochen wer<strong>de</strong>n.<br />

Ausgabe <strong>de</strong>s Dateianfangs<br />

head [ -n ] [ filename ... ]<br />

rechner> head .mailrc<br />

rechner> head -20 .mailrc<br />

zeigt die ersten 10 Zeilen <strong>de</strong>r Datei .mailrc<br />

zeigt die ersten 20 Zeilen <strong>de</strong>r Datei .mailrc<br />

Ausgabe <strong>de</strong>s Dateien<strong>de</strong>s<br />

tail [ -options ] [ filename ... ]<br />

rechner> tail .mailrc<br />

rechner> tail -3 .mailrc<br />

rechner> tail +7 .mailrc<br />

zeigt die letzten 10 Zeilen <strong>de</strong>r Datei .mailrc<br />

zeigt die letzten 3 Zeilen <strong>de</strong>r Datei .mailrc<br />

zeigt ab Zeile 7 <strong>de</strong>n gesamten Inhalt<br />

Zählen <strong>de</strong>s Inhalts einer Datei<br />

wc [ -clw ] [ filename ... ]<br />

rechner> wc .mailrc<br />

rechner> wc -l .mailrc<br />

gibt die Anzahl <strong>de</strong>r Zeilen, Wörter und Zeichen <strong>de</strong>r<br />

Datei .mailrc aus<br />

gibt die Anzahl <strong>de</strong>r Zeilen <strong>de</strong>r Datei .mailrc aus


4. Das Dateisystem 35<br />

Extrahieren <strong>von</strong> Zeilen mit bestimmten Textmustern<br />

grep [ -options ] [ pattern ... ] [ filename ... ]<br />

egrep [ -options ] [ pattern ... ] [ filename ... ]<br />

rechner> grep lia .cshrc<br />

rechner> grep path .cshrc<br />

rechner> grep ’^#’ .cshrc<br />

rechner> grep ’#$’ .cshrc<br />

rechner> grep ’^##$’ .cshrc<br />

alle Zeilen mit <strong>de</strong>m Muster lia<br />

alle Zeilen mit <strong>de</strong>m Muster path<br />

alle Zeilen, die mit <strong>de</strong>m Zeichen # beginnen<br />

alle Zeilen, die mit <strong>de</strong>m Zeichen # en<strong>de</strong>n<br />

alle Zeilen, die genau aus <strong>de</strong>n bei<strong>de</strong>n Zeichen<br />

## bestehen<br />

rechner> grep ’^.[fn]’ .cshrc<br />

alle Zeilen, die mit einem beliebigen Zeichen beginnen und <strong>de</strong>ren zweites Zeichen<br />

ein f o<strong>de</strong>r n ist<br />

rechner> grep ’^.[a-g]’ .cshrc<br />

alle Zeilen, die mit einem beliebigen Zeichen beginnen und <strong>de</strong>ren zweites Zeichen<br />

im Bereich a - g liegt<br />

rechner> egrep ’HOME|LINUX’ .cshrc<br />

alle Zeilen die <strong>de</strong>n string HOME o<strong>de</strong>r LINUX enthalten<br />

rechner> egrep ’e+l+’ .cshrc<br />

alle Zeilen, in <strong>de</strong>nen <strong>de</strong>r string el vorkommt, wobei sowohl das e als auch das<br />

l mehrfach hintereinan<strong>de</strong>r vorkommen können<br />

grep und egrep sind wichtige Werkzeuge, um aus ASCII-Dateien Zeilen mit beliebigen Textmustern<br />

herauszufiltern. Reguläre Ausdrücke wer<strong>de</strong>n dabei in einfachen Hochkommas eingeschlossen. Der Unterschied<br />

zwischen bei<strong>de</strong>n Kommandos liegt darin, dass grep nur eine eingeschränkte Auswahl an regulären<br />

Ausdrücken zulässt.<br />

Extrahieren <strong>von</strong> Spalten aus Dateien<br />

cut [ -options ] [ filename ... ]<br />

rechner> cut -b 1-2 .mailrc<br />

rechner> cut -f 1 -d’ ’ .mailrc<br />

gibt die ersten bei<strong>de</strong>n Bytes je<strong>de</strong>r Zeile <strong>de</strong>r<br />

Datei .mailrc aus<br />

gibt das erste Feld je<strong>de</strong>r Zeile <strong>de</strong>r Datei<br />

.mailrc aus<br />

Je nach Option können mit cut Bytes, Zeichen o<strong>de</strong>r Fel<strong>de</strong>r aus einer Datei ”ausgeschnitten” wer<strong>de</strong>n. Bei<br />

Verwendung <strong>von</strong> -f sollte immer mit <strong>de</strong>r Option -d das entsprechen<strong>de</strong> Feldtrennzeichen <strong>de</strong>finiert wer<strong>de</strong>n.<br />

In obigem Beispiel wird das Leerzeichen als Feldtrennzeichen angegeben.<br />

Dateien kopieren<br />

cp [ -fip ] file_old file_new<br />

cp [ -fip ] file directory<br />

Sollen die Zugriffsrechte <strong>de</strong>r ursprünglichen Datei beibehalten wer<strong>de</strong>n, so ist dies mit <strong>de</strong>r Option -p anzugeben.<br />

-f bewirkt ein unbedingtes Kopieren und -i gibt vor <strong>de</strong>m Kopieren eine Warnung aus, falls die<br />

Zieldatei bereits existiert (Schutz vor Überschreiben).


4. Das Dateisystem 36<br />

Dateien umbenennen<br />

mv [ -fi ] file_old file_new<br />

mv [ -fi ] file directory<br />

Im zweiten Fall wird die Datei in das bereits vorhan<strong>de</strong>ne Directory verschoben.<br />

Dateien löschen<br />

rm [ -fir ] file ...<br />

Um unbeabsichtigte Löschoperationen zu vermei<strong>de</strong>n, ist es sinnvoll, das rm-Kommando mit <strong>de</strong>r Option<br />

-i aufzurufen. Dies ist beson<strong>de</strong>rs dann zu empfehlen, wenn beim Löschen Metazeichen zur Dateinamen-<br />

Expandierung verwen<strong>de</strong>t wer<strong>de</strong>n.<br />

Dateien suchen<br />

find pathname expression<br />

rechner> find . -name christa -print<br />

Ausgehend vom aktuellen Verzeichnis wird die Datei christa gesucht.<br />

rechner> find . -name c\* -print<br />

Ausgehend vom aktuellen Verzeichnis wer<strong>de</strong>n alle Dateien und Directories<br />

gesucht, die mit c beginnen.<br />

rechner> find /usr -name \?\?r\* -print<br />

Das gesamte Verzeichnis /usr wird nach Dateien und Directories durchsucht,<br />

die im Namen als drittes Zeichen ein r besitzen.<br />

rechner> find . -name christa -exec rm {} \;<br />

Wenn die Datei christa gefun<strong>de</strong>n wird, wird sie durch das rm-Kommando<br />

gelöscht.<br />

Das Kommando find durchsucht ausgehend vom angegebenen Directory rekursiv alle darunter liegen<strong>de</strong>n<br />

Verzeichnisse nach Dateien, die <strong>de</strong>n gewünschten Kriterien entsprechen. Son<strong>de</strong>rzeichen wie [ ] ?<br />

* ( ) müssen mit <strong>de</strong>m Zeichen \ maskiert wer<strong>de</strong>n.<br />

Weitere nützliche Kommandos<br />

rechner> diff file1 file2<br />

rechner> sort [ -options ] file<br />

rechner> quota -v<br />

rechner> du -sk *<br />

rechner> du -sk .??*<br />

rechner> file filename<br />

vergleicht zwei Dateien<br />

sortiert eine Datei<br />

gibt die aktuelle Plattenplatzbelegung aus<br />

gibt die Größe <strong>von</strong> Dateien und Directories<br />

aus<br />

gibt die Größe <strong>von</strong> hid<strong>de</strong>n Dateien und Directories<br />

aus<br />

gibt <strong>de</strong>n Typ einer Datei aus<br />

Da man ja unter <strong>Unix</strong>/<strong>Linux</strong> <strong>von</strong> <strong>de</strong>n Dateinamen nicht auf <strong>de</strong>n Inhalt <strong>de</strong>r Dateien schließen kann, ist ein<br />

Programm wie file, das <strong>de</strong>n Datei-Inhalt analysiert, sehr hilfreich. Je nach<strong>de</strong>m, <strong>von</strong> welcher Art <strong>de</strong>r Inhalt<br />

ist, wer<strong>de</strong>n z.B. Meldungen wie ”ASCII-file”, ”Postscript-file” usw. ausgegeben.


4. Das Dateisystem 37<br />

4.3. Kommandos mit Directories<br />

Directories sind im Grun<strong>de</strong> Dateien, die die Informationen über die in ihnen vorhan<strong>de</strong>nen Dateien und<br />

Directories enthalten.<br />

In Directories wechseln<br />

cd dirname<br />

rechner> cd text<br />

rechner> cd /tmp<br />

rechner> cd ..<br />

rechner> cd<br />

Wechsel in das Verzeichnis text<br />

Wechsel in das Verzeichnis /tmp<br />

<strong>von</strong> <strong>de</strong>r aktuellen Position ein Directory nach oben<br />

zurück ins HOME-Verzeichnis wechseln<br />

Beim Verzeichniswechsel kann sowohl die absolute als auch die relative Directory-Notation verwen<strong>de</strong>t wer<strong>de</strong>n.<br />

Aktuelles Directory anzeigen<br />

pwd<br />

Directories erzeugen<br />

mkdir [ -options ] dirname ...<br />

rechner> mkdir text<br />

im aktuellen Verzeichnis wird das Directory text angelegt<br />

Directories kopieren<br />

cp -r [ -ip ] quell_directory<br />

ziel_directory<br />

rechner> cp -r text text2<br />

rekursives Kopieren <strong>de</strong>s Directories text nach<br />

text2<br />

Das in obigem Beispiel erwähnte Ziel-Verzeichnis text2 sollte vor <strong>de</strong>m Kopieren noch nicht existieren.<br />

Falls dies doch <strong>de</strong>r Fall ist, wird das komplette Quell-Verzeichnis text unter <strong>de</strong>m Directory text2 angelegt.<br />

Beim Kopieren ganzer Verzeichnisse muss auf symbolic links geachtet wer<strong>de</strong>n. Symbolic links wer<strong>de</strong>n<br />

beim Kopieren aufgelöst und die entsprechen<strong>de</strong>n Dateien sind dann mehrfach vorhan<strong>de</strong>n. Soll daher die<br />

Link-Struktur beibehalten wer<strong>de</strong>n, ist folgen<strong>de</strong> Vorgehensweise besser.<br />

mkdir ziel_directory<br />

cd quell_directory<br />

tar -cvf - . | ( cd ziel_directory; tar -xpvf - )<br />

Das Programm tar ist ein Tool zum Sichern <strong>von</strong> Dateien und Verzeichnissen in einer Archiv-Datei. Dabei<br />

wird die originale Struktur beibehalten.<br />

Directories umbenennen<br />

mv [ -options ] old_directory<br />

new_directory<br />

Das Umbenennen <strong>von</strong> Directories erfolgt auf die gleiche Weise wie das Umbenennen <strong>von</strong> Dateien.


4. Das Dateisystem 38<br />

Directories löschen<br />

rmdir dirname ...<br />

rm -r dirname ...<br />

löscht leeres Directory<br />

löscht rekursiv <strong>de</strong>n ganzen Verzeichnis-Baum<br />

Auch beim rm-Kommando können die Zeichen zur Dateinamens-Expandierung verwen<strong>de</strong>t wer<strong>de</strong>n (aber<br />

Vorsicht bei <strong>de</strong>r Verwendung <strong>von</strong> *).<br />

4.4. Dateischutz<br />

Der Zugriff auf Dateien und Directories wird über die sog. accessrights bzw. Filemodi geregelt. Über<br />

die aktuellen accessrights einer Datei o<strong>de</strong>r eines Directories gibt das Kommando ls -l Auskunft (z.B.<br />

-rw-r--r--).<br />

Es gibt bzgl. je<strong>de</strong>r Datei bzw. je<strong>de</strong>s Directories drei Benutzergruppen:<br />

<strong>de</strong>r Eigentümer ( user=u ), die Gruppe ( group=g ) und alle an<strong>de</strong>ren ( other=o ).<br />

Für je<strong>de</strong> Benutzergruppe kann bestimmt wer<strong>de</strong>n, ob sie die Datei<br />

lesen ( read=r ), schreiben ( write=w ), ausführen ( execute=x ) darf.<br />

<strong>Eine</strong> Protection-mask kann z.B. so aussehen:<br />

-rw-|r--|r-- entspricht binär 110|100|100 entspricht oktal 644<br />

Die ersten drei Bits symbolisieren <strong>de</strong>n Zugriff für <strong>de</strong>n Datei-Eigentümer, die nächsten drei Bits <strong>de</strong>n Zugriff<br />

für die Gruppe und die letzten drei Bits <strong>de</strong>n Zugriff für alle an<strong>de</strong>ren. Bei obigem Beispiel darf <strong>de</strong>r Datei-<br />

Eigentümer die Datei lesen und schreiben, die Gruppe und alle an<strong>de</strong>ren besitzen nur lesen<strong>de</strong>n Zugriff. Das<br />

erste Bit <strong>de</strong>r Filemodi bezeichnet die Art <strong>de</strong>r Datei (d = Directory, - = normales file, l = symbolischer Link,<br />

b,c = spezielle Gerätedateien, p = named pipe).<br />

Standardmäßig wird die Protection-mask neu erstellter Dateien komplementär zum sog. umask-Wert gebil<strong>de</strong>t.<br />

Mit <strong>de</strong>m Kommando umask kann <strong>de</strong>r aktuelle umask-Wert angezeigt o<strong>de</strong>r auch verän<strong>de</strong>rt wer<strong>de</strong>n. Das<br />

x-Bit bleibt in <strong>de</strong>r Regel vom eingestellten umask-Wert unbeeinflusst. Ein umask-Wert <strong>von</strong> 022 bewirkt<br />

beispielsweise eine Protection-mask <strong>von</strong> 644 bzw. -rw-r--r--. Das x-Bit wird nur dann automatisch<br />

gesetzt, wenn die Datei durch eine Kompilation gebil<strong>de</strong>t wur<strong>de</strong>.<br />

Än<strong>de</strong>rn <strong>de</strong>r Zugriffsrechte<br />

chmod [ -options ] mo<strong>de</strong><br />

filename<br />

Die Modifikation <strong>de</strong>r Zugriffsrechte erfolgt mit <strong>de</strong>m Kommando chmod. Dabei kann <strong>de</strong>r einzustellen<strong>de</strong><br />

mo<strong>de</strong> entwe<strong>de</strong>r oktal (z.B. 775) o<strong>de</strong>r symbolisch (u=rwx,g=r) angegeben wer<strong>de</strong>n.<br />

rechner> chmod 777 berta<br />

rechner> chmod 640 berta<br />

rechner> chmod g+x berta<br />

rechner> chmod g+w,o+x berta<br />

rechner> chmod g-wx berta<br />

rechner> chmod u=rw,go= berta<br />

Protection-mask: -rwxrwxrwx<br />

Protection-mask: -rw-r-----<br />

Protection-mask: -rw-r-x---<br />

Protection-mask: -rw-rwx--x<br />

Protection-mask: -rw-r----x<br />

Protection-mask: -rw-------


4. Das Dateisystem 39<br />

Bei <strong>de</strong>r symbolischen Einstellung <strong>de</strong>r filemo<strong>de</strong>s be<strong>de</strong>uten die Zeichen + Setzen <strong>von</strong> zusätzlichen Rechten,<br />

- Entzug <strong>von</strong> Rechten und = absolutes Setzen <strong>von</strong> Rechten.<br />

Preisfrage: Was passiert, wenn ein Benutzer einer Datei, die ihm gehört, sämtliche Rechte entzieht?<br />

Bei Directories besitzen die Protection-bits eine an<strong>de</strong>re Be<strong>de</strong>utung. Sie regeln hier <strong>de</strong>n Zugang über das<br />

Kommando cd sowie die Möglichkeit, Dateien zu erstellen bzw. zu löschen. Folgen<strong>de</strong> Übersicht soll dies<br />

ver<strong>de</strong>utlichen.<br />

drwxrwxrwx<br />

drwxr-xr-x<br />

drwxr--r--<br />

drwx--x--x<br />

drwx------<br />

ls, cd und file create/<strong>de</strong>lete für alle Benutzer möglich<br />

nur ls und cd möglich für alle Benutzer<br />

nur ls möglich für alle Benutzer<br />

nur cd möglich für alle Benutzer<br />

nur noch Rechte für <strong>de</strong>n Eigentümer <strong>de</strong>s Directories<br />

Durch die Zugriffsrechte, die für ein Directory gesetzt wer<strong>de</strong>n, können auch die darunterliegen<strong>de</strong>n Verzeichnisse<br />

geschützt wer<strong>de</strong>n.<br />

Neben <strong>de</strong>n oben beschriebenen Zugriffsregelungen gibt es noch drei weitere Ausprägungen:<br />

-rwsr-xr-x set user id bit (user-s-bit, oktal 4000)<br />

wenn dieses Programm aufgerufen wird, wird nur für die Zeit <strong>de</strong>r<br />

Ausführung die user-id <strong>de</strong>s file-owners übernommen<br />

-rwxr-sr-x set group id bit (group-s-bit, oktal 2000)<br />

wenn dieses Programm aufgerufen wird, wird nur für die Zeit <strong>de</strong>r<br />

Ausführung die group-id <strong>de</strong>s file-owners übernommen<br />

-rwxrwxrwT sticky bit (wirkt global, oktal 1000)<br />

Bei Programmen bleibt das aufgerufene Programm nach Beendigung<br />

im swap-Bereich (höhere Performance).<br />

Bei gemeinsam genutzten Directories regelt es <strong>de</strong>n Zugriff auf<br />

files <strong>von</strong> verschie<strong>de</strong>nen Benutzern.<br />

Zugriffsregelung über Access Control Lists<br />

Die oben besprochenen Zugriffsmechanismen funktionieren auf allen <strong>Unix</strong>-Systemen gleich. Einige <strong>Unix</strong>-<br />

Systeme bieten darüberhinaus weitere Möglichkeiten, <strong>de</strong>n Zugriffsschutz noch differenzierter zu gestalten.<br />

Erreicht wird dies durch sog. Zugriffslisten (ACL=Access Control List). In solchen Listen kann z.B. <strong>de</strong>m<br />

Benutzer A lesen<strong>de</strong>r, <strong>de</strong>m Benutzer B lesen<strong>de</strong>r und schreiben<strong>de</strong>r und <strong>de</strong>m Benutzer C ausführen<strong>de</strong>r Zugriff<br />

auf eine Datei gewährt wer<strong>de</strong>n. Unter Sun Solaris gibt es für die Verwaltung solcher ACLs die bei<strong>de</strong>n<br />

Kommandos setfacl und getfacl. Mit setfacl können ACLs <strong>de</strong>finiert wer<strong>de</strong>n, mit getfacl<br />

können die gesetzten Zugriffsrechte ausgelesen wer<strong>de</strong>n.<br />

-rw------- 1 otto stud 9 Mar 20 09:54 schatzkarte<br />

Benutzer otto hat eine Datei namens schatzkarte angelegt, die nur für ihn selbst les- und schreibbar<br />

ist. otto möchte nun nur <strong>de</strong>m Benutzer rudi Leserechte auf diese Datei geben.<br />

rechner> setfacl -m user:rudi:r--,mask:r-- schatzkarte<br />

Das Kommando ls -l schatzkarte liefert nun folgen<strong>de</strong>n<strong>de</strong>n Output. Die Existenz einer ACL wird<br />

durch ein + Zeichen unmittelbar hinter <strong>de</strong>n File-modi gekennzeichnet.<br />

-rw-------+ 1 otto stud 15 Mar 20 10:09 schatzkarte


4. Das Dateisystem 40<br />

Mit <strong>de</strong>m Kommando getfacl schatzkarte kann die gesamte ACL dieser Datei ausgegeben wer<strong>de</strong>n.<br />

# file: schatzkarte<br />

# owner: otto<br />

# group: stud<br />

user::rwuser:rudi:r--<br />

group::---<br />

mask:r--<br />

other:---<br />

#effective:r--<br />

#effective:---<br />

<strong>Eine</strong> nachträgliche Modifikation <strong>de</strong>r Zugriffsrechte mit <strong>de</strong>m Kommando chmod sollte nicht erfolgen, da<br />

dadurch auch die ACLs verän<strong>de</strong>rt wer<strong>de</strong>n.<br />

Lei<strong>de</strong>r ist <strong>de</strong>r Gebrauch <strong>von</strong> ACLs <strong>de</strong>rzeit noch etwas eingeschränkt. Unter <strong>Linux</strong> können zwar keine ACLs<br />

gesetzt wer<strong>de</strong>n, ACLs, die auf Sun Solaris <strong>de</strong>finiert wur<strong>de</strong>n, sind aber auch auf <strong>Linux</strong> wirksam (ls -l<br />

zeigt sie allerdings nicht an). Achtung: Beim sicheren Kopieren mit scp gehen alle ACLs verloren!<br />

Access Control Lists bieten für <strong>de</strong>n Benutzer eine komfortable Möglichkeit, <strong>de</strong>n Zugriffsschutz auf eigene<br />

Datenbestän<strong>de</strong> differenziert zu regeln ohne auf die Intervention eines Systemadministrators angewiesen zu<br />

sein.<br />

4.5. Drucken <strong>von</strong> Dateien<br />

Unter <strong>Unix</strong>/<strong>Linux</strong> sind <strong>de</strong>rzeit drei verschie<strong>de</strong>ne Drucksysteme verbreitet: BSD-basierte Drucksysteme,<br />

System-V-basierte Drucksysteme und Drucksysteme, die auf cups aufbauen. Der Ausdruck <strong>von</strong> Dateien<br />

kann entwe<strong>de</strong>r kommandoorientiert o<strong>de</strong>r über Anwendungen erfolgen. Beim kommandoorientierten Verfahren<br />

haben sich sowohl unter <strong>Unix</strong> als auch unter <strong>Linux</strong> die System-V-Kommandos durchgesetzt. Prinzipiell<br />

hat ein Ausdrucken an <strong>de</strong>r Uni Regensburg nur bei einem positiven Drucker-Kontostand Erfolg.<br />

lp file<br />

lp -d RIO_FIERY file<br />

lpstat -o printqueue<br />

lpstat -s<br />

lpstat -p -l<br />

cancel printjob-nr<br />

Ausdruck auf <strong>de</strong>fault Drucker<br />

Ausdruck auf die Queue RIO_FIERY (Farbdrucker)<br />

Anzeige aller Jobs in <strong>de</strong>r genannten printqueue<br />

Anzeige aller installierten Drucker-Queues<br />

Ausführliche Anzeige aller Drucker-Queues<br />

Eliminieren eines Printjobs<br />

Ohne Angabe einer speziellen Drucker-Queue wird <strong>de</strong>r Ausdruck auf <strong>de</strong>n installierten Standard-Drucker<br />

ausgegeben. Im <strong>Unix</strong>/<strong>Linux</strong>-Pool ist dies <strong>de</strong>r dort aufgestellte Drucker. Achtung: Bei einem remote Login<br />

<strong>von</strong> einem Windows-PC wird ein unter <strong>Unix</strong> abgesetzter Druckauftrag nicht auf <strong>de</strong>n Drucker im Windows-<br />

Pool umgeleitet!<br />

a2ps ist ein nützliches Hilfsprogramm, um ASCII-Dateien für <strong>de</strong>n Ausdruck vorzubereiten. Damit können<br />

auch Manual-Pages platzsparend ausgedruckt wer<strong>de</strong>n ( man item | a2ps -m | lp ).


5. Editoren<br />

Editoren sind Programme, die die Eingabe <strong>von</strong> Daten in Dateien ermöglichen. Die hier beschriebenen<br />

Editoren sind Text-Editoren für das Erstellen <strong>von</strong> ASCII/ANSI-Dateien, keine Textverarbeitungssysteme.<br />

Wie unter an<strong>de</strong>ren Betriebssystemen gibt es auch unter <strong>Unix</strong>/<strong>Linux</strong> eine Vielzahl verschie<strong>de</strong>ner Editoren.<br />

Manche Editoren können nur unter einer graphischen Benutzeroberfläche gestartet wer<strong>de</strong>n, an<strong>de</strong>re benötigen<br />

lediglich ein Kommando-Terminal. Aus <strong>de</strong>r Menge <strong>de</strong>r Editoren sollen hier nur die bei<strong>de</strong>n Editoren vi<br />

und emacs herausgegriffen wer<strong>de</strong>n.<br />

5.1. Der vi - Editor<br />

vi ist ein full-screen-Editor <strong>de</strong>r auf allen <strong>Unix</strong>/<strong>Linux</strong>-Systemen existiert und i<strong>de</strong>ntisch zu bedienen ist. Im<br />

vi sind die bei<strong>de</strong>n Modi command und insert zu unterschei<strong>de</strong>n. Im command-Modus können Positionier-,<br />

Lösch-, Such- und viele an<strong>de</strong>re Operationen vorgenommen wer<strong>de</strong>n. Das Editieren <strong>von</strong> Text ist nur im insert-<br />

Modus möglich. Das Umschalten vom insert- in <strong>de</strong>n command-Modus erfolgt immer mit <strong>de</strong>r ESC-Taste.<br />

Nach Aufruf <strong>de</strong>s vi befin<strong>de</strong>t man sich im command-Modus.<br />

Abbildung 5.1.: Terminal nach Aufruf <strong>von</strong> vi einladung


5. Editoren 42<br />

Nach <strong>de</strong>m Start <strong>de</strong>s vi ist grundsätzlich <strong>de</strong>r command-mo<strong>de</strong> <strong>de</strong>s Editors eingestellt. Für <strong>de</strong>n Aufruf <strong>de</strong>s<br />

Editors gibt es noch an<strong>de</strong>re Optionen.<br />

Aufruf-Varianten <strong>de</strong>s vi<br />

vi filename<br />

Editieren <strong>de</strong>r Datei filename<br />

vi +18 filename Editor positioniert gleich auf Zeile 18<br />

vi +/muster filename Editor positioniert gleich auf Zeile mit muster<br />

vi -r filename Wie<strong>de</strong>rherstellen <strong>de</strong>r Datei nach Systemabsturz<br />

view filename<br />

öffnet die Datei im read-only-mo<strong>de</strong><br />

Kommandos zum Umschalten in <strong>de</strong>n insert-Modus<br />

a<br />

i<br />

A<br />

I<br />

o<br />

O<br />

Einfügen nach <strong>de</strong>m Cursor<br />

Einfügen vor <strong>de</strong>m Cursor<br />

Einfügen am Zeilenen<strong>de</strong><br />

Einfügen am Zeilenanfang<br />

Einfügen einer neuen Zeile nach <strong>de</strong>r aktuellen Zeile<br />

Einfügen einer neuen Zeile vor <strong>de</strong>r aktuellen Zeile<br />

Positionieren <strong>de</strong>s Cursors und Scrolling im command-Modus<br />

h<br />

l<br />

j<br />

k<br />

w<br />

W<br />

b<br />

B<br />

e<br />

E<br />

ein Zeichen nach links<br />

ein Zeichen nach rechts<br />

eine Zeile nach unten<br />

eine Zeile nach oben<br />

zum nächsten Wort o<strong>de</strong>r Son<strong>de</strong>rzeichen<br />

zum nächsten Wort<br />

zum vorhergehen<strong>de</strong>n Wort o<strong>de</strong>r Son<strong>de</strong>rzeichen<br />

zum vorhergehen<strong>de</strong>n Wort<br />

zum En<strong>de</strong> <strong>de</strong>s aktuellen o<strong>de</strong>r nächsten Wortes o<strong>de</strong>r Son<strong>de</strong>rzeichens<br />

zum En<strong>de</strong> <strong>de</strong>s aktuellen o<strong>de</strong>r nächsten Wortes<br />

^ zum Anfang <strong>de</strong>r Zeile (erstes sichtbares Zeichen)<br />

0 zum Anfang <strong>de</strong>r Zeile (erstes Zeichen)<br />

$ zum En<strong>de</strong> <strong>de</strong>r Zeile<br />

) zum nächsten Satz<br />

( zum vorhergehen<strong>de</strong>n Satz<br />

} zum nächsten Absatz<br />

{ zum vorhergehen<strong>de</strong>n Absatz<br />

]] zum nächsten Abschnitt<br />

[[ zum vorhergehen<strong>de</strong>n Abschnitt<br />

G zum En<strong>de</strong> <strong>de</strong>r Datei<br />

1G zum Anfang <strong>de</strong>r Datei<br />

H zum Anfang <strong>de</strong>s Bildschirms<br />

M zur Mitte <strong>de</strong>s Bildschirms<br />

L zur letzten Zeile <strong>de</strong>s Bildschirms<br />

Mit <strong>de</strong>n Tastensequenzen f kann vorwärts, mit b kann rückwärts gescrollt wer<strong>de</strong>n.


5. Editoren 43<br />

Kommandos zum Löschen <strong>von</strong> Text<br />

x<br />

dw<br />

dd<br />

D<br />

d^<br />

dG<br />

löscht ein Zeichen unter <strong>de</strong>m Cursor<br />

löscht das aktuelle Wort<br />

löscht die ganze Zeile<br />

löscht <strong>de</strong>n Rest <strong>de</strong>r aktuellen Zeile<br />

löscht <strong>von</strong> <strong>de</strong>r Cursorposition bis zum Anfang <strong>de</strong>r Zeile<br />

löscht <strong>von</strong> <strong>de</strong>r Cursorposition bis zum Datei-En<strong>de</strong><br />

Been<strong>de</strong>n <strong>de</strong>s Editors<br />

:x Abspeichern <strong>de</strong>s eingegebenen Textes<br />

:wq Abspeichern <strong>de</strong>s eingegebenen Textes<br />

ZZ Abspeichern <strong>de</strong>s eingegebenen Textes<br />

:q Been<strong>de</strong>n ohne Abspeichern (falls Text nicht geän<strong>de</strong>rt wur<strong>de</strong>)<br />

:q! Been<strong>de</strong>n ohne Abspeichern<br />

Vor <strong>de</strong>m Verlassen <strong>de</strong>s Editors muss mit <strong>de</strong>r -Taste erst <strong>de</strong>r command-mo<strong>de</strong> eingestellt wer<strong>de</strong>n.<br />

Kommandos zum Suchen und Ersetzen<br />

/muster<br />

?muster<br />

n<br />

N<br />

c<br />

C<br />

s<br />

S<br />

Suche <strong>de</strong>s Textmusters vorwärts<br />

Suche <strong>de</strong>s Textmusters rückwärts<br />

Suche wie<strong>de</strong>rholen<br />

Suche in umgekehrter Richtung wie<strong>de</strong>rholen<br />

Ersetzen eines Objektes<br />

Ersetzen <strong>de</strong>s Rests <strong>de</strong>r Zeile<br />

Ersetzen <strong>de</strong>s aktuellen Zeichens<br />

Ersetzen <strong>de</strong>r ganzen Zeile<br />

Obige Ersetz-Operationen wer<strong>de</strong>n mit <strong>de</strong>r -Taste abgeschlossen. Für das Suchen nach Textmustern<br />

können auch reguläre Ausdrücke verwen<strong>de</strong>t wer<strong>de</strong>n.<br />

Für das Ersetzen <strong>von</strong> Textmustern gibt es noch eine an<strong>de</strong>re Möglichkeit.<br />

:s/muster_alt/muster_neu/<br />

:1,$s/muster_alt/muster_neu/g<br />

Ersetzen <strong>de</strong>s nächsten Textmusters<br />

Ersetzen aller Textmuster in <strong>de</strong>r Datei<br />

Objektbezogene Kommandos<br />

c Ersetze das Objekt durch neue Eingabe<br />

d Lösche Objekt<br />

y Sichere Objekt<br />

> Schiebe Objekt nach rechts<br />

< Schiebe Objekt nach links<br />

Als Objekte wer<strong>de</strong>n <strong>de</strong>finiert<br />

Wort (w,W,b,B)<br />

Satz ((,))<br />

Absatz ({,})<br />

Abschnitt (]],[[)<br />

Folge <strong>von</strong> Buchstaben o<strong>de</strong>r Ziffern ohne Zwischenraum<br />

Folge <strong>von</strong> Worten, die mit ’.’, ’!’ o<strong>de</strong>r ’?’ abgeschlossen wird<br />

nach je<strong>de</strong>r Leerzeile<br />

Begrenzung ist ein formfeed


5. Editoren 44<br />

Die in Klammern stehen<strong>de</strong>n Zeichen stellen die Charakterisierung <strong>de</strong>s Objektes dar, die in Verbindung mit<br />

<strong>de</strong>n objektbezogenen Kommandos benutzt wird.<br />

>} Schiebt <strong>de</strong>n nächsten Absatz eine Tab-Position nach rechts<br />

yw Sichert das aktuelle Wort<br />

cw Ersetzt das aktuelle Wort mit <strong>de</strong>m eingegebenen Text<br />

d) Löscht <strong>de</strong>n nächsten Satz (bis ’.’, ’!’, ’?’)<br />

Sonstige nützliche Kommandos<br />

. Wie<strong>de</strong>rholung <strong>de</strong>r letzten Aktion<br />

u undo <strong>de</strong>r letzten Än<strong>de</strong>rung<br />

U undo aller Än<strong>de</strong>rungen in <strong>de</strong>r aktuellen Zeile<br />

:r file Einfügen einer Datei an <strong>de</strong>r aktuellen Cursorposition<br />

:!cmd Ausführen eines shell-Kommandos<br />

vi-Einstellungen<br />

Durch das Setzen diverser Parameter kann die Arbeitsweise <strong>de</strong>s vi-Editors modifiziert wer<strong>de</strong>n. Diese Parameter<br />

können interaktiv während <strong>de</strong>s Editierens eingegeben wer<strong>de</strong>n. Sollen dagegen die Modifikationen bei<br />

je<strong>de</strong>m künftigen vi-Aufruf zur Verfügung stehen, so ist es erfor<strong>de</strong>rlich, die entsprechen<strong>de</strong>n Kommandos in<br />

<strong>de</strong>r Datei .exrc im eigenen HOME-Verzeichnis einzutragen. Bei je<strong>de</strong>m vi-Aufruf wer<strong>de</strong>n die Einstellungen<br />

in dieser Datei berücksichtigt.<br />

:set<br />

:set all<br />

:set eb<br />

:set ic<br />

:set sw=10<br />

:set number<br />

:set list<br />

Anzeige aller Optionen, die geän<strong>de</strong>rt wur<strong>de</strong>n<br />

Anzeige aller möglichen Optionen und <strong>de</strong>ren aktueller Werte<br />

Vor je<strong>de</strong>r Fehlermeldung ertönt die Bell<br />

Mustersuche case insensitive<br />

Setzt die Distanz für shift-Operationen<br />

Je<strong>de</strong> Zeile wird mit ihrer Zeilennummer angezeigt<br />

Zeigt auch nicht sichtbare Zeichen an<br />

Das Rücksetzen <strong>de</strong>r meisten Parameter erfolgt durch ein vorangestelltes no (z.B. mit :set nonumber<br />

verschwin<strong>de</strong>t eine vorher eingestellte Zeilennummerierung).<br />

5.2. Der emacs - Editor<br />

emacs ist ein fullscreen-Editor, <strong>de</strong>r auf <strong>de</strong>n meisten <strong>Unix</strong>/<strong>Linux</strong>-Rechnern als installierte public-domain-<br />

Software zur Verfügung steht. Oft wird dieser Editor auch gleich mit <strong>de</strong>m Betriebssystem ausgeliefert.<br />

Der emacs kommt in verschie<strong>de</strong>nen Varianten vor: emacs, epoch, xemacs, lemacs, jove. Allen Varianten<br />

gemeinsam ist die gleiche Funktionsbasis, die Handhabung ist aber etwas unterschiedlich.<br />

Wie beim vi arbeitet man auch beim emacs in einem Puffer-Bereich. Je nach file-Name (extension) schaltet<br />

<strong>de</strong>r emacs beim Aufruf in <strong>de</strong>n dafür geeigneten major-mo<strong>de</strong> um. Wird z.B. ein normales ASCII-file editiert,<br />

so wird im major-mo<strong>de</strong> text gearbeitet. Wird dagegen ein file mit <strong>de</strong>r Extension .tex geöffnet, so stellt<br />

emacs als major-mo<strong>de</strong> TeX ein. Der Sinn dieser unterschiedlichen Editor-mo<strong>de</strong>s liegt in <strong>de</strong>r Bereitstellung<br />

geeigneter Tasten-Sequenzen für das Editieren spezieller Texte (z.B. Formatierung bei C-Programmen).<br />

Der Funktionsumfang <strong>de</strong>s emacs-Editors geht weit über die Standardfunktionen eines Editors hinaus. So<br />

kann emacs als Mail-Tool, als File-Manager o<strong>de</strong>r als News-Rea<strong>de</strong>r verwen<strong>de</strong>t wer<strong>de</strong>n. Auch <strong>von</strong> manchen<br />

Programmier-Umgebungen wird emacs als Standard-Editor benutzt.


5. Editoren 45<br />

Aufruf <strong>de</strong>s Editors<br />

emacs<br />

emacs filename<br />

Aufruf ohne Dateiname<br />

Aufruf mit Dateiname<br />

Nach Aufruf <strong>de</strong>s Editors befin<strong>de</strong>t man sich grundsätzlich im insert-Modus, d.h. es kann sofort mit <strong>de</strong>m Editieren<br />

begonnen wer<strong>de</strong>n. Kommandos wer<strong>de</strong>n im emacs mit <strong>de</strong>n Tasten bzw. eingeleitet.<br />

Der - key kann auf verschie<strong>de</strong>nen <strong>Unix</strong>-Systemen auf unterschiedlichen Tasten gemappt sein (bei<br />

Sun Workstations ist <strong>de</strong>r - key die Taste mit <strong>de</strong>r Raute, bei PCs ist es die - Taste). Wird<br />

als Meta-Taste verwen<strong>de</strong>t, so ist nur ein ein einmaliges Betätigen <strong>de</strong>r Taste erfor<strong>de</strong>rlich (nicht die<br />

- Taste gedrückt halten !!!).<br />

Nach <strong>de</strong>m Start <strong>von</strong> emacs kann mit h T ein sehr schönes online-Tutorial aufgerufen wer<strong>de</strong>n.<br />

Abbildung 5.2.: Aufruf <strong>von</strong> emacs unter <strong>Linux</strong><br />

Positionieren <strong>de</strong>s Cursors und Scrolling<br />

f<br />

b<br />

n<br />

p<br />

Cursor ein Zeichen nach rechts<br />

Cursor ein Zeichen nach links<br />

Cursor eine Zeile nach unten<br />

Cursor eine Zeile nach oben<br />

Neben obigen Tastensequenzen können natürlich auch die Pfeiltasten zur Positionierung <strong>de</strong>s Cursors verwen<strong>de</strong>t<br />

wer<strong>de</strong>n. Auch <strong>de</strong>r Mauszeiger setzt <strong>de</strong>n Cursor an die gewünschte Position, falls auf einer graphischen<br />

Benutzeroberfläche gearbeitet wird.


5. Editoren 46<br />

f<br />

b<br />

a<br />

e<br />

<<br />

><br />

v<br />

v<br />

Cursor ein Wort nach rechts<br />

Cursor ein Wort nach links<br />

Cursor zum Zeilenanfang<br />

Cursor zum Zeilenen<strong>de</strong><br />

Cursor zum Dateianfang<br />

Cursor zum Dateien<strong>de</strong><br />

Bildschirm vorwärts blättern<br />

Bildschirm rückwärts blättern<br />

Löschen <strong>von</strong> Text<br />

<br />

d<br />

<br />

d<br />

k<br />

Löscht ein Zeichen links vom Cursor<br />

Löscht das aktuelle Zeichen<br />

Löscht ein Wort links vom Cursor<br />

Löscht ein Wort rechts vom Cursor<br />

Löscht bis zum En<strong>de</strong> <strong>de</strong>r Zeile<br />

Been<strong>de</strong>n <strong>de</strong>s Editors<br />

x c<br />

x s<br />

x w<br />

Verlassen <strong>de</strong>s Editors ohne Abspeichern<br />

Abspeichern <strong>de</strong>s Textes<br />

Abspeichern <strong>de</strong>s Textes<br />

Suchen und Ersetzen<br />

s Suche vorwärts<br />

r Suche rückwärts<br />

% Kommando zum Ersetzen eines Text-Strings<br />

Ersetzen <strong>de</strong>s Strings und weiter zum Nächsten<br />

n<br />

Weiter zum nächsten String ohne Ersetzen<br />

! Ersetzen aller Strings bis zum Dateien<strong>de</strong><br />

Sonstige nützliche Kommandos<br />

g<br />

x u<br />

x i<br />

x 1<br />

x b<br />

x b<br />

x tex-mo<strong>de</strong><br />

x text-mo<strong>de</strong><br />

Kommando abbrechen<br />

undo <strong>de</strong>r letzten Än<strong>de</strong>rung<br />

Einfügen einer Datei an <strong>de</strong>r aktuellen Cursorposition<br />

Alle Fenster ausser <strong>de</strong>m aktuellen löschen<br />

Wechsel zu einem an<strong>de</strong>ren Puffer<br />

Anzeige <strong>de</strong>r Buffer-List<br />

Einstellen <strong>de</strong>s TeX-Modus<br />

Einstellen <strong>de</strong>s Text-Modus<br />

Es ist möglich, über das file .emacs die Charakteristik <strong>de</strong>s Editors schon beim Aufruf festzulegen. Die<br />

Einstellungen in dieser Datei müssen allerdings in Lisp-Co<strong>de</strong> erfolgen.<br />

(<strong>de</strong>fun datum()<br />

"Tagesdatum in Text einfuegen"<br />

(interactive)<br />

(shell-command "date" t))<br />

(global-set-key "\C-cd" ’datum)


5. Editoren 47<br />

Obiges Beispiel <strong>de</strong>finiert die Lisp-Funktion datum. Mit dieser Funktion soll das aktuelle Tagesdatum<br />

an <strong>de</strong>r Cursorposition eingefügt wer<strong>de</strong>n. Die Funktion wird dann mit global-set-key an die Tastensequenz<br />

c d gebun<strong>de</strong>n. Falls man selbst kein Lisp-Spezialist ist, sollten für <strong>de</strong>rartige Einstellungen<br />

ausführliche emacs-Dokumentationen zu Rate gezogen wer<strong>de</strong>n.<br />

5.3. Sonstige Editoren<br />

vi und emacs stellen die unter <strong>Unix</strong>/<strong>Linux</strong> am weitesten verbreiteten Editoren dar. Daneben gibt es auf<br />

<strong>de</strong>n Systemen natürlich noch weitere Editoren. Auf Sun Solaris existiert ein Editor namens dtpad, auf<br />

<strong>Linux</strong>-Rechnern gibt es die Editoren gedit und kedit. Auf bei<strong>de</strong>n Systemen wie<strong>de</strong>rum kann man die<br />

Editoren nedit und xedit benutzen. Diese Editoren sind in <strong>de</strong>r Regel leicht menügesteuert zu bedienen<br />

und wer<strong>de</strong>n auch in <strong>de</strong>n Manual-Pages entsprechend dokumentiert. Wie bei <strong>de</strong>n Benutzeroberflächen ist die<br />

Wahl eines Editors einfach Geschmacksache.<br />

Abbildung 5.3.: Der Editor gedit unter <strong>Linux</strong>


6. Die csh/tcsh - Shell<br />

Unter einer shell wird allgemein ein Kommando-Interpreter verstan<strong>de</strong>n. Wie bei an<strong>de</strong>ren Betriebssystemen<br />

übernimmt dieser Interpreter die Verarbeitung <strong>de</strong>r eingegebenen Kommandos. Auf <strong>Unix</strong>/<strong>Linux</strong>-Systemen<br />

sind in <strong>de</strong>r Regel folgen<strong>de</strong> shells anzutreffen: sh (Bourne-shell), bash (Bourne-again-shell), ksh (Kornshell),<br />

jsh (Job-Control-shell), csh (c-shell) und tcsh ( eine Variante <strong>de</strong>r csh, die vorzugsweise an <strong>de</strong>r<br />

Uni Regensburg eingesetzt wird).<br />

Was ist <strong>de</strong>r Grund für diese Menge verschie<strong>de</strong>ner shell-Varianten? So wie bei <strong>de</strong>n Editoren besitzt auch<br />

je<strong>de</strong> shell gewisse Stärken, aber auch einige Schwächen. Es hängt vom gefor<strong>de</strong>rten Einsatz ab, welcher<br />

shell man <strong>de</strong>n Vorzug gibt. Es gibt shells, die sich eher für die interaktive Arbeit eignen (tcsh, bash),<br />

an<strong>de</strong>re sind dagegen für das Schreiben <strong>von</strong> shell-Prozeduren besser geeignet (sh, ksh).<br />

Da an <strong>de</strong>r Uni Regensburg die gesamte Benutzerumgebung auf die tcsh bzw. csh abgestimmt wur<strong>de</strong>,<br />

wer<strong>de</strong>n daher diese shells intensiver behan<strong>de</strong>lt. Hinzu kommt, dass viele Mechanismen, die hier betrachtet<br />

wer<strong>de</strong>n, auch in an<strong>de</strong>ren shell-Varianten in gleicher o<strong>de</strong>r in ähnlicher Weise anzutreffen sind.<br />

6.1. Kommandowie<strong>de</strong>rholung<br />

Alle Kommandos, die interaktiv eingegeben wer<strong>de</strong>n, wer<strong>de</strong>n in einer sog. History-Liste gesichert. Auf diese<br />

Liste kann zurückgegriffen wer<strong>de</strong>n, um bestimmte Kommandos wie<strong>de</strong>rholt aufzurufen, ohne das gesamte<br />

Kommando nochmals eintippen zu müssen. Beim Login wird außer<strong>de</strong>m eine Datei namens .history<br />

angelegt, die die Speicherung <strong>de</strong>r History-Liste übernimmt. So stehen die Kommados sogar nach einem<br />

Logout beim nächsten Login wie<strong>de</strong>r zur Verfügung. Die History-Liste kann man mit <strong>de</strong>m Kommando<br />

history ansehen.<br />

rechner> history<br />

rechner> history | tail -5<br />

Ausgabe <strong>de</strong>r gesamten History-Liste<br />

Ausgabe <strong>de</strong>r letzten 5 Kommandos<br />

History-Kommandos<br />

Die Referenz auf ein in <strong>de</strong>r History-Liste stehen<strong>de</strong>s Kommando erfolgt mit einem vorangestellten Rufezeichen<br />

! Dies ist auch <strong>de</strong>r Grund dafür, dass das Rufezeichen bei an<strong>de</strong>rweitiger Verwendung maskiert wer<strong>de</strong>n<br />

muss.<br />

rechner> !!<br />

rechner> !17<br />

rechner> !-4<br />

rechner> !vi<br />

das zuletzt eingegebene Kommando wird ausgeführt<br />

das Kommando Nr. 17 in <strong>de</strong>r History-Liste wird ausgeführt<br />

das viertletzte Kommando wird ausgeführt<br />

<strong>de</strong>r letzte vi-Aufruf wird ausgeführt<br />

Wie oben zu sehen, kann die Referenz auf ein Kommando <strong>de</strong>r History-Liste entwe<strong>de</strong>r mit <strong>de</strong>r Nummer<br />

o<strong>de</strong>r mit einem Namen erfolgen. Beim Bezug auf einen Kommandonamen wird das letzte Kommando<br />

genommen.


6. Die csh/tcsh - Shell 49<br />

Kommando-Modifikation mittels History-Kommandos<br />

0 1 2 3 4 5<br />

ls -l berta hugo | more<br />

<strong>Eine</strong> Kommando-Eingabe kann man sich als Aneinan<strong>de</strong>rreihung einzelner Wörter vorstellen. Die Zeichen<br />

|, und & gelten dabei als eigene Wörter. Auf die einzelnen Kommandobestandteile kann durch Angabe<br />

<strong>de</strong>r entsprechen<strong>de</strong>n Wortnummer in History-Kommandos Bezug genommen wer<strong>de</strong>n.<br />

rechner> cp !!:2 ~/text2<br />

Die Datei berta wird in das Subdirectory text2 kopiert<br />

rechner> chmod 666 !ls:2-3<br />

Der chmod-Befehl wird für die Dateien berta und hugo ausgeführt, <strong>de</strong>m<br />

zweiten und dritten Argument im letzten ls-Befehl<br />

Für die Korrektur <strong>von</strong> Tippfehlern im zuletzt eingegebenen Kommando, gibt es eine einfache Möglichkeit.<br />

rechner> more text2/briefe/ina.txt<br />

rechner> ^2^3<br />

für text2 soll text3 stehen<br />

Korrektur mit <strong>de</strong>m Zeichen ^<br />

Neben <strong>de</strong>n oben erwähnten History-Kommandos lässt die tcsh auch das Vorwärts- und Rückwärts-Blättern<br />

<strong>de</strong>r History-Liste mit <strong>de</strong>n Pfeiltasten zu. Dies ist für viele Benutzer oft einfacher, als sich die verschie<strong>de</strong>nen<br />

History-Modifikationen zu merken.<br />

6.2. Vervollständigung <strong>von</strong> Kommandos, Variablen und Dateinamen<br />

Mit <strong>de</strong>r tcsh lässt sich eine Menge Tipp-Arbeit sparen. Bei <strong>de</strong>r Eingabe <strong>von</strong> Kommandos, Variablen und<br />

Dateinamen genügt es, die ersten paar Zeichen zu schreiben und danach die -Taste zu drücken, um<br />

<strong>de</strong>n kompletten Namen zu vervollständigen.<br />

rechner> fing<br />

rechner> fin d<br />

find find2perl findaffix finger<br />

wird zum Kommando finger komplettiert<br />

zeigt alle Kommandos an, die im Suchpfad mit fin<br />

beginnen<br />

Gibt es mehrere Kommandos, Variable o<strong>de</strong>r Dateinamen, die mit <strong>de</strong>r gleichen Zeichenfolge beginnen, so<br />

kann mit <strong>de</strong>r Tastensequenz d eine Übersicht ausgegeben wer<strong>de</strong>n.<br />

rechner> echo $ver<br />

rechner> echo $MAIL d<br />

MAIL MAILCAPS MAILSERVERNAME<br />

Variablenname wird zu version komplettiert<br />

zeigt alle Variable an, die mit MAIL beginnen<br />

rechner> more d<br />

briefe/ else ina rudi<br />

rechner> more el<br />

Anzeige aller Dateien und Directories<br />

Dateiname wird zu else komplettiert<br />

Bei <strong>de</strong>r Anwendung <strong>von</strong> d auf Dateinamen wer<strong>de</strong>n Directories mit einem / hinter <strong>de</strong>m Namen<br />

gekennzeichnet. Durch mehrfaches Verwen<strong>de</strong>n <strong>de</strong>r -Taste können auch längere Pfadnamen zusammengesetzt<br />

wer<strong>de</strong>n.


6. Die csh/tcsh - Shell 50<br />

6.3. alias - Mechanismus<br />

aliases sind selbst<strong>de</strong>finierte Kommandobezeichnungen. Sie wer<strong>de</strong>n in erster Line <strong>de</strong>swegen <strong>de</strong>finiert, um<br />

komplexere Kommandoeingaben abzukürzen und <strong>de</strong>n eigenen Bedürfnissen anzupassen.<br />

alias name <strong>de</strong>finition<br />

unalias name<br />

alias<br />

Definition eines aliases<br />

Löschen einer alias-Definition<br />

Anzeigen aller gesetzten aliases<br />

Durch die Eingabe <strong>von</strong> name wer<strong>de</strong>n die in <strong>de</strong>r <strong>de</strong>finition enthaltenen Kommandos ausgeführt.<br />

rechner> alias ll ls -al<br />

Eingabe <strong>von</strong> ll führt das Kommando ls -al aus<br />

rechner> alias sys ’ps -ef | more’<br />

Längere alias-Definitionen wer<strong>de</strong>n in Hochkommas eingeschlossen<br />

Verwendung <strong>von</strong> Argumenten in alias-Definitionen<br />

!^ Platzhalter für das erste Argument <strong>de</strong>s aktuellen Kommandos<br />

!* Platzhalter für alle Argumente <strong>de</strong>s aktuellen Kommandos<br />

Für das find-Kommando soll ein alias <strong>de</strong>finiert wer<strong>de</strong>n, bei <strong>de</strong>m genau das erste Argument (hier <strong>de</strong>r Dateiname)<br />

übergeben wer<strong>de</strong>n soll.<br />

rechner> alias ff ’find<br />

~ -name \!^ -print’<br />

rechner> ff filename<br />

Der filename wird in obigem alias als Argument eingesetzt<br />

Es soll ein alias <strong>de</strong>finiert wer<strong>de</strong>n, das ein Directory-Listing beliebig vieler Verzeichnisse seitenweise ausgibt<br />

( l dir1 dir2 dir3 ).<br />

rechner> alias l ’ls -l \!* | more’<br />

Hier ist es erfor<strong>de</strong>rlich, dass alle Argumente in die Definition übernommen wer<strong>de</strong>n, da ja erst danach das<br />

seitenweise Auflisten mit <strong>de</strong>m more-Kommando folgt.<br />

Weitere Beispiele:<br />

rechner> alias cd ’cd \!*; set prompt="$cwd> "’<br />

Bei je<strong>de</strong>m cd wird das aktuelle Directory als prompt gesetzt<br />

rechner> alias tm ’(set d=‘date‘; echo $d[4])’<br />

Das Kommando tm gibt die aktuelle Uhrzeit aus<br />

Bei <strong>de</strong>r Interpretation <strong>von</strong> Kommandos wird folgen<strong>de</strong> Abarbeitungs-Reihenfolge eingehalten: 1. Alias-<br />

Substitution, 2. Built-in Kommandos, 3. Kommandos im Suchpfad. Alias-Definitionen wer<strong>de</strong>n also immer<br />

als erste interpretiert. Dies ermöglicht eine Um<strong>de</strong>finition <strong>von</strong> built-in und Suchpfad-Kommandos (Vorsicht:<br />

Um<strong>de</strong>finition kann dazu führen, dass ursprüngliche Kommandos nicht mehr funktionieren). Sollen alias-<br />

Definitionen auch nach <strong>de</strong>m nächsten Einloggen und in untergeordneten shells zur Verfügung stehen, so<br />

sind sie in die Datei .cshrc bzw. .myalias einzutragen. Will man eingetragene Definitionen sofort<br />

aktivieren, so geschieht dies mit <strong>de</strong>m Kommando source .cshrc bzw. source .myalias.


6. Die csh/tcsh - Shell 51<br />

6.4. Ein- und Ausgabeumlenkung<br />

Die Ein- und Ausgabe <strong>von</strong> Kommandos erfolgt in <strong>de</strong>r Regel innerhalb eines Terminals. Wer<strong>de</strong>n dagegen<br />

Dateien für die Eingabe bzw. Ausgabe verwen<strong>de</strong>t, so spricht man <strong>von</strong> Ein- bzw. Ausgabeumlenkung.<br />

Ausgabeumlenkung<br />

Bei <strong>de</strong>r Ausgabe wird zwischen einer Standardausgabe und einer Standardfehlerausgabe unterschie<strong>de</strong>n.<br />

Die Standardausgabe enthält alle Daten, die ein Kommando bei seinem regulären Ablauf ausgibt. Die<br />

Standardfehlerausgabe besteht dagegen aus Diagnose-Meldungen, die auf Probleme bei <strong>de</strong>r Abarbeitung<br />

hinweisen sollen.<br />

command > filename<br />

command >> filename<br />

command >& filename<br />

command >>& filename<br />

Ausgabe wird in die Datei filename geschrieben<br />

Ausgabe wird <strong>de</strong>m Inhalt <strong>de</strong>r Datei filename angehängt<br />

Diagnose-Meldungen wer<strong>de</strong>n in die Datei geschrieben<br />

Diagnose-Meldungen wer<strong>de</strong>n <strong>de</strong>m Inhalt <strong>de</strong>r Datei angehängt<br />

Wird nur die Ausgabeumlenkung für Diagnose-Meldungen mit >& <strong>de</strong>finiert, so wird sowohl die Standardausgabe<br />

als auch die Standardfehlerausgabe in die gleiche Datei umgelenkt.<br />

rechner> date > dirliste<br />

Die Ausgabe <strong>de</strong>s aktuellen Datums wird in die Datei dirliste umgelenkt<br />

rechner> ls -al >> dirliste<br />

Der Datei dirliste wird das Directory-Listing angefügt<br />

rechner> (date; ls -al) > dirliste<br />

Die Ausgabe bei<strong>de</strong>r obigen Kommandos wird in einem Aufruf mittels Kommandogruppierung<br />

in die Datei dirliste umgelenkt.<br />

rechner> find /var -name mail -print >& err_output<br />

Das find-Kommando sucht im Verzeichnis var nach <strong>de</strong>m Namen mail,<br />

wobei alle Diagnose-Meldungen in die Datei err_output umgelenkt wer<strong>de</strong>n<br />

Das letzte Beispiel dokumentiert das Problem, Ausgabe und Fehlerausgabe zu trennen. Bei obigem find-<br />

Kommando wer<strong>de</strong>n daher nicht nur die Diagnose-Meldungen, son<strong>de</strong>rn auch die Standardausgaben in die<br />

Datei err_output umgeleitet. Reguläre Ausgaben <strong>de</strong>s find-Kommandos stehen somit vermischt zwischen<br />

<strong>de</strong>n Fehlerausgaben. Sollen die Standardausgaben und die Fehlerausgaben in getrennte Dateien erfolgen,<br />

so muss das Kommando folgen<strong>de</strong>rmaßen abgesetzt wer<strong>de</strong>n.<br />

rechner> (find /var -name mail -print > output) >& err_output<br />

Preisfrage: Wie muss das find-Kommando aussehen, wenn die Standardausgabe ganz normal auf das<br />

Terminal, die Standardfehlerausgabe aber in eine Datei erfolgen soll?<br />

Die Ausgabeumlenkung wird häufig in Zusammenhang mit Hintergrundprozessen verwen<strong>de</strong>t, die mit <strong>de</strong>m<br />

nohup-Befehl gestartet wur<strong>de</strong>n und nach einem Logout weiterlaufen. Da hierbei kein Terminal für die<br />

Ausgabe existiert, ist es wichtig, dass <strong>de</strong>r Prozess ev. auftreten<strong>de</strong> Ausgaben in eine Datei schreiben kann.


6. Die csh/tcsh - Shell 52<br />

Mit <strong>de</strong>r Umgebungs-Variablen noclobber können versehentliche Überschreibungen <strong>von</strong> Dateien verhin<strong>de</strong>rt<br />

wer<strong>de</strong>n. Ist die Datei, in die <strong>de</strong>r Output geschrieben wer<strong>de</strong>n soll, bereits vorhan<strong>de</strong>n, so erscheint<br />

die Meldung Datei existiert. Bei Dateien, die für eine Anfügung <strong>von</strong> Output ausgewählt wer<strong>de</strong>n,<br />

wird Datei o<strong>de</strong>r Verzeichnis nicht gefun<strong>de</strong>n ausgegeben, falls die Datei noch nicht<br />

existiert. Will man diesen Sicherheits-Mechanismus wie<strong>de</strong>r ausschalten, so muss die Variable noclobber<br />

<strong>de</strong>aktiviert wer<strong>de</strong>n (unset noclobber). Bei gesetztem noclobber können einzelne Überschreibungen<br />

durch Anfügen eines ! an <strong>de</strong>n Umlenkungs-Operator realisiert wer<strong>de</strong>n ( >! >>! >&! >>&! ).<br />

Eingabeumlenkung<br />

Bei <strong>de</strong>r Eingabe-Umlenkung wird <strong>de</strong>r Inhalt einer Datei als Input für ein Kommando verwen<strong>de</strong>t.<br />

command < filename<br />

command mailx rar12345 < brief<br />

rechner> tr "[A-Z]" "[a-z]" < report > report.low<br />

Obiges tr-Kommando ist ein Beispiel für das gleichzeitige Verwen<strong>de</strong>n <strong>von</strong> Ein- und Ausgabe-Umlenkung.<br />

Alle Grossbuchstaben in <strong>de</strong>r Datei report wer<strong>de</strong>n in Kleinbuchstaben konvertiert und das Resultat in <strong>de</strong>r<br />

Datei report.low abgelegt. Die Datei report wird dabei nicht verän<strong>de</strong>rt.<br />

6.5. Variable<br />

Variable wer<strong>de</strong>n zur Speicherung alphanumerischer Daten verwen<strong>de</strong>t. Variablennamen beginnen immer mit<br />

einem Buchstaben. Man unterschei<strong>de</strong>t lokale und globale Variable. Lokale Variable sind nur innerhalb <strong>de</strong>r<br />

aktuellen (current) shell bekannt. Globale Variable wer<strong>de</strong>n an untergeordnete Prozesse weitervererbt.<br />

6.5.1. Lokale Variable<br />

Für die Definition <strong>von</strong> lokalen Variablen existieren zwei Formen:<br />

set varname = wert<br />

@ varname = wert<br />

unset varname<br />

set<br />

wird für beliebige Werte verwen<strong>de</strong>t<br />

wird für numerische Werte verwen<strong>de</strong>t<br />

Eliminiert eine lokale Variable<br />

zeigt alle <strong>de</strong>finierten Variablen an<br />

Die Referenz auf bestimmte Variablen wird durch ein vorangestelltes Dollarzeichen erreicht.<br />

echo-Kommando wird <strong>de</strong>r Inhalt einer Variablen ausgegeben.<br />

Mit <strong>de</strong>m<br />

echo $varname<br />

echo $#varname<br />

gibt die Variablenwerte aus<br />

gibt die Anzahl <strong>de</strong>r Argumente in <strong>de</strong>r Variablen aus


6. Die csh/tcsh - Shell 53<br />

Beispiele:<br />

rechner> set ml = doris else rudi<br />

Definition <strong>de</strong>r Variablen ml<br />

rechner> echo $ml<br />

es wird nur doris ausgegeben, da Leerzeichen als Trennzeichen wirken<br />

rechner> set ml = ’doris else rudi’<br />

rechner> set ml = "doris else rudi"<br />

rechner> echo $ml<br />

nun wer<strong>de</strong>n in bei<strong>de</strong>n Fällen alle drei Namen angezeigt<br />

Man beachte in obigen Variablen-Definitionen die unterschiedliche Wirkungsweise <strong>de</strong>r Maskierung. Einfache<br />

Hochkommas maskieren alle eingeschlossenen Zeichen, während dagegen Anführungszeichen die<br />

Interpretation <strong>de</strong>r Zeichen $, \ und ‘ zulassen.<br />

Mit <strong>de</strong>m Kommando echo $#ml kann die Anzahl <strong>de</strong>r in <strong>de</strong>r Variablen enthaltenen Argumente ausgegeben<br />

wer<strong>de</strong>n. Im vorliegen<strong>de</strong>n Beispiel beträgt dieser Wert 1, obwohl die Variable ml aus 3 Namen besteht.<br />

Soll eine Variable aus einer indizierbaren Wortliste bestehen, so muss die Variable folgen<strong>de</strong>rmaßen <strong>de</strong>finiert<br />

wer<strong>de</strong>n:<br />

set varname = ( wert1 wert2 wert3 ... )<br />

Die Variable besteht nun aus einzelnen Argumenten. Ein indizierter Zugriff auf ein einzelnes Argument<br />

erfolgt mit set varname[n] bzw. mit $varname[n].<br />

Beispiele:<br />

rechner> set ml = ( doris else rudi )<br />

Definition <strong>de</strong>r Variable ml als word-list<br />

rechner> echo $#ml liefert jetzt <strong>de</strong>n Wert 3<br />

rechner> set ml[2] = peter ersetzt das zweite Argument (else) durch<br />

peter<br />

rechner> echo ${ml}ratlos Verkettung mit Textstring<br />

Das letzte Beispiel <strong>de</strong>monstriert die Verkettung einer Variablen mit Text. Damit <strong>de</strong>r Variablenname ein<strong>de</strong>utig<br />

interpretiert wer<strong>de</strong>n kann, muss er in geschweiften Klammern eingeschlossen wer<strong>de</strong>n. Als Ausgabe<br />

erhält man in obigem Fall doris peter rudiratlos.<br />

Zuweisungsoperationen mit numerischen Variablen<br />

In folgen<strong>de</strong>r Tabelle wird <strong>von</strong> <strong>de</strong>m Wert 6 als Ausgangswert für die Variable count ausgegangen. Das<br />

Ergebnis kann mit <strong>de</strong>m Kommando echo $count angezeigt wer<strong>de</strong>n.<br />

Symbol Beispiel Ergebnis<br />

= @ count = 0 0<br />

+= @ count += 2 8<br />

-= @ count -= 5 1<br />

*= @ count *= 8 48<br />

/= @ count /= 4 1<br />

++ @ count ++ 7<br />

- @ count - 5


6. Die csh/tcsh - Shell 54<br />

Arithmetische, bitweise und logische Operationen mit numerischen Variablen<br />

Der Ausgangswert <strong>de</strong>r Variable num soll hier 10 betragen, das Ergebnis wird mit echo $r ermittelt.<br />

Symbol Beispiel Ergebnis<br />

+ @ r = $num + 4 14<br />

- @ r = $num - 5 5<br />

* @ r = $num * 10 100<br />

/ @ r = $num / 6 1<br />

% @ r = $num % 3 1<br />

» @ r = ($num » 2) 2<br />

« @ r = ($num « 3) 80<br />

Symbol Beispiel Ergebnis<br />

~ @ r = ~ $num -11 1 Komplement<br />

! @ r = ! $num 0 logische Negation<br />

| @ r = ($num | 7) 15 bitweise or<br />

^ @ r = ($num ^ 7) 13 bitweise excl. or<br />

& @ r = ($num & 6) 2 bitweise and<br />

|| @ r = ($num > 8 || $num < 4) 1 logisch or<br />

&& @ r = ($num > 4 && $num < 8) 0 logisch and<br />

Vergleichsoperationen<br />

In dieser Tabelle beträgt <strong>de</strong>r Anfangswert <strong>von</strong> num 5, die Variable str besitzt <strong>de</strong>n Wert xyz und die<br />

Variable pat <strong>de</strong>n Wert abc.<br />

Symbol Beispiel Ergebnis<br />

== $num == 5 true<br />

!= $num != 5 false<br />

> $num > 3 true<br />

>= $num >= 3 true<br />

< $num < 3 false<br />


6. Die csh/tcsh - Shell 55<br />

$argv enthält alle Argumente <strong>de</strong>s Prozeduraufrufs<br />

$* " " " " "<br />

$argv[*] " " " " "<br />

$n enthält das n-te Argument <strong>de</strong>s Prozeduraufrufs<br />

${n} " " " " "<br />

$argv[n] " " " " "<br />

$# enthält die Anzahl <strong>de</strong>r Argumente<br />

$#argv " " " "<br />

$0 enthält <strong>de</strong>n Namen <strong>de</strong>r aufgerufenen Prozedur<br />

$argv[0] " " " " "<br />

$_ enthält <strong>de</strong>n Namen <strong>de</strong>s zuletzt ausgeführten Kommandos<br />

$$ enthält die Process-Id <strong>de</strong>r ausführen<strong>de</strong>n shell<br />

$status enthält <strong>de</strong>n exit-status <strong>de</strong>s zuletzt ausgeführten Kommandos<br />

$? " " " " "<br />

$< liest eine Zeile <strong>von</strong> <strong>de</strong>r Tastatur<br />

Um beispielsweise <strong>de</strong>n Tastaturinput einer Variablen zuzuweisen, <strong>de</strong>finiert man set input = $ setenv STADT Regensburg<br />

rechner> echo $STADT<br />

Wichtige globale Variable<br />

Definition <strong>de</strong>r globalen Variablen STADT<br />

Ausgabe <strong>de</strong>s Wertes <strong>von</strong> STADT<br />

Standardmäßig wer<strong>de</strong>n beim Login bereits eine Reihe <strong>von</strong> globalen Variablen <strong>de</strong>finiert, die die Benutzerumgebung<br />

festlegen. So wird in <strong>de</strong>r Variablen HOME das Login-Verzeichnis gespeichert, in <strong>de</strong>r Variablen<br />

PATH steht <strong>de</strong>r Suchpfad für Kommandoeingaben. Die Variable MAIL enthält die <strong>Unix</strong>-Mailbox und in <strong>de</strong>r<br />

Variablen SHELL ist die Login-shell abgelegt. Manche lokale Variable wer<strong>de</strong>n beim Login gleich in globale<br />

Variable exportiert (path -> PATH).


6. Die csh/tcsh - Shell 56<br />

6.6. Shell-Programmierung<br />

Unter Shell-Programmierung versteht man das Schreiben <strong>von</strong> Kommando-Prozeduren. Diese Kommando-Prozeduren<br />

sind nichts an<strong>de</strong>res als Dateien, die shell-Kommandos enthalten. In <strong>de</strong>r ersten Zeile einer<br />

Kommando-Prozedur sollte <strong>de</strong>m System mitgeteilt wer<strong>de</strong>n, unter welcher shell die Prozedur abgearbeitet<br />

wer<strong>de</strong>n soll. Die erste Zeile bei csh-Prozeduren lautet daher #!/bin/csh, bei tcsh-Prozeduren<br />

#!/usr/local/bin/tcsh bzw. #!/bin/tcsh. Ansonsten gilt das Zeichen # als Kommentarzeichen.<br />

#!/usr/local/bin/tcsh<br />

#<br />

# Datei: filecount<br />

# script zum zaehlen <strong>von</strong> Dateien und Directories<br />

# 02.05.97 - WP<br />

#<br />

echo -n "Dateien und Directories"<br />

ls -al | wc -l<br />

exit<br />

Nach <strong>de</strong>m Editieren <strong>de</strong>r Datei müssen noch die execute-Rechte gesetzt wer<strong>de</strong>n, damit die Prozedur auch<br />

ausgeführt wer<strong>de</strong>n kann.<br />

rechner> chmod u+x filecount<br />

rechner> ./filecount<br />

execute-rechte wer<strong>de</strong>n gesetzt<br />

Aufruf <strong>de</strong>r Prozedur<br />

Wer<strong>de</strong>n csh- bzw. tcsh-Skripten mit Argumenten aufgerufen, so wer<strong>de</strong>n die Argumente auf die beson<strong>de</strong>ren<br />

Variablen $n, $argv[n] abgebil<strong>de</strong>t. In <strong>de</strong>r Prozedur kann dann auf diese Variablen referenziert<br />

wer<strong>de</strong>n.<br />

#!/usr/local/bin/tcsh<br />

#<br />

# Datei: arguments<br />

# script zur Ausgabe <strong>von</strong> drei Input-Argumenten<br />

#<br />

# Usage: arguments arg1 arg2 arg3<br />

# 02.05.97 - WP<br />

#<br />

echo $1<br />

echo $argv[2]<br />

echo $3 $2 $1<br />

echo "$3 $2 $1"<br />

exit<br />

Der Aufruf <strong>de</strong>r Prozedur erfolgt mit Eingabe <strong>von</strong> Argumenten, die mit Leerzeichen <strong>von</strong>einan<strong>de</strong>r getrennt<br />

wer<strong>de</strong>n. Die ersten drei Argumente wer<strong>de</strong>n <strong>de</strong>n Variablen $1, $2 und $3 zugewiesen.<br />

rechner> ./arguments ina otto doris<br />

ina<br />

otto<br />

doris otto ina<br />

doris otto ina


6. Die csh/tcsh - Shell 57<br />

Um eine Kontrolle über <strong>de</strong>n Ablauf einer shell-Prozedur zu erhalten, ist es erfor<strong>de</strong>rlich sog. Steuerstrukturen<br />

einzubauen. Wie eine Programmiersprache kennt auch die tcsh bzw. csh <strong>de</strong>rarige Kontrollstrukturen.<br />

6.6.1. Die if - Anweisung<br />

if ( expression ) command<br />

if ( expression ) then<br />

command(s)<br />

else if ( expression ) then<br />

command(s)<br />

else<br />

command(s)<br />

endif<br />

Die if-Anweisung existiert also als einzelne Anweisung o<strong>de</strong>r als if-Block. Ein if-Block kann elseif- und<br />

else-Zweige besitzen. Es ist darauf zu achten, dass vor und hinter <strong>de</strong>n run<strong>de</strong>n Klammern min<strong>de</strong>stens ein<br />

Leerzeichen steht.<br />

#!/bin/csh<br />

#<br />

# Datei: if.csh<br />

# Beispiel zur if-Anweisung<br />

#<br />

# Usage: if.csh arg1 arg2 arg3 ...<br />

# 02.05.97 - WP<br />

#<br />

if ($#argv


6. Die csh/tcsh - Shell 58<br />

Obiges Skript verwen<strong>de</strong>t in <strong>de</strong>r foreach-Schleife die Variable $path als wordlist. Es wer<strong>de</strong>n alle Verzeichnisse<br />

gelistet, die im Suchpfad stehen.<br />

#!/bin/csh<br />

#<br />

# Datei: foreach2.csh<br />

#<br />

foreach datei (x1 x2 x3)<br />

echo $datei<br />

echo "$datei enthaelt diese Zeile" > $datei<br />

end<br />

Diese Prozedur legt die drei Dateien namens x1, x2 und x3 an mit jeweils einer Zeile Inhalt.<br />

6.6.3. Die while - Schleife<br />

while ( expression )<br />

command(s)<br />

end<br />

Die while-Schleife kann mit numerischen o<strong>de</strong>r string-Variablen benutzt wer<strong>de</strong>n. Die Schleife wird solange<br />

durchlaufen, bis expression false ist.<br />

#!/bin/csh<br />

#<br />

@ i = 1<br />

while ( $i


6. Die csh/tcsh - Shell 59<br />

Für die Ausgabe <strong>de</strong>r Usage wird in obiger Prozedur die Variable $0 verwen<strong>de</strong>t. In ihr wird <strong>de</strong>r Name<br />

<strong>de</strong>r Datei abgelegt, die die Prozedur enthält. Die Maskierung <strong>de</strong>s Doppelpunktes beim zweiten echo-<br />

Statement ist notwendig, damit die shell dies nicht als Bestandteil eines History-Kommandos interpretiert.<br />

Das zeilenweise Einlesen einer Datei kann unter <strong>de</strong>r bash einfacher gelöst wer<strong>de</strong>n.<br />

6.6.4. Die shift - Anweisung<br />

shift<br />

shift varname<br />

wirkt auf die Argumentenliste argv<br />

wirkt auf die Variable varname<br />

shift verschiebt die Argumente einer wordlist nach links. Das ganz links stehen<strong>de</strong> Argument fällt aus <strong>de</strong>r<br />

wordlist (Argumentenliste) heraus.<br />

#!/bin/csh<br />

#<br />

# Datei: shift.csh<br />

# Beispiel fuer shift-Statement<br />

#<br />

set line = $<<br />

set input = ( $line )<br />

foreach element<br />

end<br />

echo $input<br />

shift input<br />

($input)<br />

6.6.5. Fallunterscheidung mit switch und case<br />

switch ( string )<br />

case pattern1:<br />

command(s)<br />

breaksw<br />

case pattern2:<br />

command(s)<br />

breaksw<br />

...<br />

...<br />

<strong>de</strong>fault:<br />

command(s)<br />

breaksw<br />

endsw<br />

Es wird nach einer Übereinstimmung <strong>von</strong> string und pattern gesucht und die dort befindlichen Kommandos<br />

ausgeführt. Wird keine Übereinstimmung gefun<strong>de</strong>n, so wer<strong>de</strong>n die Kommandos unter <strong>de</strong>fault<br />

abgearbeitet. Im pattern-string können die pattern-matching character *, ? und [ ] verwen<strong>de</strong>t wer<strong>de</strong>n.<br />

#!/bin/csh<br />

#<br />

# Datei: case.csh<br />

# Beispiel fuer case


6. Die csh/tcsh - Shell 60<br />

#<br />

set line = $<<br />

set input = ( $line )<br />

foreach element ($input)<br />

switch ( $element )<br />

case [aA]*:<br />

echo "Name $element beginnt mit einem A"<br />

breaksw<br />

case [hH]*:<br />

echo "Name $element beginnt mit einem H"<br />

breaksw<br />

case [rR][uU][dD][iI]:<br />

echo "Der Name lautet $element"<br />

breaksw<br />

<strong>de</strong>fault:<br />

echo "Name interessiert mich nicht"<br />

breaksw<br />

endsw<br />

shift input<br />

end<br />

6.6.6. Die break- und continue-Anweisung<br />

Ein break bewirkt <strong>de</strong>n Abbruch <strong>de</strong>r Abarbeitung innerhalb einer Schleife; die Abarbeitung wird beim<br />

ersten Kommando hinter <strong>de</strong>r Schleife fortgesetzt.<br />

#!/bin/csh<br />

#<br />

set line = $<<br />

set input = ( $line )<br />

foreach element ($input)<br />

if ( $element == "otto" ) break<br />

echo $element<br />

end<br />

echo "Jetzt bin ich hinter <strong>de</strong>r Schleife"<br />

continue bewirkt <strong>de</strong>n Sprung zum En<strong>de</strong> einer Schleife, wobei die Schleife wie<strong>de</strong>rholt durchlaufen wird,<br />

solange die Bedingung dafür true ist.<br />

#!/bin/csh<br />

#<br />

set line = $<<br />

set input = ( $line )<br />

foreach element ($input)<br />

if ( $element == "otto" ) continue<br />

echo $element<br />

end<br />

echo "Jetzt bin ich hinter <strong>de</strong>r Schleife"


6. Die csh/tcsh - Shell 61<br />

6.6.7. Die goto-Anweisung<br />

Es wird ein unbedingter Sprung zum bezeichneten Label ausgeführt und mit <strong>de</strong>r Abarbeitung <strong>de</strong>r dahinter<br />

folgen<strong>de</strong>n Kommandos begonnen. Das Label muss mit einem Doppelpunkt abgeschlossen am Zeilenanfang<br />

stehen.<br />

#!/bin/csh<br />

#<br />

set line = $<<br />

set input = ( $line )<br />

foreach element ($input)<br />

if ( $element == "otto" ) goto ottolabel<br />

echo $element<br />

end<br />

exit<br />

#<br />

ottolabel:<br />

echo "otto geht ins schwimmbad"<br />

exit<br />

6.6.8. Allerlei Nützliches<br />

Eingabe <strong>von</strong> Tastatur<br />

Die interaktive Eingabe über die Tastatur erfolgt mit <strong>de</strong>r beson<strong>de</strong>ren Variablen $


6. Die csh/tcsh - Shell 62<br />

In tcsh-Prozeduren wird diese Art <strong>de</strong>s Tests meist in Zusammenhang mit <strong>de</strong>r if-Anweisung verwen<strong>de</strong>t.<br />

if ( ‘filetest -e .cshrc‘ ) echo "Datei existiert"<br />

Man beachte, dass das filetest-Kommando in umgekehrte einfache Hochkommas eingeschlossen wer<strong>de</strong>n<br />

muss.<br />

Die csh kennt die gleichen Operatoren für das Prüfen <strong>von</strong> Dateieigenschaften. Dabei genügt es, <strong>de</strong>n Operator<br />

zusammen mit <strong>de</strong>m Dateinamen in einem Ausdruck zu verwen<strong>de</strong>n. Diese Schreibweise kann auch in<br />

tcsh-Prozeduren kompatibel benutzt wer<strong>de</strong>n.<br />

if ( -e .cshrc ) echo "Datei existiert"<br />

Messung <strong>de</strong>s Zeitverbrauchs mit time<br />

Zur Messung <strong>de</strong>s Zeitverbrauchs eines Shell-Skripts kann das builtin-Kommando time verwen<strong>de</strong>t wer<strong>de</strong>n.<br />

time wird einfach <strong>de</strong>m Prozedur-Aufruf vorangestellt.<br />

rechner> time ./arguments ina otto doris<br />

ina<br />

otto<br />

doris otto ina<br />

doris otto ina<br />

0.07u 0.02s 0:00.12 75.0%<br />

Obige Zeitangaben sagen aus, dass <strong>de</strong>r Prozess 0.07 CPU-Sekun<strong>de</strong>n im user-mo<strong>de</strong> und 0.02 CPU-Sekun<strong>de</strong>n<br />

im kernel-mo<strong>de</strong> gelaufen ist. Die Gesamtlaufzeit beträgt 0.12 Sekun<strong>de</strong>n, wobei nur 75% da<strong>von</strong> die summierte<br />

CPU-Zeit ausmacht.<br />

Fehlersuche in Shell-Prozeduren<br />

Um Fehler in csh-Prozeduren aufzuspüren, muss die Prozedur explizit in einer eigenen csh aufgerufen<br />

wer<strong>de</strong>n. Für die Fehlerdiagnose sind spezielle Optionen <strong>de</strong>r csh zu verwen<strong>de</strong>n.<br />

csh -vx skript arg1 arg2<br />

Der obige csh-Aufruf einer Prozedur gibt je<strong>de</strong> Zeile vor und nach <strong>de</strong>r Variablen-, File- o<strong>de</strong>r Kommando-<br />

Substitution aus. So kann die Abarbeitung eines Shell-Skriptes gut nachvollzogen wer<strong>de</strong>n. Fehlerhafte<br />

Bereiche können schnell lokalisiert wer<strong>de</strong>n.


7. Textmusterverarbeitung mit awk<br />

awk ist eine Programmiersprache, die für das Durchsuchen und die Manipulation <strong>von</strong> Textdaten entworfen<br />

wur<strong>de</strong>. Der Name awk leitet sich <strong>von</strong> <strong>de</strong>n drei Autoren Aho, Weinberger und Kernighan ab.<br />

Die Basisfunktion <strong>de</strong>r Sprache besteht im zeilenweisen Durchsuchen <strong>de</strong>r Eingabe nach vom Benutzer spezifizierten<br />

Auswahlbedingungen, <strong>de</strong>nen entsprechen<strong>de</strong> Aktionen zugeordnet wer<strong>de</strong>n können. Die Anwendungsbereiche<br />

<strong>von</strong> awk liegen in <strong>de</strong>r Datenauswertung und -aufbereitung, <strong>de</strong>r Datenvalidation und <strong>de</strong>r<br />

Datentransformation.<br />

Für einige <strong>de</strong>r nachfolgen<strong>de</strong>n Beispiele wird eine Datei namens daten mit folgen<strong>de</strong>m Inhalt verwen<strong>de</strong>t:<br />

23 otto huber<br />

34 hugo habicht<br />

43 OTTO Albers Hamburg<br />

12078677345444<br />

11 ina <strong>de</strong>ter<br />

0 rudi ratlos<br />

26 peter lustig<br />

44 elly heuss<br />

88 mani held<br />

14 egon erpel<br />

76 bodo ballermann<br />

90 andrea doria<br />

7.1. Aufruf und Programmstruktur<br />

Es gibt die Möglichkeit, <strong>de</strong>n awk-Programmtext über eine Programmdatei o<strong>de</strong>r direkt einzugeben. Der<br />

awk-Aufruf kann auch innerhalb eines shell-scripts erfolgen.<br />

awk ’programmtext’ [ inputfile ... ]<br />

awk -f programmdatei [ inputfile ... ]<br />

Nach <strong>de</strong>m Aufruf wird <strong>de</strong>r Programmtext auf syntaktische Korrektheit geprüft. Fehlermeldungen kennzeichnen<br />

<strong>de</strong>n ungefähren Ort <strong>de</strong>s Fehlers ( awk: syntax error near line 10 ). Laufzeitfehler<br />

dagegen wer<strong>de</strong>n genau lokalisiert ( awk: division by zero, record number 10 ).<br />

Der übergeordnete Kontrollfluss im awk-Programm besteht aus einer Hauptschleife, die nacheinan<strong>de</strong>r alle<br />

Eingabezeilen liest. Je<strong>de</strong> Eingabezeile wird sequentiell mit allen aufgeführten Bedingungen verglichen.<br />

wenn Bedingung erfüllt -> dann Aktion ausführen


7. Textmusterverarbeitung mit awk 64<br />

Nicht erfüllte Bedingungen verursachen einen Sprung zur nächsten Bedingung. Aktionen stehen immer in<br />

geschweiften Klammern. <strong>Eine</strong> Aktion muss immer auf <strong>de</strong>rselben Programmzeile beginnen wie die zugehörige<br />

Bedingung. Ansonsten können awk-Programme formatfrei geschrieben wer<strong>de</strong>n. Aus Übersichtlichkeit<br />

ist aber eine tabellarische Struktur ratsam.<br />

Beispiele zu <strong>de</strong>n Anwendungsbereichen <strong>von</strong> awk:<br />

Datenauswertung und -aufbereitung<br />

rechner> awk ’{sum+=$1; print $1, sum}’ daten<br />

Summiert jeweils das erste Feld je<strong>de</strong>r Zeile in <strong>de</strong>r Variablen sum auf und gibt<br />

<strong>de</strong>n Feldwert und die Summe aus<br />

Datenvalidation<br />

rechner> awk ’/^[0-9]+$/ {print "Zeile ist numerisch:" $0}’ daten<br />

Alle Zeilen, die rein numerisch sind, wer<strong>de</strong>n ausgegeben<br />

Datentransformation<br />

rechner> awk ’$2=="OTTO" {$2="HANS"; print}’ daten<br />

Untersucht je<strong>de</strong> Zeile, ob das zweite Feld <strong>de</strong>n Inhalt OTTO besitzt und ersetzt OTTO durch<br />

HANS<br />

Bedingung o<strong>de</strong>r Aktion können auch weggelassen wer<strong>de</strong>n. Wenn nur <strong>de</strong>r Aktionsteil vorhan<strong>de</strong>n ist, wird<br />

dieser für je<strong>de</strong> Eingabezeile ausgeführt.<br />

{sum+=$1; print $1, sum}<br />

Wenn nur die Bedingung gegeben ist, wird die Eingabezeile vollständig in die Standardausgabe kopiert.<br />

$2=="OTTO" entspricht $2=="OTTO"{print}<br />

Ein- und Ausgabedatei wer<strong>de</strong>n als Folge <strong>von</strong> Zeilen gesehen, die durch ein Zeilentrennzeichen <strong>von</strong>einan<strong>de</strong>r<br />

getrennt wer<strong>de</strong>n. Je<strong>de</strong> Zeile besteht für awk aus einer Folge <strong>von</strong> Fel<strong>de</strong>rn, die durch Feldtrennzeichen getrennt<br />

sind. Die einzelnen Fel<strong>de</strong>r einer Zeile wer<strong>de</strong>n mit $1, $2, ... angesprochen. Die gesamte Eingabezeile<br />

wird mit $0 referenziert. Achtung: Die awk-Variablen $1, $2 usw. haben nichts mit <strong>de</strong>n gleichnamigen<br />

Variablen in shell-Skripten zu tun!<br />

rechner> awk ’{print $3, $1}’ daten<br />

rechner> awk ’{print $0}’ daten<br />

rechner> awk ’{print $2, $2, $2}’ daten<br />

Ausgabe <strong>de</strong>s dritten und ersten<br />

Fel<strong>de</strong>s je<strong>de</strong>r Zeile<br />

Ausgabe je<strong>de</strong>r Zeile<br />

Feld 2 wird dreimal hintereinan<strong>de</strong>r<br />

ausgegeben


7. Textmusterverarbeitung mit awk 65<br />

7.2. Die Sprachelemente <strong>von</strong> awk<br />

Die Syntax <strong>von</strong> awk stimmt in vielen Punkten mit <strong>de</strong>r C-Syntax überein.<br />

Datentypen und Variable<br />

Es existieren numerische Daten und Zeichenkettendaten. Zeichenketten wer<strong>de</strong>n in Anführungsstriche gesetzt.<br />

Variable brauchen nicht <strong>de</strong>klariert wer<strong>de</strong>n, sie sind bei ihrer ersten Erwähnung im Programm implizit<br />

<strong>de</strong>klariert. Variablennamen beginnen grundsätzlich mit einem Buchstaben ( abc, e534, a[10] ).<br />

Neben <strong>de</strong>n frei <strong>de</strong>finierbaren Variablen gibt es einige eingebaute Variable.<br />

Statische eingebaute Variable:<br />

RS<br />

ORS<br />

FS<br />

OFS<br />

OFMT<br />

Trennzeichen für Eingabezeilen (LF)<br />

Trennzeichen für Ausgabezeilen (LF)<br />

Feldtrennzeichen für die Eingabe (SPACE, TAB)<br />

Feldtrennzeichen für die Ausgabe (SPACE, TAB)<br />

Steuerstring für die Ausgabe numerischer Werte<br />

Dynamische eingebaute Variable:<br />

NR<br />

NF<br />

FILENAME<br />

Number of Record, aktuelle Zeilennummer<br />

Number of Fields, aktuelle Feldanzahl <strong>de</strong>r Eingabezeile<br />

Name <strong>de</strong>r aktuellen Eingabedatei<br />

Operatoren und Ausdrücke<br />

Es gibt numerische und nichtnumerische Operationen. Das Ergebnis einer Operation ist abhängig vom<br />

Operator und <strong>de</strong>n Werten <strong>de</strong>r verwen<strong>de</strong>ten Operan<strong>de</strong>n. Der Typ <strong>de</strong>r Operation dient als primäres Entscheidungskriterium<br />

für die Wertermittlung.<br />

Als numerische Operatoren sind die Zeichen + - * / % ++ -- zugelassen. Klammerausdrücke<br />

sind erlaubt. Als nicht-numerische Operation ist die Verkettung <strong>de</strong>finiert.<br />

rechner> awk ’{print 3 + 4}’<br />

rechner> awk ’{print "3" + "4"}’<br />

rechner> awk ’{print 3 + 4"5"}’<br />

rechner> awk ’{print 3 + (4"5")}’<br />

ergibt 7, da numerische Operation<br />

ergibt ebenfalls 7, da die Operation numerisch<br />

ist<br />

Mischung <strong>von</strong> numerischer und nichtnumerischer<br />

Operation; die Verkettung<br />

wird zum Schluss ausgeführt; Ergebnis<br />

ist 75<br />

Ergebnis ist 48, da die Klammern die<br />

Auswertungsreihenfolge beeinflussen<br />

Als Vergleichsoperatoren sind dieselben Operatoren wie in <strong>de</strong>r Programmiersprache C gebräuchlich: ==<br />

!= < > = . Wenn die Vergleichsoperan<strong>de</strong>n unterschiedlichen Typs sind, wird <strong>de</strong>r numerische Operand<br />

als Zeichenkettentyp interpretiert. Vorsicht bei Zeichenkettenvergleichen: Die Werte wer<strong>de</strong>n linksbündig<br />

verglichen (d.h. ”12” < ”2” ist true). Verknüpfungen <strong>von</strong> Vergleichsoperationen erfolgen mit <strong>de</strong>n<br />

Operatoren ! (NOT), && (AND) und || (OR).


7. Textmusterverarbeitung mit awk 66<br />

rechner> awk ’$2 >= "e" && $2 < "f" && $2 != "egon"’ daten<br />

Die Verknüpfung ist für alle Namen zutreffend, die mit einem e beginnen, aber<br />

nicht egon lauten<br />

Textfunktionen<br />

substr( s, p [, l ] )<br />

substr schnei<strong>de</strong>t einen Teilstring aus String s, beginnend bei Position p mit <strong>de</strong>r Länge l.<br />

rechner> awk ’{print substr($3, 2, 2)}’ daten<br />

schnei<strong>de</strong>t aus Feld 3 einen 2-stelligen String<br />

rechner> awk ’{print substr($3, 2)}’ daten<br />

extrahiert aus Feld 3 alles ab <strong>de</strong>r Zeichenpostion 2<br />

sprintf( a1, ..., an )<br />

an gemäß <strong>de</strong>m in f angegebe-<br />

sprintf formatiert <strong>de</strong>n Wert <strong>de</strong>r Ausdrücke a1 ...<br />

nen Format (siehe printf).<br />

Numerische Funktionen<br />

length[( s ) ]<br />

length gibt die aktuelle Länge <strong>de</strong>r Zeichenkette s zurück; wenn Argument s fehlt, wird<br />

die gesamte input-Zeile genommen.<br />

rechner> awk ’{print length($3)}’ daten<br />

gibt die Länge <strong>de</strong>s dritten Fel<strong>de</strong>s je<strong>de</strong>r Zeile aus<br />

in<strong>de</strong>x( s1, s2 )<br />

in<strong>de</strong>x gibt die Anfangsposition <strong>de</strong>r Zeichenkette s2 innerhalb <strong>de</strong>r Zeichenkette s1 an;<br />

falls s2 nicht gefun<strong>de</strong>n wird, ergibt dies 0<br />

rechner> awk ’{print in<strong>de</strong>x($3,"mann")}’ daten<br />

sucht in <strong>de</strong>r dritten Spalte nach <strong>de</strong>r Zeichenkette mann<br />

split( s, a [, t ] )<br />

split spaltet die Zeichenkette s in Teilketten auf, die durch das Trennzeichen t bestimmt<br />

sind; die Teilketten wer<strong>de</strong>n <strong>de</strong>n Elementen <strong>de</strong>s Fel<strong>de</strong>s a zugewiesen; Ergebnis <strong>de</strong>r Funktion<br />

ist die Zahl <strong>de</strong>r gefun<strong>de</strong>nen Teilketten.<br />

rechner> awk ’{print split($0,feld), feld[1], feld[2],<br />

feld[3]}’ daten<br />

hier wird als Feldtrennzeichen bzw. benutzt<br />

rechner> awk ’{print split($0,feld,"e"), feld[1], feld[2],<br />

feld[3]}’ daten<br />

hier wer<strong>de</strong>n die Teilketten durch <strong>de</strong>n Buchstaben e getrennt<br />

Als weitere numerische Funktionen sind die mathematischen Funktionen sqrt, log, exp und int <strong>de</strong>finiert<br />

(Beispiel: awk ’{print sqrt(split($0,feld))}’ daten ).


7. Textmusterverarbeitung mit awk 67<br />

7.3. Bedingungen<br />

Bedingungen dienen in erster Linie zur Selektion <strong>von</strong> Zeilen <strong>de</strong>s Eingabetextes. Als Bedingungen sind reguläre<br />

Ausdrücke und Vergleichsausdrücke zugelassen. Reguläre Ausdrücke müssen bei awk in Schrägstriche<br />

/ eingeschlossen wer<strong>de</strong>n.<br />

rechner> awk ’/OTTO|egon/ {print NR, $0}’ daten<br />

gibt die Zeilen, in <strong>de</strong>nen OTTO o<strong>de</strong>r egon vorkommen, mit Zeilennummer<br />

aus<br />

rechner> awk ’/[oO][tT][tT][oO]/ {print NR, $0}’ daten<br />

gibt alle Zeilen aus, in <strong>de</strong>nen Otto vorkommt<br />

rechner> awk ’$2 ~/i|p|m/ {print}’ daten<br />

gibt alle Zeilen aus, in <strong>de</strong>ren zweites Feld i, p o<strong>de</strong>r m vorkommt<br />

rechner> awk ’length > 25’ daten<br />

gibt alle Zeilen aus, <strong>de</strong>ren Länge 25 Zeichen überschreitet<br />

rechner> awk ’NR >= 2 && NR awk ’/elly/,/bodo/ {print}’ daten<br />

selektiert alle Zeilen <strong>von</strong> elly bis bodo<br />

rechner> awk ’NR == 2,NR == 7 {print}’ daten<br />

startet Ausgabe bei Zeile 2 und en<strong>de</strong>t bei Zeile 7<br />

Spezielle Bedingungen<br />

Spezielle Bedingungen übernehmen die Programmsteuerung vor bzw. nach <strong>de</strong>r Hauptschleife.<br />

BEGIN { Aktion }<br />

END { Aktion }<br />

wird vor <strong>de</strong>m Lesen <strong>de</strong>r ersten Eingabezeile ausgeführt; kann benutzt<br />

wer<strong>de</strong>n, um Variablen vorzubesetzen, Überschriften auszugeben<br />

usw.<br />

wird nach <strong>de</strong>m Lesen <strong>de</strong>r letzten Zeile ausgeführt, für die Ausgabe<br />

<strong>von</strong> Statistiken, Meldungen, usw.<br />

rechner> awk ’BEGIN {print "Hier fang ich an"} \<br />

NR==2,NR==7 {print NR, $0} \<br />

END {print "Hier ist das En<strong>de</strong>"}’ daten<br />

Obiges Beispiel zeigt auch die Verwendung <strong>von</strong> awk-Statements über mehrere Zeilen. Die Fortsetzung <strong>de</strong>s<br />

Programmtextes wird am Zeilenen<strong>de</strong> mit Backslash markiert. Ist <strong>de</strong>r Programmtext dagegen in einer eigenen<br />

awk-Programmdatei abgespeichert, so wer<strong>de</strong>n sowohl die <strong>de</strong>n Programmtext kennzeichnen<strong>de</strong>n einfachen<br />

Hochkommas als auch die Backslashes weggelassen.


7. Textmusterverarbeitung mit awk 68<br />

7.4. Aktionen<br />

Aktionen stehen immer in geschweiften Klammern. Innerhalb <strong>von</strong> Aktionen sind folgen<strong>de</strong> Zuweisungen<br />

gültig: = += -= *= /= %=<br />

7.4.1. Ausgabeanweisungen<br />

In awk existieren die bei<strong>de</strong>n Ausgabeanweisungen print und printf. print benutzt die Einstellungen<br />

<strong>de</strong>r eingebauten Variablen OFS, ORS und OFMT; numerische Werte mit Kommastellen wer<strong>de</strong>n in einem<br />

Standardformat ausgegeben, das durch OFMT bestimmt ist (%.6f be<strong>de</strong>utet 6 Nachkommastellen). Ganze<br />

Zahlen und Zeichenkettendaten wer<strong>de</strong>n in ihrer aktuellen Länge ausgegeben. Die Ausgabe kann in eine<br />

Datei umgelenkt o<strong>de</strong>r einem Kommando weitergegeben wer<strong>de</strong>n.<br />

awk ’{print $1*1.14167}’ daten<br />

alle Werte <strong>de</strong>r ersten Spalte wer<strong>de</strong>n mit 1.14167 multipliziert<br />

awk ’{print "Ergebnis: " $1*1.14167 > "/tmp/erg"}’ daten<br />

Ausgabe wird in die Datei /tmp/erg umgelenkt<br />

Die Ausgabeanweisung printf entspricht <strong>de</strong>r gleichnamigen C-Anweisung. Im printf-Kommando<br />

beschreibt ein Steuerstring das Format <strong>de</strong>r Ausgabe. Die Formatbeschreibung für ein Argument wird mit<br />

einem Prozentzeichen % eingeleitet, danach folgt ein Kennbuchstabe, <strong>de</strong>r <strong>de</strong>n Argumententyp beschreibt.<br />

Kennbuchstaben: d Ganzzahl<br />

ld Lange Ganzzahl<br />

f Kommazahl ohne Exponent<br />

e Kommazahl in Exponentenschreibweise<br />

g e o<strong>de</strong>r f<br />

s Zeichenkette<br />

awk versucht eine automatische Typanpassung <strong>de</strong>r Argumente an das spezifizierte Format. Als Steuerzeichen<br />

für die Ausgabe sind die Zeichen \n für Zeilenvorschub und \t für Tabulator zugelassen.<br />

awk ’{printf "%f", $1}’ daten<br />

Ausgabe aller Werte als Kommazahlen mit 6 Nachkommastellen<br />

awk ’{printf "%6.4f\n", $1}’ daten<br />

Ausgabe mit 4 Nachkommastellen und Zeilenvorschub<br />

awk ’{printf "%6.4e\t%s\t%-10s\n", $1, $2, $3}’ daten<br />

Ausgabe einer numerischen und zweier alphanumerischer Spalten, jeweils linksbündig und<br />

durch Tabulatoren getrennt<br />

awk ’{printf "%6.4e\t%s\t%+10s\n", $1, $2, $3}’ daten<br />

Ausgabe wie oben, nur dritte Spalte wird rechtsbündig ausgerichtet<br />

Wenn printf ohne Argumente verwen<strong>de</strong>t wird, entspricht die Ausgabe <strong>de</strong>r <strong>von</strong> print (ganze Zeile wird<br />

ohne Zeilenvorschub ausgegeben).


7. Textmusterverarbeitung mit awk 69<br />

7.4.2. Kontrollanweisungen<br />

Wie in shell-Prozeduren können auch in awk-Programmen Kontrollstrukturen für die Ablaufsteuerung verwen<strong>de</strong>t<br />

wer<strong>de</strong>n.<br />

Die Verbundanweisung<br />

Mehrere Anweisungen können mit geschweiften Klammern zu einer Gruppe <strong>von</strong> Anweisungen zusammengefasst<br />

wer<strong>de</strong>n. Dies nennt man Verbundanweisung.<br />

awk ’{ {wert=$1*3.4} {print $2,$3, "Ergebnis:" wert} }’ daten<br />

Die if-Verzweigung<br />

if ( expression ) Anweisung [; else Anweisung ]<br />

rechner> awk ’{if($1 > 100) \<br />

$1="***"\<br />

else \<br />

sum+=$1 \<br />

print $1} \<br />

END {print "Summe:" sum}’ daten<br />

Obige Verzweigung kann auch in einer Zeile geschrieben wer<strong>de</strong>n:<br />

awk ’{if($1 > 100) $1="***"; else sum+=$1;print $1}<br />

END {print "Summe:" sum}’ daten<br />

Wichtig: Bei <strong>de</strong>r Verzweigung unter awk ist zu beachten, dass im if- bzw. else-Zweig immer nur genau<br />

eine Anweisung stehen darf. Hierbei kann es sich auch um eine Verbundanweisung han<strong>de</strong>ln.<br />

Die while-Schleife<br />

while ( expression ) Anweisung<br />

awk ’{i=1; while(i


7. Textmusterverarbeitung mit awk 70<br />

7.5. Sonstiges<br />

Kommentare wer<strong>de</strong>n im Aktionsteil <strong>von</strong> awk mit <strong>de</strong>m Zeichen # eingeleitet.<br />

Bei Verwendung <strong>von</strong> awk-Aufrufen in shell-Skripten muss <strong>de</strong>r Unterschied zwischen <strong>de</strong>n shell-Variablen<br />

und <strong>de</strong>n Feldvariablen <strong>von</strong> awk beachtet wer<strong>de</strong>n. Die Positionsparameter $1, $2 usw., die mit <strong>de</strong>m Prozeduraufruf<br />

in das shell-Skript übernommen wer<strong>de</strong>n, haben mit <strong>de</strong>n Feldvariablen $1, $2 ... in awk nichts<br />

gemein. Es gibt drei Möglichkeiten, shell-Variable in <strong>de</strong>n awk-Aufruf zu übernehmen.<br />

echo $shell_var | awk ’$1 ...’<br />

echo $1 | awk ’{print $1}’<br />

In diesem Fall wird <strong>de</strong>r Inhalt <strong>de</strong>r shell-Variablen $1 mit <strong>de</strong>m echo-Befehl an <strong>de</strong>n awk-Aufruf weitergeleitet.<br />

awk interpretiert <strong>de</strong>n über die Pipe ankommen<strong>de</strong>n Input als Feld $1, $2 usw..<br />

awk ...’{ ... awk_var ...}’ awk_var=$shell_var filename<br />

awk ’{print user}’ user=$USER daten<br />

Bei dieser Variante wird die Variablenübergabe durch die Definition <strong>von</strong> awk-Variablen mit gleichzeitiger<br />

Zuweisung <strong>de</strong>s Inhalts <strong>de</strong>r shell-Variablen beim awk-Aufruf realisiert. Dabei können auch mehrere awk-<br />

Variable <strong>de</strong>finiert wer<strong>de</strong>n.<br />

awk ...’{ ...<br />

"’$shell_var ’" ...}’ filename<br />

awk ’{var="’$USER’"; print var}’ daten<br />

Die dritte Alternative besteht darin, die shell-Variable direkt im awk-Aufruf zu referenzieren. Dies erfolgt<br />

dadurch, dass die shell-Variable erst in einfache und dann nochmals in doppelte Hochkommas (Anführungszeichen)<br />

eingeschlossen wird.<br />

Sollen dagegen awk-Variable an shell-Variable übergeben wer<strong>de</strong>n, so erfolgt dies durch die bereits bekannten<br />

Zuweisungsmechanismen.<br />

set shell_var = ‘awk ...’{print awk_var ...}’ filename‘<br />

@ shell_var = ‘awk ...’{print awk_var ...}’ filename‘<br />

shell_var = ‘awk ...’{print awk_var ...}’ filename‘<br />

set vname = ‘awk ’{print $2}’<br />

daten‘<br />

Die Zuweisung kommt durch das sofortige Ausführen <strong>de</strong>s awk-Kommandos mittels <strong>de</strong>n umgekehrten einfachen<br />

Hochkommas zustan<strong>de</strong>.


A. Ausgewählte Web-Links<br />

http://ctdp.tripod.com/os/linux/usersgui<strong>de</strong><br />

http://docs.sun.com<br />

http://www.tldp.org<br />

http://www.linuxfibel.<strong>de</strong>

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!