Einführung in die Unix-Shell für Mac OS X

Zusammenfassung

Dieser Artikel gibt eine sehr einfache Einführung in die grundlegendsten Aspekte der Benützung der Unix-Shell. Das ganze ist speziell für Mac OS X und das Programm Terminal ausgerichtet. Der Artikel ist gedacht für Anfänger, die schon mal in Mailinglisten die Anweisung bekommen haben "mach doch xy im Terminal" und jetzt mehr wissen wollen.


Inhaltsverzeichnis

1. Was ist das Terminal?
2. Was sehe ich da eigentlich?
3. Wie gebe ich Befehle ein und korrigiere sie?
4. Was macht ein Befehl?
5. Und was macht irgendein Befehl?
6. Welche Befehle sind sinnvoll? Wie finde ich sinnvolle Befehle?
7. Worauf muss ich unbedingt achten?

Das Programm "Terminal" befindet sich im Ordner "Dienstprogramme" (englisch "Utilities") im Ordner "Programme" (englisch "Applications") auf der Harddisk des Macs. Ein Terminal ist eigentlich so etwas wie eine Mensch/Maschine-Schnittstelle zu einem Grossrechner. Im Falle des Mac OS X Terminal-Programms ist dieser Grossrechner in den Innereien des Mac OS zu finden und läuft mit einer Variante des Betriebssystems Unix. Das Terminal-Programm können wir wie gewohnt durch Doppelklicken öffnen. Es öffnet sich ein Fenster, auf Wunsch können wir weitere Fenster gleichzeitig offen halten. Das ermöglicht es uns zum Beispiel, in einem Fenster eine Handbuchseite nachzulesen, während wir im anderen Fenster einen Befehl zusammenstellen.

Das Fenster lässt sich in der Grösse verändern durch ziehen an der unteren, rechten Ecke oder durch einstellen in den Fensterinformation, die wir uns mit Apfel-I anzeigen lassen können. In den Informationen, Abteilung "Monitor" können wir auch den Zeichensatz noch einstellen, nützlich ist z.B. "Westeuropäisch (ISO Latin 1)" falls wir mit Umlauten arbeiten wollen oder "Westeuropäisch (ASCII)" falls wir auf Umlaute gänzlich verzichten wollen. Auch die Farbe des Fensters und der Schrift lässt sich in den Informationen verändern, alte Unix-Hasen arbeiten oft mit grüner Schrift auf schwarzem Hintergrund.

Standardmässig begrüsst uns das Terminal mit etwas Text und einem kleinen Rechteck (hier durch ein "X" dargestellt):

Welcome to Darwin!
[mac:~] benutzer% X
Der Text "Welcome to Darwin!" ist reine Begrüssung. Auf der nächsten Zeile ist alles bis zum "%" der sogenannte "Prompt", je nach Einstellung und Zustand endet der Prompt auch mit "$" oder sogar "#". Was im Prompt steht ist auch wieder Einstellungssache. Das Beispiel hier stammt aus der Jaguar-Version. Es zeigt in den eckigen Klammern den Namen des Computers gefolgt von einem Doppelpunkt und dem Ordner, in dem wir uns gerade befinden. Im Beispiel ist das ein Tilde-Zeichen (~), was bedeutet, dass wir in unserem "home"-Ordner sind, dem Ordner, der im Finder mit dem Knopf "Privat" erreichbar ist.

Nach der eckigen Klammer folgt noch der Benutzername, in der Form, die in den Systemeinstellungen als "Kurzname" bezeichnet wird. Diese gesammelten Informationen sollen uns darüber informieren, wer wir sind und wo wir sind. Das ist deshalb wichtig, weil wir uns per Terminal mit verschiedenen Rechnern verbinden können und dort verschiedene Benutzernamen und Verzeichnisse benutzen können, aber das Terminal sieht immer gleich aus. Am Ende der Zeile mit dem "Prompt" sehen wir das kleine, farblich abgehobene Rechteck, den "Cursor". Den Cursor kennen wir auch aus normalen Mac-Programmen, wie zum Beispiel Textverarbeitungen. Im Terminal verhält sich der Cursor nicht ganz gleich wie in anderen Mac-Programmen. Wir können im Terminal-Fenster nicht in eine andere Zeile klicken, um den Cursor dort zu positionieren. Auch die Pfeiltasten haben nicht die gewohnte Funktion.

Was wir hier im Terminal arbeiten sehen, ist die sogenannte "Shell". Eine Shell ist ein Programm, das unsere Eingaben annimmt, soweit wie möglich verarbeitet und dann an andere Befehle weitergibt. Es gibt verschiedene Shells mit Namen wie csh, tcsh, bash, ksh. Heutzutage verhalten sich die meisten Shells sehr ähnlich, zumindest auf dem hier beschriebenen Niveau für Anfänger.

Zuallererst einmal können wir Befehle eingeben, indem wir auf der Tastatur tippen. Geben wir einmal ein:

