Grundzüge von Unix

Überblick

Unix ist ein sehr flexibles Multiuser-Betriebssystem aus den 1970er Jahren, das im technisch-naturwissenschaftlichen Bereich weit verbreitet ist. Mit der Verfügbarkeit von "freien" Versionen wie NetBSD und Linux hat Unix aber auch in vielen anderen Bereichen, vor allem im Bildungssektor, Einzug gehalten. Unix war und ist an sich ein Kommandozeilen-orientiertes Betriebsystem, doch wurde Mitte der 1980er Jahre das Graphiksystem X-Window entwickelt, auf dem zahlreiche Anwendungen aufbauen und von dem es ebenfalls eine freie Implementation gibt.
"Multiuser"-System heißt, daß mehrere Benutzer zur selben Zeit auf dem System arbeiten können. Zusätzlich kann jeder Benutzer auch noch mehrere Prozesse gleichzeitig laufen lassen. Die scheinbare Gleichzeitigkeit kommt dadurch zustande, daß die insgesamt zur Verfügung stehende Rechenleistung in kleinste zeitliche Portionen unterteilt und der Reihe nach bzw. nach Prioritäten gewichtet den einzelnen Prozessen zugeordnet wird.
Um in einer Multiuser-Umgebung überhaupt Zugang zu den Betriebsmitteln des Systems zu bekommen, müssen die Benutzer über eine Zugangsberechtigung (Account) verfügen und sich gegenüber dem System durch einen Namen und ein Passwort identifizieren. Die Datenbereiche der einzelnen Benutzer sind zunächst streng getrennt, doch kann man Benutzer in verschiedene Gruppen zusammenfassen und mit Hilfe von Zugriffsrechten regeln, zu welchen Files die Mitglieder einer Gruppe Zugang haben sollen.
Unix ist ein minimalistisches Betriebssystem in dem Sinn, daß es Systemprogramme nur für eher eng definierte Aufgaben gibt. Zur Lösung komplexerer Aufgaben kann man aber oft eine Reihe von einfacheren Programmen kombinieren.
Schließlich gibt es auch kein Unix "an sich", sondern neben den freien Implementationen noch eine Reihe von kommerziellen Versionen der verschiedensten Hersteller. Alle diese Varianten sind einander zwar sehr ähnlich, können sich aber in Details der Organisation des Filesystems, dem Vorhandensein und der genauen Syntax einzelner Kommandos usw. unterscheiden.

Filesystem

