UNIX Befehle

Ein UNIX - Terminal erwartet als Eingabe vom Benutzer Befehle. Dieses Dokument soll dem Leser grundlegende Handwerkszeuge zur Arbeit in einem Terminal zur Verfügung stellen. Dazu wurde eine Kategorisierung der einzelnen Kommandos vorgenommen: Navigation, Datenmanipulierung und Aufbereitung, Informationsbeschaffungskommandos, Prozessmanagement, Netzwerkbefehle und Konfigurationstools

Von Terminals, Shells und Konsolen

Die Begriffe Terminal, Shell und Konsole werden sehr häfig synonym verwendet, obwohl sie streng genommen verschiedene Dinge sind: Ein Terminal ist ein "dummes" Ein-/Ausgabegerät, das in früheren Tagen, als UNIX-Server noch teuer und selten waren verwendet wurde. Es war mittels serieller Schnittstelle mit dem Server verbunden, bestand aus einer Tastatur und einem Monitor und hat nur die Befehle die der Benutzer eingegeben hat an den Server weitergereicht und dessen Antowort auf dem Textbildschirm ausgegeben. Heute bezeichnet man auch Programme, die eigentlich nichts anderes tun als Terminals.
Eine Shell hingegen ist der Kommandointerpreter, der vom Benutzer Befehle entgegennimmt und diese verarbeitet.
Mac OS X hat eine Terminalanwendung und verfügt gleich über mehrere verschiedene Shells. Welche Shell ein Benutzer verwenden möchte, bleibt ihm überlassen und ist weitgehend Geschmackssache. Die Shell, die jeder Benutzer unter Mac OS X als Standard eingestellt hat, ist die tcsh. Diese Shell ist für einfache Arbeiten am System ausreichend, hat aber leider (sofern man sie nicht entsprechend konfiguriert) ein paar Einschränkungen. Daher bezieht sich diese Dokumentation hauptsächlich auf die bash, eine andere Shell, die ebenfalls zum Lieferumfang von Mac OS X gehört.
Die Limitierungen der tcsh sind beispielsweise - auch wenn sie nur konfigurationsabhängig sind - fehlende Tab-Completion oder ein äßerst mühsames Umleiten von StdErr. Die bash ist in der Grundkonfiguration hier sehr viel einfacher handhabbar. Nachteil der bash im Gegensatz zur tcsh ist - wiederum durch vernünftige Konfiguration abänderbar - die fehlende Information im Eingabeprompt. Um von einer Shell zu einer anderen zu wechseln genügt es, sie zu starten. Im Falle der bash ist das mit dem Eintippen des Kommandos "bash" erledigt. Doch alles langsam un der Reihe nach:

Die Shell - eine Eingabeaufforderung

Um überhaupt mit dem UNIX in bzw. unter Mac OS X arbeiten zu können, benötigt man ein Terminal - nein, keine serielle Tastatur/Monitor-Einheit, sondern ein Programm, das genau das simuliert: Unter Programme-Dienstprogramme findet sich eine Applikation namens Terminal. Startet man sie, meldet sie sich mit einem Fenster mit folgendem Text:

Last Login: [...]
Welcome to Darwin
[equinox:~] adi%

Die erste Zeile dient zur Information, wann man sich das letzte Mal angemeldet hat und von wo das war.
Da UNIX-Rechner auch das Anmelden über Netzwerk erlauben, ist das nicht ganz unerheblich. So hat man immer die Möglichkeit eventuelle Angriffe auf die Privatsphere so zu erkennen und auf sie zu reagieren. Wenn sich jemand missbrächlich Zugang zu dem System verschafft hat (zum Beispiel durch ein schlecht gewähltes Passwort - der Vorname der Freundin ist doch nicht immer erste Wahl ;-), so kann man durch einfaches Ändern des Passworts und/oder durch nachforschen, wer an dem betreffenden Rechner arbeitet (bzw. zu dem Zeitpunkt gearbeitet hat), den Schuldigen fassen.
Die zweite Zeile ist ein einfacher Willkommensgruß. Den man als umsichtiger Systemadministrator sogar konfigurieren kann: die Meldung, die hier angezeigt wird, befindet sich in der Datei /etc/motd (motd bedeutet etwas wie "Motto des Tages").
Die dritte Zeile ist auch schon der Prompt; jener Teil der Shell, der unsere Befehle entgegennimmt. Und damit ist die Shell - in diesem Fall die tcsh - ja eigentlich auch schon gestart.
Der Prompt verdient eine nähere Betrachtung, da in ihm für das geübte Auge sehr viele Informationen sichtbar sind:

[equinox:~] adi%