[mac:~] benutzer% Das ist ein Befehl: lsX
In diesem Beispiel habe ich den Cursor wieder durch ein X markiert -- zum letzen Mal in diesem Text, denn die Position ergibt sich von selber. Unix-Befehle werden also einfach eingetippt. Nachdem wir mit Tippen fertig sind, drücken wir die "Enter"-Taste. Mal sehen, was in unserem Beispiel passiert:
[mac:~] benutzer% Das ist ein Befehl: ls
Das: Command not found.
[mac:~] benutzer% 
Was wir da eingegeben haben, funktioniert also nicht als Unix-Befehl. Freundlicherweise werden wir mit einer Fehlermeldung darüber informiert ("Command not found", "Befehl nicht gefunden" ist eine recht häufige Fehlermeldung wenn wir uns vertippen). Und zum Schluss landen wir wieder bei unserem Prompt. Jetzt könnten wir natürlich in Versuchung geraten, die eben eingegebene Zeile zu korrigieren. Mit der Maus können wir den Text zwar auswählen, aber anschliessend nicht korrigieren. Wir können es jetzt einfach nochmals probieren, indem wir an unserem "neuen" Prompt den Befehl erneut eingeben. Oder wir können mit der "Pfeil-nach-oben"-Taste den letzten Befehl zurückholen und mit den "Pfeil-Links"- und "Pfeil-Rechts"-Tasten sowie der Delete-Taste unsere Eingabe korrigieren. Wenn wir fertig sind, drücken wir wieder "Enter", wobei es keine Rolle spielt, wo wir mit dem Cursor in unserer Eingabezeile stehen. "Enter" schliesst die Eingabe ab, es fügt keine neue Zeile ein wie wir das aus der Textverarbeitung gewohnt sind. Probieren wir es noch einmal richtig:
[mac:~] benutzer% ls
Desktop                  Network Trash Folder     Documents
Pictures                 Icon?                    Public                   
Library                  Sites                    Movies
TheVolumeSettingsFolder  tmp                      Music
bin
[mac:~] benutzer% 
Sieht doch schon ganz anders aus!

Was ist hier passiert? Ich habe den Befehl "ls" eingegeben, dann "Enter" gedrückt. Beginnend mit der nächsten Zeile habe ich das Ergebnis ausgegeben bekommen, eine Liste (dafür steht "ls") der Objekte im aktuellen Verzeichnis. Einige der Objekte können wir sofort identifizieren, wie z.B. "Documents", den Standard-Ordner für eigene Dokumente, den Apple jedem neuen Benutzerordner spendiert. Allerdings ist der Name hier in der englischen Originalfassung, die "aufgeklebte" Übersetzung ist vom Terminal aus nicht sichtbar. Andere Objekte wie den Ordner "tmp" gibt es nicht standardmässig, ich habe diesen Ordner für Gerümpel eingerichtet, das auch wieder gelöscht werden kann. Nach der Ausgabe erhalte ich wieder einen Prompt, ich kann also neue Befehle eingeben.

Der Befehl "ls", den wir hier eingegeben haben listet also Objekte auf. Das ist ja schon ganz nützlich, aber so richtig spannend wird es erst, wenn wir den Befehl in verschiedenen Varianten benutzen können. Zum Ausprobieren empfehle ich:

[mac:~] benutzer% ls -F
...
[mac:~] benutzer% ls Documents
...
[mac:~] benutzer% ls -l Documents
...
Am Anfang der eingegebenen Zeile steht unser Befehl "ls". Danach haben wir einige "Optionen" (oft auch als "Argumente" bezeichnet) eingegeben, mit denen wir auswählen, was wir als Resultat gerne hätten. Bevor ich auf die einzelnen Optionen eingehe, sollten wir bemerken, dass praktisch alle Unix-Befehle nach diesem Muster aufgebaut sind. Zuerst kommt der Name des Befehls, dann ein Leerzeichen und daraufhin die Optionen. Mehrere Optionen werden häufig durch Leerzeichen getrennt. Ob ein oder mehrere Leerzeichen spielt keine grosse Rolle, aber ein Leerzeichen am falschen Ort kann unerwartete Resultate haben, zum Beispiel zwischen "-" und "F".
[mac:~] benutzer%   ls - F
ls: -: No such file or directory
ls: F: No such file or directory
[mac:~] benutzer% 
Hier habe ich vor dem "ls" zwei Leerzeichen eingegeben, die den Computer nicht gross interessiert haben. Aber das eine Leerzeichen zwischen "-" und "F" hat zu einem Missverständnis geführt.

Zu unseren Experimentier-Beispielen: Erstmal haben wir den Befehl "ls -F". Die Option "-F" fügt bei einigen der Objekte einen Slash "/" hinten an, um zu markieren, dass es sich um Ordner handelt. "ls Documents" listet nicht den Ordner auf in dem wir uns aktuell befinden (unser "home"-Verzeichnis), sondern den Ordner "Documents" im aktuellen Verzeichnis. Im letzten Beispiel haben wir die Option "-l", die uns ein "langes" Listing mit vielen Informationen ausgibt, kombiniert mit dem Ordnernamen "Documents": Wir möchten also eine lange, ausführliche Auflistung des Inhalts des Ordners "Documents".