Das Filesystem von Unix ist, wie das der meisten Betriebssysteme, baumartig-hierarchisch in Verzeichnissen organisiert. An der Spitze des Baumes steht das Root-Verzeichnis
/
und unmittelbar darunter eine Reihe von Systemverzeichnissen wie
/usr, /var, /dev, ..., /home
Im letzteren befinden sich meist die Stammverzeichnisse der Benutzer. So könnten einige Verzeichnisse der nächsten Ebene (Verzeichnisnamen werden durch Schrägstriche "/" getrennt)
/usr/lib, /usr/bin, ..., /home/beethoven
sein. Hier wäre z.B. /home/beethoven das Stamm- (Home-)Verzeichnis des Benutzers beethoven. In /usr/lib befinden sich in der Regel die Systembibliotheken und in /usr/bin Systemkommandos.
Sowohl Verzeichnis- als auch Filenamen können aus alphanumerischen (Groß- und Kleinbuchstaben) und Sonderzeichen bestehen und mehr oder weniger beliebig lang sein. Für die Filenamen verwendet man gern die Form
name.extension
wobei die Extension Aufschluß über den Inhalt des Files gibt, z.B.
eroica.mp3
Das hat den Vorteil, daß man bei vielen Systemprogrammen, die eine Standard-Extension erwarten, diese oft gar nicht angeben muß bzw. sich die Programme je nach bearbeitetem Filetyp verschieden verhalten können. So erwarten etwa der F- und C-Compiler, daß Programme die Extension .f90 oder .c haben, und ein guter Editor wird verschieden Formatierungshilfen zur Verfügung stellen, je nachdem, ob man ein Computerprogramm oder ein TEX-Manuskript (Extension .tex) einliest.
Eine besondere Rolle spielen Files, deren Name mit einem Punkt beginnt und die in Listings normalerweise nicht aufscheinen. Solche "hidden files", die sich, abgesehen von der Sichtbarkeit, durch nichts von anderen Files unterscheiden, werden gern als Startup-Scripts für Systemsoftware verwendet. Sie stehen in der Regel im Home-Verzeichnis, werden beim Starten von der jeweiligen Software eingelesen und können dazu benützt werden, das Standardverhalten dieser Software benutzerspezifisch zu modifizieren. Beispiele dafür sind .emacs, das Startup-File für den Editor emacs, oder .Xdefaults, das Konfigurationsfile für die Komponenten des Graphiksystems X-Window.
Die vollständige Angabe eines Filenamens besteht aus dem Pfad (dem Weg im Verzeichnisbaum, auf dem man von der Wurzel aus das File erreicht) und dem eigentlichen Filenamen
/home/beethoven/mp3/symphonies/eroica.mp3
Für einige spezielle Pfade bzw. Verzeichnisse sind Abkürzungen definiert, nämlich
.
für das gerade eingestellte Verzeichnis
..
für das Oberverzeichnis eines Verzeichnisses und
~
für das Home-Verzeichnis eines Benutzers. So könnte der Benutzer beethoven das File im letzten Beispiel auch mit
~/mp3/symphonies/eroica.mp3
ansprechen.
Die Zugriffsrechte auf ein File oder Verzeichnis werden in einer File-Liste durch eine zehnstellige Buchstabenkombination der Form
-rwxrwxrwx
dargestellt. Dabei symbolisieren die Stellen 2-4 die Rechte des Benutzers u, die Stellen 5-7 die Rechte der Gruppe g, der der Benutzer angehört, und die letzten drei Stellen die Rechte derer, die nicht der Gruppe angehören ("others" o). r und w stehen für Lese- und Schreibzugriff; x (execute) beim Filenamen eines Programms oder Scripts bedeutet, daß es ausgeführt werden darf. Besteht eines der Rechte nicht, steht statt des entsprechenden Buchstaben ein "-". Ein d an der ersten Stelle heißt, daß es sich um den Namen eines Verzeichnisses handelt.
-rw-r-----
ist also der Zugriffscode eines Files, das der Benutzer (Eigentümer) lesen und schreiben, die Gruppe aber nur lesen darf.

Shell

Von sh bis bash

Als "Shell" bezeichnet man jenes Systemprogramm, mit dem der Benutzer kommuniziert. Die Shell nimmt die Befehle des Benutzers entgegen und führt sie, wenn es sich um eingebaute Befehle handelt, selbst aus oder gibt sie an andere Programme des Betriebssystems weiter. Wenn nicht gerade ein anderes Programm die Kontrolle übernommen hat, befindet man sich also während jeder Arbeitssitzung, vom "Login" bis zum "Logout", ständig in Kontakt mit der Shell. Die Shell ist, neben anderen Aufgaben, auch für die Interpretation der Wildcards ("*" und "?") zuständig sowie für die Übergabe von Umgebungsvariablen an System- und Benutzerprogramme.
Auf jedem Unix-Rechner gibt es die Bourne Shell sh, die aber eher für die Interpretation von Shell-Scripts als für das interaktive Arbeiten geeignet ist. Für letzteres stehen, je nachdem, um welche Variante von Unix es sich handelt, eine Reihe von etwas komfortableren Shells wie csh, ksh, bash, tcsh, usw. zur Auswahl. (Die Shell kann auch tatsächlich individuell gewählt werden.) Auf den derzeit populären Linux-Systemen ist bash die Standard-Shell. Alle Shells sind zwar in den Grundzügen ähnlich, aber in den Details doch so verschieden, daß es schwierig ist, sich in einer ungewohnten Shell zurecht zu finden.