Zu wissen, auf welchem Rechner man sich befindet und wer man eigentlich ist - also welchen Benutzernamen man hat - erscheint auf den ersten Blick relativ sinnlos; spaeter werden wir sehen, dass diese Information sogar von erheblicher Bedeutung sein kann: Wir werden Befehle kennen lernen, mit denen man sich ganz einfach auf einem anderen Rechner anmelden kann um dort zu arbeiten und auch lernen, wie man den Benutzer aendern kann - speziell, wie man zum Administrator, unter Unix auch root genannt, wird.
Wie oben bereits erwähnt, ist die tcsh zwar was den Prompt betrifft gut vorkonfiguriert, es fehlen aber ein paar Features, die das Leben sehr einfach machen können. Daher wollen wir gelegentlich die bash verwenden:

[equinox:~] adi% bash
bash-2.05a$ exit
[equinox:~] adi%

Um die bash zu starten, genügt es einfach bash einzutippen; will man sie wieder beenden, so tut man dies, indem man das Kommando exit verwendet.
An obigem Beispiel sieht man auch, wie wenig Informationsgehalt der Standard-Prompt der bash liefert. Wir werden dieses Problem allerdings erst später in Angriff nehmen.

Navigation in der UNIX Shell

Um nun mit der Shell auch wirklich etwas anfangen zu können, benötigt man ein paar Elementare Kommandos; hier sieht man sehr deutlich, wieviele Hilfestellungen eine graphische Benutzeroberfläche mit ihren Menüs und Icons eigentlich bietet. Andererseits aber muss man dem entgegenhalten, daß ein sogenannter Poweruser diese Hilfestellungen wenig bis gar nicht in Anspruch nimmt und dadurch viel Zeit spart. Beherrscht man die Grundlagen, verhält es sich mit einer Shell ganz ähnlich: Viele Dinge kann man in einer Shell wesentlich schneller und bequemer erledigen, als in einer graphischen Benutzeroberfl&auuml;che und umgekehrt.

ls - Inhalt von Verzeichnissen anzeigen

Mit Hilfe von ls - list - bekommt man den Inhalt von Verzeichnissen angezeigt. Will man also nun den Inhalt dieses Verzeichnisses sehen, so kann man dies indem man in der Shell einfach den Befehl ls startet:

 
[equinox:~] adi% ls 
Desktop    Documents  Library    Movies     Music 
Pictures   Public     Sites 
[equinox:~] adi% 

Eine aehnliche Sicht auf die Daten bietet natuerlich auch der Finder - aber ein wenig bunter und dafuer platzkonsumierender:



Natuerlich kann man bei ls auch Verzeichnisnamen als Parameter angeben. Ist kein Parameter angegeben, so wird, wie in obigem Beispiel, das aktuelle Verzeichnis verwendet.

[equinox:~] adi% ls /Users 
Shared     adi 

Der "/" - "slash" genannt - vor dem Verzeichnis bezieht sich auf das Hauptverzeichnis. Alle Pfadangaben, die im Hauptverzeichnis ihren Ausgang nehmen, nennt man absolute Pfadangaben. Im Gegensatz dazu gibt es auch noch relative Pfadangaben - Pfadangaben, die im aktuellen Verzeichnis ihren Anfang nehmen:

[equinox:~] adi% ls Documents 
Screenshot1.tiff 
[equinox:~] adi% 

Da das aktuelle Verzeichnis der Shell das Homeverzeichnis des Benutzers adi ist, zeigt der Befehl den Inhalt des Unterverzeichnisses Documents, den jeder Benutzer in seinem Homeverzeichnis hat, an.

Sprachanpassungen unter Mac OS X

In obigen Beispielen wurde ein englisches Mac OS X verwendet; bei einer anderssprachigen Version von Mac OS X heissen die Verzeichnisse genau gleich, der Finder zeigt aber gewisse Ordner in der jeweils gewaehlten Sprache an. In der Shell allerdings sieht man die physischen Namen der Verzeichnisse - also englische. Hier noch ein paar Beispiele:
/Users/Benutzer   ~/Pictures~/Bilder
/ApplicationsAnwendungen   ~/Music~/Musik
/Library/Bibliotheken   ~/Documents~/Dokumente

cd - Verzeichnisse wechseln

Der Befehl cd - ein Mnemonik fuer change directory, also Verzeichnis wechseln - dient zum Bewegen im Dateisystem.

[equinox:~] adi% cd /Users 
[equinox:/Users] adi% 

