Programmierung I Einführung in Unix/Linux
Transcription
Programmierung I Einführung in Unix/Linux
Was ist UNIX? Ein Betriebssystem Programmierung I Einführung in Unix/Linux Eine Sammlung von nützlichen Tools Eine (Computer-)Kultur Wintersemester 2003/2004 University Bonn Dr. Gabriel Zachmann Wer braucht UNIX? Vorteile von UNIX "Unix ist zwar ein Mainframe-Betriebssystem (und damit obsolet) hat aber noch viele Anhänger." Extrem ausgereift (besonders die kommerziellen Unices) Windows MSCE-Training-Guide Windows 2000 Server Kapitel 2.6.3 "Zusammenspiel mit UNIX" Verlag Markt & Technik Relativ sicher Von Anfang an Multi-User- und Multi-Task-fähig Flexibler Programmierer Performanter Web-Server Distributed Computing Wesentlich leichter zu administrieren (wenn die Lernkurve erst einmal durchschritten ist) Wer braucht UNIX nicht (unbedingt) ? Auf allen Plattformen verfügbar Sekretärinnen Büro- und Business-Software (Word, Buchhaltung, Powerpoint, Lagerhaltung, …) Plattformen Die Erfinder Sun (SunOS) Ca. 1970: HP (HP-UX) SGI (IRIX) IBM (AIX) Mac (OS-X) PC (Linux) PDA Set-top boxes Armbanduhr Auto … http://www.linuxdevices.com/ Ken Thompson and Dennis Ritchie Your new heroes 1 UNIX Komponenten UNIX-Konzepte Kernel: Herz des OS, managet Hardware Shell: eine Applikation, nimmt Kommandos entgegen und führt sie aus (CLI) Einige wenige Grundkonzepte: Alles ist ein File (Programm, Daten, Speicher, …) Alles ist ein Prozeß (OS, laufendes Programm, Editor, Shell, …) Viele kleine Utilities, die kombiniert werden können Utilities Kernel … Shell Utilities: viele kleine (und große) Tools zur täglichen Arbeit, z.B. Files kopieren, ASCII-Texte editieren, … Processes (time sharing, protected address space) Interprocess comm. (signals, pipes sockets, …) Kernel Virtual memory (swapping, paging, mapping) The filesystem (files, directories, devices, pipes, namespace, …) Das Filesystem Directories ("Folders") und Files Files/directories werden in einem Baum organisiert File = sequentielle Folge von Zeichen Interpretation ist Sache des benutzenden Programms: Text, Zahlen, Programm, Speicherauszug, … "root directory" / Jeder File hat einen Namen: Case-sensitive! (UNIX allg.) bin dev commands devices Lang (typ. bis zu 1024) Können beliebige Zeichen enthalten – besser nur alphanumerische Zeichen und Underscore! usr etc home boot and config files homes of users Directory ("Verzeichnis"): Spezieller File Enthält Name von File und Verweis darauf bin man more commands man pages local bob alice etc home zach Verschlungene Pfade Eindeutigkeit: Beispiele: / Files im selben Verzeichnis müssen verschiedene Namen haben Files in verschiedenen Directories dürfen gleiche Namen haben! Definition "Pfadname" (pathname) eines Files: Konkatenierung aller Verzeichnisnamen und des Filenamens auf dem Weg von der Wurzel bis zum File, getrennt durch / Eindeutigkeit von Pfadnamen garantiert bin dev /bin/ls ls bin cp man usr /bin/cp local bob bin /home/zach/lehre/Programmierung VR alice zach lehre Programmierung 2 Absolute Pfadnamen: starten mit / Spezielle Verzeichnisse: . Bezeichnet das aktuelle Verzeichnis Relative Pfadnamen: Bsp.: /bin/ls = /bin/./ls = /bin/././ls … starten von einem anderen Dir aus Sind also relativ zu diesem Dir .. Bezeichnet das Vater-Verzeichnis (parent diretory) / Beispiele: der absolute Pfad /home/zach/lehre/Programmierung von … usr etc Bsp.: /usr/bin/w = /home/../usr/bin/w = /usr/man/../bin/w … home Wird besonders wichtig im Zusammenhang mit dem CWD (current working directory) home aus = zach/lehre/Programmierung bob zach aus = lehre/Programmierung alice bin zach lehre lehre aus = Programmierung VR Programmierung Symbolische Links Andere Platten Der Verzeichnisbaum enthält (i.A.) mehrere Platten! Problem: File "gehört" genau einem Verzeichnis Einige davon sind auf anderen Rechnern (NFS) Beispiel: File /home/zach/pics/cobain.jpg soll auch im Dir. /home/zach/music/Nirvana sichtbar sein … Lösung: symbolic links (symlinks) / Bsp.: music/Nirvana/cobain.jpg ist ein Symlink nach ../../pics/cobain.jpg zach pics cobain.jpg Gibt auch Hard Links, braucht man aber nie bin music Nirvana etc home student tmp usr zach cobain.jpg Home Sweet Home Jeder User hat ein Home Z.B. /home/stud/zach File Permissions File gehört genau 1 User File ist assoziiert zu genau 1 Group Enthält normalerweise alle Daten des Users Alle Konfigurationsfiles aller Programme ("Dot-Files", z.B. .login) (riesiger Vorteil gegenüber Registry!) Beim Einloggen "startet man im Home" /home/rob% ls –l file -rw-r----- 1 rob student 343 Dec 5 13:51 file Normalerweise auf einem Fileserver Ist auf jeder Maschine gleich zugreifbar Filetyp Owner Group World Owner Group 3 Personengruppen: Owner, Group, World (Other) Für jede 3 File-Permissions: read, write, execute 3 Weitere File-Attribute Filetyp-Flag: Zeiten: Kein Permissionflag Modification (write): ls -l Zeigt Filetyp an: Creation: ls -lc Access (read): ls -lu - = normaler File d = Directory l = Symlink /home/rob% ls –l file -rw-r----- 1 rob student Bedeutung der Permissions 343 Dec 5 13:51 file Read & write: klar Executable: Programm Andere, sehr praktische Flags (set-GID, set-UID, sticky, …) mod time Größe, Links, … Prozesse Spawning processes Programm, das gerade läuft, schläft, oder hängt Ein Prozeß wurde immer von einem anderen erzeugt Jeder Prozeß führt ein Environment mit sich: Heißt Vater-Prozeß (parent process) Prozeß-ID (PID), User-ID (UID), Group-ID (GID), u.a. IDs Vorgang heißt engl. to spawn current working directory (CWD, manchmal auch PWD) Child process erbt das komplette Environment (außer Environment-Variablen (Paare von Strings) seinen IDs u.ä.) … Relative Pfade werden bzgl. des CWD's des Prozesses interpretiert Erstes Einloggen Das User-Interface Wie bekommt man eine Shell? Ist immer noch die Kommandozeile (CLI = command line interface) An der "Konsole" ("console") Remote (ssh, rlogin, telnet) Login/passwd sind case-sensitive! Wieviele Shells kann man haben? Beliebig viele … TerminalFenster Gibt inzwischen zwar auch Windows-Look-Alikes Für Programmierer ist CLI sehr viel effizienter! Lernkurve ist natürlich länger ("steiler") /home/rob% Möglichkeiten Das Prompt Prompt von der Shell Zeit 4 Aufbau einer Kommandozeile Optionen Kommando Editieren der Kommandozeile Parameter /home/rob% ls –l data -rw------- 1 rob student 343 Dec In der Zeile: 5 13:51 data Optionen (options, flags): ändern Verhalten Taste Tab Ctrl-B Ctrl-W Ctrl-A Ctrl-U Ctrl-A Ctrl-A Komando !! !string !17 ^a^b / Ctrl-F / / / / Ctrl-E Ctrl-K Ctrl-E Ctrl-E In der History: Taste Cursor-Up / -Down Ctrl-P / Ctrl-N Parameter: i.a. Files, auf denen Kommando operiert Kommandowiederholung Funktion File- / Command-Completion Wortweise vor / zurück springen Voriges Wort löschen An Ende / Anfang springen Zeile bis zum Anfang / Ende löschen An Ende / Anfang springen An Ende / Anfang springen Funktion In der History rauf / runter Match in der History nach oben / unten suchen Prozeßkontrolle Bedeutung Letztes Kommando wiederholen Kommando, das mit 'string' beginnt, wiederholen Kommando mit Nummer 17 i.d. History wiederholen Letztes Kommando wiederholen, dabei das erste Vorkommen von 'a' durch 'b' ersetzen Komando Ctrl-C Ctrl-Z fg bg Ctrl-S / Ctrl-Q History anzeigen: history (alias h) Shells: Was passiert mit einem Kommando? Bedeutung Kommando / Programm abbrechen Kommandoanhalten Kommando weiterlaufen lassen Gestopptes Kommando/Programm im Hintergrund weiterlaufen lassen Ausgabe des Programms anhalten / weiterlaufen lassen Aliases Shell durchläuft folgenden Zyklus: Ersatz für häufige / längliche Kommandos 1. Kommando wird aus der Eingabezeile oder einem Script gelesen Beispiel: 2. Aliases werden expandiert 3. Variable Substitutions werden vorgenommen 4. Wildcards werden expandiert 5. Das Kommando wird ausgeführt: % % % % alias mo less alias uni "ssh –l zach –X zeus.uni-bonn.de mo program.cpp uni Entweder von der Shell selbst (built-in commands) Oder in einem neuen Prozeß Im folgenden Annahme tcsh (csh) alias zeigt alle Aliases an Alias 'uni' wird ersetzt … Alias 'mo' wird ersetzt … Definiert Alias 'uni' Definiert Alias 'mo' 5 Variablen Variable = Name + Wert, Wert = Zeichenkette 2 Arten: Normale Shell-Variablen Anhängen: % setenv PATH ${PATH}:${HOME}/bin % setenv PATH ${HOME}/bin:${PATH} Environment-Variablen, sind auch in Kind-Prozessen (child process) bekannt Setzen: % setenv TMP "/tmp" % set tmpdir = "/home/stud/zach/tmp" Ersetzen: % cp file ${tmpdir} % echo ${TMP} Wichtige Environment- Variablen Variable DISPLAY HOME PRINTER TMP PATH MANPATH PWD Bedeutung Display, auf dem neue Fenster geöffnet werden (Bsp.: aurikel:0.0) Home-Verzeichnis Default-Drucker Verzeichnis für temporäre Files Suchpfad für Kommandos Suchpfad für Man-Pages Aktuelles Verzeichnis, in dem man sich gerade befindet (CWD) File Patterns File-Name mit Wildcards: * Wildcard ? * {0,1,2} [0-9] [a-zA-Z0-9] [^0-9] ? [] Bedeutung Genau ein beliebiges Zeichen Beliebig viele beliebige Zeichen (auch 0) Genau ein Zeichen aus der Menge {0,1,2} Genau ein Zeichen aus der Menge {0,…,9} Genau ein Zeichen aus der Menge {a,…,z,A,…,Z,0,…,9} Genau ein Zeichen nicht aus der Menge {0,…,9} Beispiele: printenv druckt alle Environment-Variablen aus % ls *.cpp *.h echo $VAR druckt Wert dieser Environment-Variablen % ls [0-9][0-9]*.ppt % ls *[^a-zA-Z0-9_.,-]* Quotation Kommando ausführen Achtung: das Kommando sieht die Wildcards nie! Shell expandiert dieses Built-in: Shell führt Kommando selbst aus Beispiel: echo Quotation verhindert, daß Wildcards (allg. Meta-Zeichen) von der Shell expandiert werden Sonst: externes Programm Arten: command in PATH (Environment-Variable) suchen \ verhindert Expansion des folgenden Zeichens % echo \*.ppt \$PATH "…" verhindert Expansion der Wildcards, erlaubt Variablen % echo "*.ppt $PATH" '…' verhindert jegliche Expansion (Wildcards, Variablen, …) % echo '*.ppt $PATH' Beispiel: ls arg1 arg2 … Falls nicht gefunden, Fehlermeldung Kind-Prozeß erzeugen Erinnerung: erbt Environment des Vater-Prozesses (Shell) Argumente (Zeichenketten) im Environment bereitstellen Argumente werden durch Space (i.a.) getrennt Warten bis Kind-Prozeß beendet 6 Standard-I/O Suchpfade Environment-Variable mit :-getrennten Verzeichnissen Shell etabliert 3 Kanäle zu / vom Prozeß: Beispiel: % echo $PATH .:/usr/bin:/bin:/usr/local/bin:/home/II/zach Standard Input (stdin) Standard Output (stdout) Program Program Kommandos werden in PATH gesucht File mit Namen des Kommandos im ersten Verzeichnis und executable? → ausführen Standard Error (stderr) Sonst: nächstes Verzeichnis in PATH untersuchen … Analog für Man-Pages und andere Redirection Default-mäßig mit Terminal (Fenster & Keyboard) verbunden Pipelines Verbindet Standard-I/O mit Files Prozeß (Programm) bemerkt davon nichts! Redirection Bedeutung > file >> file >& file < file … stdout wird nach file geschrieben stdout wird an file angehängt stdout und stderr umlenken Programm liest aus file, nicht von Keyboard Shell bietet noch viele weitere Möglichkeiten Beispiel: Selber Mechanismus, um Prozesse miteinander zu verbinden: stdout Utility or User Program pipe stdin Utility or User Program Syntax: command | command | command | … Beispiele: % ls –l > dir-listing Shell Scripts % ls -1 *.cpp | wc –l % ls -1 *.cpp | sort > sorted-dir Initialisierungs-Files Alles, was man interaktiv schreiben kann, kann man auch in einen ASCII-File schreiben: Erste Zeile: #!/bin/tcsh -f Executable-Bit in den Permissions setzen: chmod u+x script Ausführen mit ./script, oder in ein Verzeichnis im PATH moven. Shell enthält komplette Programmiersprache! Für tcsh: ~/.tcshrc (und ~/.cshrc) Inhalt: beliebige Kommandos (shell-built-in & extern) Ausgeführt von jeder Shell des Users Typischerweise: Environment-Variablen setzen (PATH, MANPATH, …) Aliases definieren Completion-Regeln (für Tab an verschiedenen Positionen) Achtung: neue Shell aufmachen, falls Änderung Empfehlung: Dot-Files von der Vorlesungs-Home-Page installieren 7 Deutsches UNIX Wichtige Utilities und Programme Große Unsitte Moving Around Wegen Terminologie File-Manipulation setenv LANG=en Filter (oft in Pipelines oder mit Redirection) Tools Prozeß-Manipulation Suchen (find & grep) Dokumentation anzeigen Moving Around File- und Verzeichnis-Manipulation Utility Funktion Kommando cd dir cd cd pwd Ins Verzeichnis dir wechseln Ins vorige Verzeichnis zurück wechseln Ins Home wechseln Aktuelles Verzeichnis anzeigen rm ls ls ls cp cp ln Funktion File löschen Verzeichnis / File anzeigen Mehr Infos zum Verzeichnis / File anzeigen Dot-Files (.*) anzeigen Files kopieren Kopie von File1 erzeugen und File2 nennen Symbolischen Link von File2 nach File1 erzeugen (Eselsbrücke: ln –s statt cp) mv file1 … dir Files verschieben mv file1 file2 File umbenennen cat file1 file2 … > file Files aneinanderhängen (konkatenieren) chmod new-perm file Permissions von File ändern file [dir] –l [dir] –a [dir] file1 … dir file1 file2 –s file1 file2 Neues Verzeichnis erzeugen Verzeichnis löschen (muß leer sein) mkdir dir rmdir dir Achtung: ES GIBT KEIN RECYCLE-BIN!!! … Task: Shoot Yourself in The Foot The proliferation of modern programming languages (all of which seem to have stolen countless features from one another) sometimes makes it difficult to remember what language you're currently using. This handy reference is offered as a public service to help programmers who find themselves in such a dilemma. % ls foot.c foot.h foot.o toe.c toe.o % rm * .o rm: .o no such file or directory % ls % Permissions modifizieren Syntax von chmod ("change mode"): chmod <level><op><perm> filename level = String aus: u, g, o, a (user, group, other, all) op = ein Zeichen aus +, -, = (gets, loses, equals) perm = String aus: r, w, x, … (read, write, execute, …) Beispiele: % chmod u+rwx,go-w foobar % chmod g=u temp/ % chmod u=rwx,g=rwx,o= shared/ 8 Tools Bedeutung der Permissions Permission File Directory r (read) Read a file List files in … w (write) Write a file Create / move / remove a file in … x (execute) Execute a file Access a file in … (Shell-Script or Binary) Utility Funktion more less head / tail cat file echo string(s) diff file1 file2 File anzeigen (more ist ein sog. Pager) Noch besser als more Anfang / Ende des Files ausgeben File ausgeben (keine Funktionalität) String(s) auf stdout (typ. Terminalfenster) ausgeben Unterschiede zwischen 2 Files anzeigen du –sk dirs … df –h dir df -hl quota -v Speicherbedarf der Verzeichnisse in kB anzeigen Größe und freien Platz auf einer Platte anzeigen Größe und freien Platz aller lokalen Platten anzeigen Freie Quota anzeigen lpr [–Pdrucker] file.ps Postscript-File ausdrucken lpq [–Pdrucker] Printer-Queue anzeigen a2ps [–Pdrucker] file ASCII-File (z.B. Listing) ausdrucken Remote auf einem anderen Rechner einloggen ssh machine Prozesse aus Sicht der Shell Utility Funktion id who / w Eigene IDs ausgeben Wer ist eingeloggt? date cal Datum anzeigen Jahreskalender anzeigen locate file where command Ort von File anzeigen (auch Teilstrings) Ort(e) von Command anzeigen tar czf archive.tgz dirs … Komplettes Verzeichnis (inkl. Unterverzeichnisse) zusammenpacken und komprimieren tar xzf archive.tgz Archiv wieder auspacken gzip/gunzip File komprimieren / dekomprimieren mount /mnt/floppy Floppy mounten / unmounten Prozeßkontrolle Befehl Funktion ps ps -edfjw kill pid kill -9 pid command … & nohup jobs Ctrl-C Ctrl-Z fg bg Ctrl-S Ctrl-Q top Prozesse anzeigen Alle Prozesse anzeigen Prozeß mit PID pid abbrechen (wie Ctrl-C) … wenn der Prozeß trotzdem nicht aufhören will ☺ Prozeß im Hintergrund starten … Prozesse im Hintergrund anzeigen Foreground-Prozeß abbrechen (interrupt) Foreground-Prozeß anhalten (stoppen) Zuletzt angehaltenen Prozeß im Foreground weiterlaufen lassen Angehaltenen Prozeß im Background weiterlaufen lassen Ausgabe des Foreground-Prozesses anhalten (Pr. läuft weiter!) Ausgabe weiterlaufen lassen tabellarische Ansicht aller Prozesse und deren CPU-Verbrauch 3 Zustände eines Prozesses (aus Sicht der Shell) 1. Foreground: Default Ausgabe (stdout) des Prozesses erscheint im Terminal-Fenster Eingabe (stdin) des Prozesses kommt vom Keyboard 2. Background: Ausgabe erscheint im Fenster Eingabe nicht erlaubt 3. Gestoppt: Prozeß schläft Filter Lesen von stdin, schreiben auf stdout Arbeiten oft zeilenweise Utility Funktion cut fmt sort uniq wc tr grep rev Felder oder Zeichenspalten ausschneiden Auf 72 Zeichen umformatieren Zeilenweise sortieren (auch nach Teil-Key) Duplikate entfernen Zeichen, Wörter, und Zeilen zählen Zeichen ersetzen Zeichenketten in der Eingabe suchen (s.u.) Reihenfolge der Zeichen umkehren (zeilenweise) 9 Unix-Philosophie Editoren "Small is beautiful" Programmierer schreiben ASCII, insbesondere Software Make each tool do one thing only Heiliger Krieg, welches der beste ist Make it do it well Ein Programmier-Editor sollte … Read from stdin, write to stdout (if sensible) Use ASCII-Files Effizientes UI haben (nicht intuitiv!) Wenige Tasten / Mauskilometer für die häufigen Aktionen Syntax Highlighting Makros Reguläre Ausdrücke zum Suchen und Ersetzen Multi-Plattform sein Suchen & Finden Einige Editoren zur Auswahl: Vim / gvim (Obermenge von vi, welcher immer installiert ist) Die Homepage von vim: www.vim.org Emacs/xemacs (extrem umfangreich) "Emacs wäre gar kein so schlechtes Betriebssystem, wenn es nur einen brauchbaren Editor hätte" ☺ Nedit (kein non-GUI-Mode) Pico, joe, … Suchen Sie sich einen hinreichend mächtigen Editor aus, und lernen Sie diesen gut und möglichst vollständig beherrschen! Reference-Cards für VIM und Emacs auf der Homepage der Vorlesung Find find: findet Files aus einem Verzeichnisbaum Kriterien: Name Datum Größe … Aktionen: Filename ausgeben Löschen … grep: findet Zeilen in einem File, in denen bestimmte Zeichenketten vorkommen Beispiele Syntax: Den File foo im Home finden: find dirs … criteria actions Kriterien: -name file-pattern -type file-type -size file-size -date … Aktionen: -print -exec command {} \; -ls … % find $HOME –name foo Wenn man den Namen nicht mehr genau kennt: % find $HOME –iname '*foo*' Alle JPEG's finden und File-Namen in File schreiben: % find $HOME –name '*.jpg' > image-list Alle JPEG's größer als 100kB finden: % find $HOME –name '*.jpg' –size +100k Alle core's löschen: % find . –name core –print –exec rm {} \; 10 Grep Reguläre Ausdrücke Besteht aus normalen Zeichen und Meta-Zeichen: Syntax: Meta-Zeichen: . ? [ ] * + $ ^ \ ( ) grep 'reg-exp' files … Normale Zeichen: alle übrigen Varianten: fgrep, egrep reg-exp = regular expression (eine Art Pattern-Matching) Default: Zeilen ausgeben, die matchen Einige Optionen: -v Invertierung: Zeilen ausgeben, die nicht matchen -i case-insensitive -n Zeilennummern ausgeben -H Filenamen zu den Matches ausgeben -e RE weitere reg-exp's (Oder-Verknüpfung) Regulärer Ausdruck = Zeichenkette aus normalen Zeichen und Meta-Zeichen Matching: Vergleicht gegebene Zeichenkette und RE von links nach rechts Arbeitet Zeichen ab, falls sie, gemäß Regeln, "übereinstimmen" Arbeitet "greedy" Extended RE's Beispiele grep 'abc' file: Zeichen a . (Punkt) [abc-f] [^abc] ^$ a? a+ a* (RE) RE1|RE2 \ ... Bedeutung / Match matcht das Zeichen selbst matcht ein beliebiges Zeichen matcht ein Zeichen aus {a,b,c,d,e,f} matcht ein Zeichen nicht aus {a,b,c} stehen für den Anfang/Ende der Zeile a ist optional ("schluckt" a, falls vorhanden) a muß einmal oder öfter vorkommen a darf belieb oft, auch keinmal, vorkommen Gruppierung matcht a oder b hebt Bedeutung des nachfolgenden MetaZeichens auf More input? (info) alle Zeilen, die "abc" enthalten grep 'a.c' file: alle Zeilen, die "axc" enthalten, wobei x beliebiges Zeichen ist grep –e 'a[x-z]b' –e 'c[u-w]d' file: "axb" oder "cud" oder "ayb" … grep 'a\[[^]]*\]=' file: alle Vorkommen der Form "a[…]=", wobei … eine beliebig lange Zeichenkette ist, die kein ] enthält grep 'a\[[^]]*\] *=' file: wie vorher, mit beliebig vielen Spaces zwischen "]=" Format of each man page 4 Arten von Informationsquellen: Name 1. Man Pages Syntax 2. Info pages Description 3. HTML-Seiten 4. Sonstige … Man Pages: Name und 1-zeilige Beschreibung Ausführliche Beschreibung Options Files Liste von Files wichtig für diesen Befehl 'man cmd' – Man-Page zu cmd anzeigen (Programm oder Funktion) Return values Diagnostics Mögliche Fehlermeldungen und Ursachen man –k keyword – Alle Man-Pages nach keyword durchsuchen (nur die 1-zeiligen "Köpfe" jeder Seiten) Bugs Bekannte Bugs und Unzulänglichkeiten See also Verwandte Befehle und Infos man –K keyword – Alle Man-Pages nach keyword durchsuchen (komplette Seite) Start-Menü → Help 11 Info & HTML Info-Seiten: Minimalwissen Folgende Befehle sollten Sie gut beherrschen: 'info cmd' – Sog. Info-Seite in einem einfachen Viewer anzeigen ls, cd, mkdir, rmdir, cp, mv, rm, ln, chmod, Hierarchisch (angelehnt an HTML) less, cat, sort, wc Steuerung: grep, find Return auf Stern – In Unterseite springen u – zur übergeordneten Seite zurück /string – suchen ps, jobs Später: make, g++, gdb Lesen Sie deren Man-Pages (immer wieder) HTML-Seiten: Hauptproblem: finden Normalerweise in /usr/share/docs Hilfsmittel: locate Grundregeln unter UNIX Don't Panic! RTFM! ("read the f*ing manual") Probieren geht über studieren … 12