Die bash

Wenn in diesem Skriptum Shell-spezifische Kommandos angegeben werden, beziehen sie sich in der Regel auf die bash. Die bash bietet u.a. folgende Annehmlichkeiten:

Umgebungsvariablen und Startup-Files

Auf einem Unix-System sind typischerweise einige Dutzend Umgebungsvariablen gesetzt. Manche sind systemweit definiert, andere wieder benutzerspezifisch. Zu den wichtigsten Umgebungsvariablen gehören HOME, das Stammverzeichnis des Benutzers, PATH, der Suchpfad, auf dem nach ausführbaren Programmen gesucht wird, und DISPLAY, das Gerät, auf das graphische Ausgaben gesendet werden.
Umgebungsvariablen setzt man in der bash mit dem Befehl
 env_variable=value
oder
export  env_variable=value
Bei Verwendung der letzteren Form ist die Umgebungsvariable nicht nur in der Shell selbst, sondern auch in den von ihr aufgerufenen Subprozessen definiert. Den Wert einer Variablen stellt man mit
echo $env_variable
fest (wobei ein $-Zeichen vor den Namen der Variablen gesetzt werden muß). Ein
set
ohne Argument zeigt eine Liste aller definierten Umgebungsvariablen.
Umgebungsvariablen und sonstige Vereinbarungen kann man zwar jederzeit interaktiv setzen, Definitionen, die man bei jeder Arbeitssitzung braucht, schreibt man aber besser in eines der Startup-Files, die bei jedem Login bzw. Starten einer Shell ausgeführt werden. In der bash sind die wichtigsten dieser Files im HOME-Verzeichnis des Benutzers
.bash_profile
und
.bashrc

Die allerwichtigsten Befehle

Erste Hilfe

Bei jedem Programm, das man benützt oder aufruft, ist es am wichtigsten zu wissen, wie man es wieder verläßt bzw. abbricht, wenn es außer Kontrolle geraten ist. Dies gilt natürlich auch für das Programm "Shell" selbst, also für die Arbeitssitzung überhaupt. Während das Einloggen meist darin besteht, daß man Accountnamen und Passwort in eine Eingabemaske oder auf eine Eingabeauf forderung eingibt, beendet man die Sitzung in der bash mit dem Befehl
logout
oder
exit
oder durch Drücken der Taste ^D.
Innerhalb der Shell bricht man ein Kommando oder Programm, das man im Vordergrund gestartet hat, mit
^C
ab. Prozesse, die im Hintergrund laufen, kann man mit
kill -9  process_id
beenden, wobei man die Prozeß-Nummer process_id z.B. mit dem ps-Kommando ermitteln kann.
Die Dokumentation der Befehle und Prozeduren des Betriebssystems sowie über zusätzlich installierte Software befindet sich (in etwas archaischer Form) auf den sogenannten man-Pages. Informationen über das Thema topic kann man mit
man  topic
erhalten. man-Pages werden häufig seitenweise über einen Pager (s. unten) dargestellt, sodaß man u.U. vor- und rückwärts blättern oder nach Zeichenketten suchen kann.
Speziell auf Linux-System findet man Dokumentation auch im hierarchisch organisierten info-Informationssystem. Der Einstieg erfolgt mit
info  topic
Kurzinformationen oder die Syntax eines Kommandos kann man oft auch mit
command -h
oder
command --help
ermitteln.
Die allgemeine Struktur der Befehle ist
command [options ] [arguments ]
wobei arguments die etwaigen Argumente sind und options zusätzlich Optionen, die das Verhalten des Befehls modifizieren oder genauer definieren. Diese Optionen bestehen meist aus einem oder zwei Minuszeichen und einer ein- oder mehrbuchstabigen Abkürzung oder einem Begriff (wie -h oder -help für "Help"), können aber auch von der Form option parameter sein.