Zum ersten Mal hat sich in obigem Beispiel die Information des Pormpts veraendert: der Pfad - das aktuelle Verzeichnis - ist jetzt /Users.
Wie oben im Abschnitt ueber absolute und relative Verzeichnisangaben erklaert, wurde hier eine absolute Pfadangabe gemacht. Es geht natuerlich auch relativ:

[equinox:/Users] adi% ls
Shared     adi
[equinox:/Users] adi% cd adi
[equinox:~] adi%

Ausgehend vom Verzeichnis /Users, dessen Inhalt man sich - siehe oben - mittels ls anzeigen lassen kann, sieht man, was es alles in einem Verzeichnis gibt. Danach kann man durch einfaches Angeben des Verzeichnisnamens - in diesem Fall adi in genau dieses Verzeichnis wechseln; unter Verwendung einer relativen Pfadangabe. Das funktioniert natürlich nur, wenn es bezogen auf das aktuelle Verzeichnis, das gewünschte Verzeichnis gibt. Andernfalls quitiert die Shell das mit einer Fehlermeldung.
Um beispielsweise von der aktuellen Position ein Verzeichnis höher zu kommen gibnt es natürlich die Möglichkeit, das mit absoluten Pfadangaben zu machen; viel schlauer ist es aber die in UNIX genau für solche Zwecke eingebauten speziellen "Verzeichnisse" zu verwenden: ".." ist ein Verzeichnis, das das nÄchsthöhere referenziert und "." referenziert das aktuelle Verzeichnis. Diese beiden speziellen Verzeichnisse werden von ls versteckt, da sie ja immer da sind.

[equinox:~] adi% cd ..
[equinox:/Users] adi% cd
[equinox:~] adi%

Und gleich noch etwas wichtiges das "Heimbringer-Taxi" in UNIX: Der Befehl cd ohne Paramater aufgerufen wechselt immer in das Homeverzeichnis zurück!

pwd - aktuelles Verzeichnis anzeigen lassen

Startet man nun im terminal eine (schlecht konfigurierte) bash (siehe oben), so hat man eigentlich keine Ahnung, wo im Verzeichnisbaum man sich gerade befindet. Natürlich: Am Anfang immer im Homeverzeichnis; doch das kann sich ja ändern. Daher ist es zunächst einmal wichtig, einen Befehl zu kennen, der einem sagen kann, wo man sich gerade befindet:

[equinox:~] adi% bash
bash-2.05a$ pwd
/Users/adi
bash-2.05a$ cd ..
bash-2.05a$ cd ..
bash-2.05a$ pwd
/
bash-2.05a$ cd 
bash-2.05a$ pwd
/Users/adi
bash-2.05a$ exit
[equinox:~] adi%

Der Befehl pwd - print working directory - gibt das aktuelle Verzeichnis aus.

Ein Zwischenresumee

Wir haben bisher 4 Befehle und 2 Shells kennengelernt: ls, cd, exit und pwd sowie bash und tcsh (die man übrigens auch analog zur bash mit tcsh startet).
Dem aufmerksamen Leser wird nicht entgangen sein, daß UNIX nicht gerade das ist, was man als gesprächig bezeichnen würde; nein, ganz im Gegenteil: Es teilt dem Anwender nur dann etwas mit, wenn es wirklich notwendig ist. Manche langjährige Anwender von graphischen Desktopsystemen haben damit meist insofern Probleme, als das sie einer weitgehenden Reizdeprivation ausgesetzt sind: Es fehlen automatische Popups und Wegklickdiagloge.
An dieser Stelle gleich ein Wort der Warnung: Wenn UNIX versucht etwas mitzuteilen, dann sollte man das ernst nehmen und zumindest genau lesen. Womit wir auch gleich bei einem zweiten gravierenden Problem mit UNIX sind: Wenn man es gewohnt ist, daß Fehlermeldungen wenig bis gar keine Aussagekraft haben, so tendiert man dazu sie zu ignorieren. UNIX hingegen teilt einem etwaige Probleme meist sehr korrekt mit. Man tut daher gut daran, solche Meldungen nicht zu überlesen, sondern sie genau zu lesen!

Hilfe in der Shell

Genauso, wie es in graphischen Oberflächen Hilfe-Funktionen gibt, gibt es sie auch in der Shell. Die wichtigsten beiden sind man und apropos. cd, pwd, ls, man, apropos

Datenmanipulierung und Aufbereitung

cat, [more/]less, grep, cut, [sed], head/tail, vi

Informationsbeschaffung

netstat, dmesg, Logfiles, iostat, ...

Prozessmanagement

ps, kill/killall, top

Netzwerkbefehle

ssh, ftp, nicht rsh/telnet, ping, traceroute

Konfigurationstools

route, ifconfig, ipfw, ...