Bei "ls - F" hat mich der Computer so verstanden, dass ich eine Auflistung des Verzeichnisses "-" und des Verzeichnisses "F" möchte. Und die beiden gibt es nicht.

Einer der wichtigsten Befehle wird benützt, um nachzuschauen, was andere Befehle machen: Der Befehl "man". "man" steht für "manual", Handbuch. Als Argument gibt man "man" den Namen des Befehls mit, über den man mehr erfahren möchte. Probieren wir es doch mal mit unserem Bekannten "ls" aus:

[mac:~] benutzer% man ls
LS(1)             BSD General Commands Manual          LS(1)

NAME
     ls - list directory contents

SYNOPSIS
     ls [-ACFLRSTWacdfgiklnoqrstux1] [file ...]

DESCRIPTION
     For each operand that names a file of a type other than directory, ls
     displays its name as well as any requested, associated information. For
...

Das Terminal wird mit englischen Erklärungen gefüllt. Ganz unten auf der letzten Zeile steht (je nach Version) ein Doppelpunkt, eine Angabe wie viel schon dargestellt wurde oder einfach das Wort "more". Wenn man den Bildschirminhalt gelesen hat, kann man mit der Leerschritt-Taste "more" lesen, eben mehr. Einen Bildschirm zurück nach oben kommt man mit der Taste "b" und die Taste "q" beendet den ganzen Spuk. Etwas weiter unten finden wir die Erklärung zu unserer Option "-F": Unter "DESCRIPTION" bekommen wir eine Beschreibung des Befehls geliefert. Für uns als Anfänger ist das oft die wichtigste Information: Was macht dieser Befehl eigentlich? Dazu gibt es noch viele Details über den Befehl, unter anderem zu den verschiedenen möglichen Optionen.

...
     -F      Display a slash (/) immediately after each pathname that is a
             directory, an asterisk (*) after each that is executable, an at
             sign (@) after each symbolic link, a percent sign (%) after each
             whiteout, an equal sign (=) after each socket, and a vertical bar
             (|) after each that is a FIFO.
...

Da steht also, dass wir einen "/" nach jedem Ordnernamen bekommen, einen "*" nach jeder ausführbaren Datei. Und dazu noch einige Dinge, deren Sinn wir vielleicht noch nicht verstehen. Aber mit sorgfältigem lesen ist es theoretisch möglich, alle wichtigen Informationen über die Anwendung des Befehls zu bekommen. Wenn uns also jemand in einer Mailingliste empfiehlt, einen bestimmten Befehl zur Lösung eines Problems zu benutzen, dann sollten wir als erstes mit "man befehl" hingehen und uns anschauen, was das Ding eigentlich macht. Dabei sehen wir uns auch gleich die gewünschten Optionen an: Was genau wurde uns da gesagt, was wir machen sollen? Ein paar Minuten aufmerksamen Studiums hilft uns, Fehler zu vermeiden. Und das Verständnis der Lösung wächst auch, was uns wiederum hilft, für das nächste Problem dazuzulernen.

Zwei der am meisten benutzten Befehle haben wir schon kennen gelernt: man und ls. Einige weitere Befehle können wir mit "man" auch gleich näher kennen lernen:

Das Unix-Terminal ist keine sehr freundliche Umgebung. Fehler werden nicht unbedingt höflich vergeben. Wenn wir mit "rm" eine Datei löschen und dann feststellen, dass es die falsche war, dann wars das. Die Datei landet nicht zuerst in einem Papierkorb, aus dem wir sie zurückholen können. Auch Tippfehler können dabei gefährlich werden. Deshalb achten wir unbedingt darauf, dass wir wirklich exakt eingegeben haben, was wir eingeben wollten.

Besonders vorsichtig sollten wir sein, bei Anweisungen, die wir aus dem Internet von uns nicht persönlich bekannten oder uns nicht als kompetent bekannten Menschen bekommen. Das muss nicht an bösem Willen liegen. Aber es kann nur schon sein, dass der tragische Tippfehler nicht erst bei uns passiert ist, sondern schon vorher bei unserem Ratgeber. Ein kurzer Blick in die "man"ual-Seite hilft uns da zu verstehen, was passieren sollte oder könnte. Keinesfalls zu empfehlen ist das blinde ausprobieren eines Befehls, den ich irgendwo gesehen habe. Ein typischer Unix-Befehl erklärt nicht zuerst was er macht und fragt dann nach ob wir das auch wirklich wollen. Es rumpelt einfach und hoppla ist das Resultat da, manchmal erst später bemerkt.

Meine Site mit weiteren Informationen
Sitemap
Mein Weblog