Manipulation von Files und Verzeichnissen

Aktuelles Verzeichnis anzeigen  
Um nicht immer vollständige Pfadnamen angeben zu müssen, kann man ein Verzeichnis zum aktuellen Arbeitsverzeichnis machen. Welches das aktuelle Verzeichnis ist, kann man mit dem Befehl
pwd
(print working directory) feststellen.
Verzeichnis wechseln  
Das Arbeitsverzeichnis wechselt man mit
cd [directory ]
(change directory). directory kann ein absoluter oder relativer Pfad (d.h. relativ zum derzeitigen Arbeitsverzeichnis) sein. Spezialfälle sind
cd ..
(wechselt in das Verzeichnis über dem derzeit aktuellen) und
cd ~
(wechselt in das Home-Verzeichnis). Ein
cd
ohne Argument hat dieselbe Wirkung wie cd ~.
Neues Verzeichnis anlegen  
Ein neues Verzeichnis legt man mit
mkdir  directory
(make directory) an. directory kann wieder eine absolute oder relative Pfadangabe sein. Der häufigste Fall ist wohl der, daß man ein Unterverzeichnis unter dem aktuellen Arbeitsverzeichnis anlegen will.
Verzeichnis löschen  
Ein (leeres) Verzeichnis löscht man mit Hilfe von
rmdir  directory
(remove directory). Um mit diesem Befehl ein Verzeichnis löschen zu können, darf es keine Files oder Unterverzeichnisse mehr enhalten. Verzeichnisse samt Inhalt löscht man mit Hilfe des Befehls rm (s. dort).
Inhalt eines Verzeichnisses anzeigen  
Die in einem Verzeichnis enthaltenen Files zeigt der Befehl
ls [file ]
(list) an. Der Parameter file ist ein File- oder Verzeichnisname und kann Wildcards enthalten. Ist es ein Verzeichnisname, so werden alle Files im Verzeichnis angezeigt. Ist file ein Filename, so werden das oder-im Fall von Wildcards-die Files angezeigt, auf die das Muster paßt. Ein
ls
ohne Argument zeigt den Inhalt des aktuellen Arbeitsverzeichnisses. Die wichtigesten Optionen sind -l ("lange" Liste, ein Eintrag pro Zeile) und -a (zeigt auch die "hidden files", deren Name mit einem "." beginnt und die man normalerweise nicht sieht). Die Optionen können auch kombiniert werden, z.B. produziert
ls -al ..
eine lange Liste aller (auch der versteckten) Files im Verzeichnis über dem Arbeitsverzeichnis.
Files kopieren  
Der Befehl
cp  source destination
(copy) erstellt eine Kopie von source unter dem Namen destination. Ist destination ein Verzeichnis, so behält die Kopie, wenn nicht anders angegeben, den Namen des Originals. In diesem Fall können auch mehrere sources angegeben und/oder Wildcards verwendet werden
cp  source_1 source_2 ...  directory
Umbenennen von Verzeichnissen und Files  
Files und Verzeichnisse können mit dem Befehl
mv  source destination
(move) umbenannt bzw. im Verzeichnisbaum "bewegt" werden. Sind source und destination beides Files oder beides Verzeichnisse, dann erhält source den neuen Namen destination. Da sowohl alter als auch neuer Name Pfadangaben enthalten dürfen, können damit Objekte gleichzeitig von einer Stelle im Verzeichnisbaum an eine andere verlagert werden. Insbesondere werden beim "move" eines Verzeichnisses dessen Inhalt und eventuelle Unterverzeichnisse mitverlagert. In der Form
mv  source_1 source_2 ...  directory
(wobei source_1, source_2, usw. Wildcards enthalten können) ist es auch möglich, ganze Gruppen von Files auf einmal in das Verzeichnis directory zu verschieben.
Löschen von Files  
Ein oder mehrere Files löscht man mit dem Befehl
rm  file_1 file_2 ...
(remove), wobei die Filenamen wieder Wildcards enthalten dürfen. Insbesondere beim Löschen von Gruppen von Files empfiehlt sich die Option -i (inquire)
rm -i  file_1 file_2 ...
da dann für jedes zu löschende Objekt eine Bestätigung gegeben werden muß. Den gegenteiligen Effekt hat die Option -f (force), d.h. es wird ohne Rücksicht auf Verluste gelöscht. Ganze Verzeichnisse samt Inhalt kann man schließlich mit der Option -r (recursive) löschen, z.B. in der Form
rm -fr  directory_1 directory_2 ...
Inhalt eines Files ansehen  
Will man den Inhalt eines Files nur ansehen, ohne es zu verändern, so kann man dazu das Kommando
cat  file_1 file_2 ...
(concatenate) verwenden. Dieser Befehl reiht die Files file_1, file_2, usw. aneinander und gibt das Resultat am Bildschirm aus. Das hat allerdings bei längeren Files den Nachteil, daß der Inhalt sehr schnell über den Bildschirm läuft und man nur die letzten paar Zeilen sieht.
Daher gibt es unter jedem Betriebsystem sogenannte Pager. Das sind Programme, die es erlauben, Files seitenweise anzusehen. Der Standard-Pager unter Unix ist
more  file
Daneben gibt es aber meist auch noch etwas komfortablere Programme wie
less  file
oder
most  file
mit denen man sowohl vorwärts als auch rückwärts blättern [mit den Pfeiltasten, den Tasten u (up), d (down), ^U, ^D, < Page-Up > , < Page-Down > ] oder nach Zeichenketten suchen kann (nach Eingabe von "/"). Der Pager wird mit q (quit) wieder verlassen.

Ein- und Ausgabeumlenkung, Pipes

Die meisten Systemprogramme sowie viele Anwendungen kommunizieren über die Standard-Ein/Ausgabekanäle von Unix
stdin
stdout
stderr
Der Standard-Eingabekanal stdin ist normalerweise mit der Tastatur verknüpft, der Standard-Ausgabekanal stdout und der Ausgabekanal für Fehlermeldungen stderr mit dem Bildschirm. Viele Programme verhalten sich wie Filter, d.h. sie lesen ihren Input von stdin, verarbeiten ihn und geben den Output auf stdout aus.
Die Standard-Ein/Ausgabekanäle können auf einfache Weise mit Hilfe der Klammersymbole "<", ">" und ">>" umgelenkt werden. So bedeutet
command <  file
daß der Input für den Befehl oder das Programm command nicht von der Tastatur, sondern vom File file kommen soll. Umgekehrt wird mit
command >  file
der Output statt auf den Schirm auf ein File ausgegeben. Bei der Variante
command >>  file
wird ein eventuell existierendes File nicht überschrieben, sondern der Output von command wird an das Ende von file angefügt. Ein- und Ausgabe können auch gleichzeitig umgelenkt werden
command <  input_file >  output_file
wobei die Reihenfolge von Input/Ouput auch umgekehrt werden kann.
Manchmal möchte man auch erreichen, daß ein Befehl, der als Argument einen Filenamen verlangt, statt von einem File von der Tastatur liest. Dafür gibt es das Symbol "-"
command  -
Um beispielsweise Text in das File file zu schreiben, könnte man das Kommando cat aufrufen
cat >  file  -
den gewünschten Inhalt von file auf der Tastatur eintippen und die Eingabe mit ^D (der End-of-File Marke) abschließen.
Pipes sind ein Mechanismus, mit dessen Hilfe zwei oder mehrere "Filterprogramme" gleichzeitig gestartet werden können, wobei jeweils der Standard-Ausgabekanal eines Programms in den Standard-Eingabekanal des folgenden geleitet wird. Pipes werden durch den senkrechten Strich "|" symbolisiert
command_1  | command_2  | ...
Beispiel: Die Kombination
ls -l | grep "2008-03-31"
erzeugt eine Liste aller Files im aktuellen Verzeichnis, die am 31. März 2008 zuletzt modifiziert wurden. (Das Kommando grep ist ein Befehl, der in einer Liste von Files oder der Standard-Eingabe-die in diesem Fall mit der Standard-Ausgabe des ls-Kommandos verknüpft wird-nach einer Zeichenkette sucht und alle Zeilen ausgibt, in der sie vorkommt).

Editieren und Compilieren von einfachen Programmen

Emacs

Um ein Computerprogramm bzw. allgemein ein Text-File neu zu schreiben oder ein bestehendes zu modifizieren, braucht man ein spezielles Textverarbeitungsprogramm, den sogenannten "Editor". Wie bei anderer Unix-Software auch, gibt es eine ganze Reihe von Alternativen, und welchen Editor man verwendet, hängt einerseits von der Anwendung ab, ist aber vielfach persönliche Geschmackssache.
Der Standard-Editor von Unix, vi, ist-wenigstens in der Grundversion-nicht übermäßig komfortabel. Ein alternativer Standard-Editor, der ebenfalls auf jeder Unix-Installation vorhanden sein sollte, ist emacs. Beim emacs handelt es sich eigentlich nicht um einen Editor im herkömmlichen Sinn, sondern um einen Lisp-Interpreter, also ein recht umfangreiches Softwarepaket, aus dem heraus man nicht nur Programme schreiben, compilieren und ausführen, sondern auch Mail lesen, surfen, auf Files anderer Maschinen im Netz zugreifen kann usw. Zusätzlich ist das Verhalten des emacs weitgehend anpaß- und programmierbar, z.B. durch entsprechende Einträge in das Startup-File ~/.emacs.
Selbst wenn man nicht die Absicht hat, diese Möglichkeiten auch nur ansatzweise auszuschöpfen, ist der emacs aber schon für das bloße Schreiben von Programmen sehr hilfreich. Abhängig von der Extension des bearbeiteten Files (also etwa .c für ein C-Programm) läuft er nämlich in einem speziellen Modus, in dem er den Benutzer bei der Formatierung des Programms und der Vermeidung von Fehlern unterstützt. So wird z.B. automatisch eingerückt, beim Eingeben einer schließenden Klammer die zugehörige öffnende angezeigt, es werden Schlüsselwörter hervorgehoben, usw.
Der Editor wird aufgerufen mit
emacs [file ]
Falls man unter einer graphischen Umgebung (X-Window) arbeitet, wird ein eigenes Fenster geöffnet. Von der ursprünglichen Version von file wird eine Kopie unter dem Namen file~ angelegt, auf die man zurückgereifen kann, wenn beim Editieren etwas schiefgegangen ist.
Beim Eingeben oder Modifizieren des Programms kann man die üblichen Lösch-, Pfeil- und Navigationstasten benützen. Das Suchen und Ersetzen von Zeichenketten, Ausschneiden und Einsetzen von Blöcken, Abspeichern des Buffers usw. erfolgt mit verschiedenen Tastenkombinationen, deren wichtigste in der Emacs/Jed-Kurzanleitung zusammengefaßt sind. Eine Besonderheit ist die Wirkung der < Tab > -Taste: Es wird bei Drücken von < Tab > nicht nur die Zeile, in der der Cursor steht, relativ zur vorhergehenden ausgerichtet (also z.B. ein- oder ausgerückt), sondern u.U. auch eine Sprachkonstruktion ergänzt. Drückt man etwa in dem folgenden Fragment einer do-Schleife in F
loop: do i=1,imax
     ...
     end
nach der Eingabe von end auf < Tab > , so wird nicht nur das end nach links ausgerückt, sondern zu
end do loop
ergänzt.
Vom emacs gibt es zahlreiche Clones, u.a. den Editor jed mit der X-Version xjed. Programme wie jed/xjed sind wesentliche weniger umfangreich und haben auch nicht die volle Funktionalität des emacs, können aber eine Reihe weiterer Editoren emulieren und sind auf praktisch alle Betriebssysteme portiert worden.

F- und C-Compiler

Hier wird zunächst nur der Fall besprochen, daß sich Haupt- und Unterprogramme (Prozeduren) in ein und demselben File befinden. Dann ist der Befehl zum Übersetzen eines F-Programms
[options ] source_file
Einschließlich der wichtigsten Optionen lautet der Compiler-Aufruf meist
F -O -o  executable source_file
Dabei steht die Option -O für "optimize", während -o executable angibt, wie der Filename des ausführbaren (compilierten und gelinkten) Programms lauten soll. Gibt man die letztere Option nicht an, heißt das ausführbare Programm standardmäßig immer a.out. Soll also ein Programm mit dem Namen prog1.f90 übersetzt werden, kann man z.B. angeben
F -O -o prog1 prog1.f90
und dann das Programm mit
prog1
starten. Treten während der Compilation Fehler auf, so werden am Schirm entsprechende Meldungen oder Warnungen ausgegeben. Der Compiler erzeugt als Nebenprodukt u.U. Modul-Files mit der Extension .mod, die im Prinzip nach erfolgreicher Compilation gelöscht werden können. Wird statt F ein anderer Compiler verwendet, z.B. einer der vollen Fortran-95 Compiler g95 oder gfortran, so ist das obige Beispiel entsprechend abzuändern
g95 -O -o prog1 prog1.f90
Allerdings können die Optionen und ihre Wirkung von Compiler zu Compiler verschieden sein.
Ein C-Programm compiliert man analog mit
cc [options ] source_file
bzw. wenn es sich um den GNU C-Compiler handelt (der aber meist auch durch cc aufgerufen werden kann),
gcc [options ] source_file
Mit den wichtigsten Optionen kann das lauten
gcc -On -o  executable -l library_1 -llibrary_2 ...  source_file
Für die Optimierung können hier, wie z.T. auch bei den Fortran-Compilern, verschiedene Stufen n=0, 1, ... angegeben werden.
Die Schwierigkeit gegenüber F besteht darin, daß bei C häufig auch jene Bibliotheken, in denen sich Standardprozeduren befinden, beim Linken explizit angegeben werden müssen. Das erfolgt mit der Option -l (library). Diese Bibliotheken stehen in der Regel in
/usr/lib
und haben Namen der Form
libname.a
Da die Namen aller Bibliotheken mit "lib" beginnen und mit ".a" oder ".so" enden, sind diese Teile redundant, und bei der Option -l muß nur name angegeben werden.
Benützt z.B. das Programm prog2.c trigonometrische Funktionen, die in der Mathematik-Bibliothek
/usr/lib/libm.a
stehen, so könnte es mit
gcc -O -o prog2 -lm prog2.c
übersetzt und gelinkt werden.

Arbeiten auf anderen Rechnern im Internet

ssh

Schon in der Frühzeit der Vernetzung kannte Unix Kommandos wie rsh (remote shell), rlogin (remote login) und rcp (remote copy), mit deren Hilfe man eine Shell auf einem "entfernten" Rechner starten und dort Befehle oder Programme ausführen, sich auf einem entfernten Rechner einloggen oder Files von/zu einem entfernten Rechner übertragen konnte. Da dabei Passwörter und Daten jedoch im Klartext versendet werden und ein Sicherheitsrisiko darstellen, verwendet man heute stattdessen die analogen Kommandos ssh (secure shell), slogin (secure login) und scp (secure copy), bei denen alle Informationen verschlüsselt übertragen werden.
Die Syntax dieser Befehle ist im einfachsten Fall folgende:
ssh [remote_user@]remote_host  ["]command ["]
führt-nach Eingabe des Passworts-den Befehl command unter dem Account remote_user auf dem entfernten Rechner remote_host aus und gibt danach die Kontrolle an den lokalen Rechner zurück. Falls die Benutzeridentifikation auf dem entfernten Rechner dieselbe ist wie auf dem lokalen, kann diese Angabe entfallen. Besteht der Befehl command aus mehr als einem Wort, so ist die Zeichenkette mit Anführungzszeichen zu begrenzen.
Ein
ssh [remote_user@]remote_host
ohne Kommando-Argument startet eine Shell am Rechner remote_host, ohne sofort die Kontrolle an den lokalen Rechner zurückzugeben, d.h. man ist danach so lange mit dem entfernten Rechner verbunden (und alle abgesetzten Befehle werden von dessen Shell verarbeitet), bis man sich explizit mit logout oder exit von dort abmeldet. Äquivalent dazu kann man eine remote Shell auch mit
slogin [-l remote_user ] remote_host
starten.
Sind die beteiligten Maschinen beides Unix-Rechner, so wird-falls dies in den jeweiligen Konfigurationsfiles erlaubt bzw. nicht explizit unterbunden ist-auch jede auf dem entfernten Rechner von einem X-Klienten erzeugte Graphikausgabe automatisch über die ssh-Verbindung an den lokalen Rechner weitergeleitet und dort vom X-Server dargestellt. (Ohne diesen automatischen "Tunnel" müßte die Umgebungsvariable DISPLAY des entfernten Rechners auf die Internet/Monitoradresse des lokalen Rechners gesetzt sowie sichergestellt werden, daß die Graphikübertragung nicht durch anderes Schutzmechanismen blockert wird.) Voraussetzung dafür ist natürlich, daß am lokalen Rechner X-Window installiert und der X-Server aktiv ist.
Das Kommando
scp local_file  [remote_user@] remote_host:[remote_file ]
kopiert das File local_file vom lokalen Rechner auf den entfernten Rechner remote_host, eventuell unter dem neuen Namen/Pfad remote_file. Für die Übertragung in umgekehrter Richtung verwendet man den analogen Befehl
scp [remote_user@]remote_host: remote_file  local_file
wobei statt local_file auch das Verzeichnis "." oder ein anderer lokaler Pfad stehen kann. In beiden Fällen kann als erster Parameter statt eines konkreten Filenamens auch eine Maske mit Wildcards verwendet werden; der zweite Parameter muß dann natürlich ein Verzeichnis sein. Der Doppelpunkt nach dem Namen des entfernten Rechners ist wesentlich, da nur durch ihn Rechner- von Filenamen unterschieden werden. Mit der zusätzlichen Option -r (recursive) kann nach dem Muster
scp -r local_dir  [remote_user@] remote_host:[remote_dir ]
ein Verzeichnis samt allen Unterverzeichnissen übertragen werden.

Verbindung von einem Windows- zu einem Unix-Rechner

Um von einer anderen als einer Unix-Maschine, also z.B. von einem Windows-Rechner, mit ssh eine Verbindung zu einem Unix-Rechner herstellen und auf diesem "remote" arbeiten zu können, braucht man auf der Windows-Seite einen ssh-Klienten. Eine freie und relativ komfortable ssh-Implementation dieser Art ist das Paket PuTTY. Es entält zum Übertragen von Files zwischen den beiden Rechnern u.a. einen (Windows)-Kommandozeilenbefehl pscp. Für den Filetransfer gibt es daneben aber auch eine eigene fenstergestützte Anwendung WinSCP, die mit PuTTY kompatibel ist.
Da sich die Graphiksysteme von Windows und Unix grundlegend unterscheiden, kann eine etwaige am entfernten Unix-Rechner erzeugte Graphikausgabe natürlich nicht ohne weiteres auf dem lokalen Windows-Rechner dargestellt werden. Vielmehr muß auf der lokalen Maschine ein eigener X-Server installiert und aktiviert werden, der die Unix-Graphikbefehle korrekt unter Windows interpretiert. Ein geeigneter freier X-Server ist z.B.  Xming.



File translated from TEX by TTH, version 3.80.
On 17 Apr 2008, 15:56.