old PDF version - Home Page of Johann Mitloehner
Transcription
old PDF version - Home Page of Johann Mitloehner
Linux, Shell and Tools Johann Mitlöhner 12. März 2012 1 History (roughly) • 1969: Ken Thompson wants an efficient bare-bones system to run his favourite Multics game Space Travel on a PDP-7 (4k of 18 bit words) – – – – writes first version of Unics (pun on Multics) in four weeks: kernel, shell, editor, assembler soon joined by others at AT&T’s Bell Labs Thompson develops interpretive language B Dennis Ritchie develops C (based on B) • 1972: Unix rewritten in C – source code made available to universities as anti-trust law prohibits product sale by AT&T – base for commercial Unix versions • 1978: Berkeley Software Distribution (BSD) • 1983: GNU Project announced by Richard Stallman at MIT – free software: not in price, but in being unrestricted by other distributors to modify the program as necessary – mass collaboration project – develop a sufficient body of free software ... to get along without any software that is not free – full access to all source code – requirement of then posting any changes made publicly for other users to benefit from as well – lots of software, but no stable kernel • • • • • • • • • 26 Aug 1991: Linus Torvalds posts to comp.os.minix: “I’m doing a (free) operating system” Sep 1991: Linux version 0.01 released to FTP server ftp.funet.fi of the Helsinki University of Technology Dec 1991: Linux 0.11 - self-hosted (compile Linux on Linux) Aug 1993: Debian Nov 1994: Red Hat 1996: S.u.S.E Linux 4.2 2000: Knoppix Live CD 2003: Fedora (free Red Hat) 2004: Ubuntu 4.10 The Warty Warthog Release Linux Operating System = Linux Kernel (6%) + GNU software (15%) + *lots* of other free software 2 Einige Grundkonzepte Distributionen : Debian, Ubuntu, Suse, Red Hat, Fedora, ... – Sammlungen von Softwarepaketen zur einfachen Verteilung und Installation. Jede Distribution hat ihren package manager, der es ermöglicht, 1 recht einfach weitere Pakete zu installieren, und dabei zum gewünschten Paket automatisch auch abhängige Pakete dazu installiert. updates : Neue security patches und andere updates zu den einzelnen Paketen können bei den meisten Distributionen recht einfach halb- oder vollautomatisch mit Hilfe des package managers (und einer Internetverbindung) realisiert werden. release : Ubuntu bringt alle 6 Monate eine neue Version mit Nummerierung Jahr.Monat und eigenem Namen heraus. Manche davon sind LTS (long time support) mit updates bis 3 Jahre, ansonsten endet der update Dienst nach 18 Monaten, dann muß auf eine neue (major) release gewechselt werden. Während laufende updates normalerweise keine Probleme bereiten, ist der Releasewechsel oft nicht ganz reibungslos. kernel : zentrales Modul des Betriebssystems, immer im Speicher geladen, erledigt die wichtigsten laufenden Aufgaben. swap space : Auslagerungsdatei, wird zur (virtuellen) Erweiterung des Speichers verwendet. Gerade nicht benötigte Daten werden auf die Festplatte geschrieben und erst bei Bedarf wieder eingelesen. Zwei Möglichkeiten: • swap partition: ein Teil der Festplatte (eine Partition) wird nur zu diesem Zweck verwendet • swap file: eine Datei wird zu diesem Zweck angelegt, und zwar aus physisch zusammenhängenden d.h. hintereinander auf der Platte angeordneten Blöcken, sodaß der Zugriff schnell genug ist (nützliche Befehle in diesem Zusammenhand: dd, mkswap). Für desktop Rechner ist normalerweise ein swap file mit ca. gleicher Größe wie RAM ausreichend. Wenn der Hauptspeicher ausgeht und der Rechner zu swappen beginnt, wird alles deutlich langsamer, aber immerhin noch funktionsfähig. Es geht auch ohne swap space, aber wenn dann der Hauptspeicher ausgeht, beginnt das System von sich aus Prozesse zu beenden, was meist eher nicht wünschenswert ist. boot manager : kleines Programm, das beim Starten des Rechners eine Auswahlliste präsentiert, zur Wahl des Betriebssystems in der folgenden Sitzung. dual-boot : zwei Betriebssysteme (auf unterschiedlichen Partionen der Festplatte) installiert. Vor der Sitzung wird eines davon ausgewählt, das dann gestartet wird. virtual box : Emulator für andere Betriebssysteme innerhalb der Linux-Sitzung (oder mit anderem host operating system). Stellt z.B. eine virtuelle Partion zum Installieren und Laufen von Windows zur Verfügung. Innerhalb der virtual box sollten theoretisch alle Programme genauso funktionieren, wie in einer Sitzung mit normal installiertem Betriebssystem; tatsächlich gibt es besonders bei 3D Funktionen oft Probleme. Außerdem schlechtere Performance. Das zu emulierende Betriebssystem muß zuerst installiert werden (Lizenz, Aktivierung, ...). Ähnliche Lösung, besser, aber kommerziell: vmware. wine : wine is not an emulator – Die Windows-Bibliotheksfunktionen wurden in Linux nachprogrammiert, sodaß Windows-Programme direkt ausgeführt werden können, ohne Emulation, und ohne vorherige Windows-Installation. Beste Performance, weil keine Zwischenschicht für die Emulation, aber auch hier oft (bzw meist) Probleme mit 3D Funktionen. desktop : grafische Oberfläche mit window manager, Hintergrund, Icons für Laufwerke, task panel usw. Viele Varianten, am bekanntesten: Gnome (default in Ubuntu), KDE. Die Wahl des desktop beeinflußt zwar das Erscheinungsbild, aber die grundlegenden Funktionen sind bei allen Desktops und window managern sehr ähnlich; außerdem können z.B. für KDE entwickelte Programme problemlos auch unter Gnome verwendet werden. 2 X window system : die Implementierung der Client-Server-Architekur für GUI-basierte Programme (graphical user interface). Der X server läuft auf dem lokalen Rechner, die X clients (Programme, die ein GUI verwenden) können auch auf anderen Rechnern laufen. Gnome und KDE verwenden die X windows Funktionen und machen Sie auch für Endbenutzer leicht verfügbar, damit die gewohnten Elemente wie Menues, Papierkorb usw. vorhanden sind. Live CD : mit der Ubuntu Live CD kann eine Sitzung mit dem Betriebssystem gestartet werden, ohne die lokale Festplatte zu verändern. Auch über USB Stick kann eine solche Sitzung gestartet werden. Weil der Zugriff auf CD und USB Stick deutlich langsamer ist als auf die interne Festplatte, dauert das Starten von Programmen während der Live CD Sitzung recht lange. ram disk : während der Sitzung mit der Live CD wird im Hauptspeicher (RAM) ein Bereich angelegt, der wie eine Festplatte funktioniert: dort können auch weitere Softwarepakete installiert werden; natürlich nur für die Dauer der Sitzung mit der Live CD. root user : eine besondere Benutzerkennung mit allen Rechten. Normalerweise arbeitet der Linux user mit einer persönlichen Kennung, die Zugriff auf die eigenen Dateien erlaubt, aber z.B. nicht die Installation von Softwarepaketen. Dazu sind root Rechte (admin, super user) nötig. Während der Sitzung mit der Live CD hat der temporäre user auch alle root Rechte. Installation : mit Hilfe der Ubuntu Live CD kann Linux installiert werden, d.h. permanent auf der Festplatte des Rechners als Betriebsssytem zur Verfügung stehen, entweder allein, oder mit dual-boot zusammen mit anderen Betriebssystemen und wahlweise bei Starten des Rechners. Dazu wird zumindest eine Partition benötigt, mit ca. 10 GB Speicherplatz (Minimum, besser ein vielfaches davon). apt : Ubuntu und Debian package manager. Kann über GUI verwendet werden, oder in der shell (apt-get, apt-search, apt-update). apt-get dist-upgrade : alle installierten Pakete werden auf den neuesten Stand gebracht (über Internet oder lokalen mirror). repositories : die Ubuntu Distribution ist in mehrere repositories geteilt. Unterschiede bestehen z.B. in den Lizenzen und in den Quellen (Ubuntu Produzent Canonical, Open Source community, closed source commercial). main : freie Software, von Canonical unterstützt restriced : proprietär d.h. nicht frei, aber von Canonical unterstützt, z.B. Treiber für Geräte wie Grafikkarten, vom jeweiligen Hersteller entwickelt universe : frei und von der Open Source community gepflegt multiverse : verschiedene (für die meisten Benutzer irrelevante) Beschränkungen durch Lizenz Normalerweise spricht nichts dagegen, alle repositories zu aktivieren (System/Administration/Software Sources). Das ist seit Ubuntu 9.04 auch per default der Fall. apt-mirror : wer zuhause eine langsame oder gar keine Internetverbindung hat und eine USB Platte mit min. 35 GB freiem Platz besitzt, kann mit Hilfe von apt-mirror eine Kopie der gesamten Ubuntu repositories machen (ohne source code), die dann zuhause zur Installation und zum Update von Paketen verwendet werden kann. Natürlich kann auch ein Verzeichnis auf der Laptop-Festplatte als mirror dienen. 3 Dateisysteme Dateisysteme verwalten den physischen Speicher von Datenträgern, sodaß Applikationen nicht auf technische Unterschiede von Medien Rücksicht nehmen müssen. Dateisysteme unterscheiden sich u.a. in 3 • • • • der Nutzung der Kapazität des Datenträgers der Performance der Unterstützung von sehr großen Dateien den möglichen Zeichen in Dateinamen Für größtmögliche Kompatibilität empfiehlt es sich, in Dateinamen nur Zeichen aus a-z, A-Z, 0-9, sowie Punkt (.), Underscore ( ) und Bindestrich (—) zu verwenden. Auf keinen Fall Backslash, Forward Slash, Doppelpunkt. • FAT32 – – – – – – Älteres Windows-Dateisystem, daher beste Unterstützung in anderen Betriebssystemen wie Linux und Mac OS, daher empfehlenswert für mobile Datensträger wie USB Sticks Unter Linux vfat genannt Maximale Dateigröße 4 GB Für den Transfer Linux – Windows wichtig: kennt Keine permissions und owner. • NTFS Neueres Dateisystem für Windows, auch in Linux seit einigen Jahren unterstützt. • ext3 – Standard für Linux – Unterstützung in Windows nur durch 3rd party Treiber, die aber frei verfügbar sind 4 Shell Beim Einloggen in das Linuxsystem am eigenen PC bekommt der Benutzer typischerweise eine grafische Schnittstelle, z.B den Gnome Desktop. Daneben gibt es aber auch die Shell, eine Text-basierte Schnittstelle, die auf Eingaben über die Tastatur reagiert. Diese Schnittstelle hat gegenüber der grafischen eine Reihe von Vorteilen, insbesondere dann, wenn immer wieder gleiche Aufgaben zu erledigen sind, oder nicht alltägliche, sodaß in den Desktopmenüs nichts brauchbares vorgesehen ist. Es lohnt sich daher, diese Shell kennenzulernen. Mit einem Terminal (in Gnome unter Applications/Accessories) starten Sie eine Shell. Dort blinkt nun ein Cursor, links daneben sehen Sie ein Prompt. Typischerweise zeigt es das aktuelle Verzeichnis, kann aber auch anders konfiguriert werden. Die Shell wartet auf Kommandos von Ihnen, die Sie über die Tastatur eingeben und mit der Return Taste (Neue Zeile) abschließen. Die Maus hat hier keine Funktionen außer Copy/Paste. Die wichtigsten Kommandos sind: ls ls -la mkdir tmp cd x cd pwd cp x y mv x y rm x rm -rf x list long list make new directory “tmp” change working directory to “x” change to home directory print working directory copy file x to y move (rename) file “x” to “y” remove file x remove directory x and all its contents Mit dem Editor pico können Sie Textdateien erstellen, indem Sie den Namen der neuen Datei angeben: 4 pico newfile.txt Schreiben Sie einige Zeilen Text und speichern Sie mit Strg-O gefolgt von Return, verlassen Sie mit Strg-X. Wenn Sie nun wieder “ls” eingeben, sehen Sie die neue Datei in der Liste. Unter Linux verwenden wir die Shell bash, eine neuere Version der traditionellen Unix Shell sh. Die bash bietet viele Features, von denen wohl die history und die file name completion die wichtigsten sind. • Mit der Pfeil-Aufwärts-Taste bekommen Sie die letzten Befehle, die Sie eingegeben haben, und können diese nochmal ausführen, indem Sie wieder auf Return drücken; Sie können den alten Befehl vorher auch ändern, was viel Schreibarbeit sparen kann. • Oft möchte man einen der letzten Befehle aus der history wiederholen, der mit den Anfangsbuchstaben einfacher bezeichnet werden kann als mit einigen Pfeil-Aufwärts, z.B. “pico MyClass.java”. Das geht mit dem Rufzeichen: !pi • Datei- und Programmnamen können mit der Tabulatortaste vervollständigt werden, sobald sie eindeutig sind. Wenn Sie z.B. die Datei file1.txt mit ls -l auflisten wollen, können Sie nach “ls -l f” den Tabulator drücken. Falls Sie keine andere Datei im aktuellen Verzeichnis haben, die mit “f” beginnt, wird der restliche Dateiname vervollständigt. Falls es mehrere Dateien gibt, dann können Sie nochmals auf Tabulator drücken und sehen eine Liste der in Frage kommenden Dateien. Dann können Sie noch weitere Buchstaben eingeben, bis der Name eindeutig ist und mit Tabulator vervollständigt werden kann. Auch damit kann man viel Schreibarbeit sparen. Eine Liste Ihrer früheren Kommandos sehen Sie mit dem Befehl history 5 Permissions Geben Sie zum Vergleich ls -la ein, um alle Dateien und Verzeichnisse zu sehen (auch versteckte), sowie die Permissions: -rw-r--r-Das erste Zeichen gibt den Typ an, hier “-” für Datei, z.B. “d” für Verzeichnis, “l” für Link. Danach folgen in drei Bereichen zu je drei Zeichen die Berechtigungen für Sie selbst, Ihre Gruppe (jeder Unixbenutzer gehört einer oder mehreren Gruppen an), und für alle anderen. Dabei steht in jedem Bereich das erste Zeichen für Lesen, das zweite für Schreiben, und das dritte für Ausführen. Die Datei newfile.txt können Sie selbst lesen und schreiben, andere können sie nur lesen, ausführen kann sie niemand. Bei Verzeichnissen bedeutet Ausführen soviel wie Wechseln in das Verzeichnis. Beachten Sie den Eintrag “.” in dem Ergebnis von “ls -la”. Der Ausdruck “.” steht für das aktuelle Verzeichnis, in diesem Fall Ihr home directory, das normalerweise die permissions “drwxr-xr-x hat, d.h. andere dürfen in Ihrem Verzeichnis zwar lesen, aber nichts ändern. Zum Ändern der permissions gibt es das Kommando “chmod”: 5 chmod go-r newfile.txt Nun darf niemand außer Ihnen die Datei newfile.txt lesen oder schreiben. Dabei beinhaltet Schreiben auch Ändern und Löschen. chmod go+r *.txt Das Zeichen “*” steht für “alle”. Alle Dateien im aktuellen Verzeichnis können nun von allen Benutzern (“g” für group, also alle aus Ihrer Gruppe, “o” für others, also alle anderen) gelesen werden. Benutzer bezieht sich dabei nicht nur auf Personen, die mit dem Rechner arbeiten, sondern auch auf Programm, die auf dem Rechner laufen, denn jedes Programm läuft unter Unix unter einem Benutzer und daher auch mit bestimmten Berechtigungen. Interessant ist das z.B. für Webseiten, die für alle lesbar sein müssen, denn der Webserver läuft typischerweise unter dem Benutzer “apache” und kann daher Ihre Webseiten nur lesen, wenn sie die richtigen permissions haben, und in einem für alle lesbaren Verzeichnis stehen; ein Verzeichnis ist aber nur lesbar, wenn auch die übergeordneten Verzeichnisse lesbar sind. Sowohl Ihr “www” Verzeichnis (oft auch “public html” genannt) als auch Ihr home directory müssen daher die permissions drwxr-xr-x haben. 6 Man Alle installierten Programme sollten im Online Manuel dokumentiert sein. Dieses steht Ihnen jederzeit mit dem Befehl “man” zur Verfügung: man chmod man ls man cp In der Beschreibung können Sie mit den Bildaufwärts/abwärts Tasten blättern und mit “q” verlassen. 7 Environment variables In der Shell haben Sie eine Reihe von Werten als environment variables, die verschiedene Programme verwenden, um Einstellungen abzufragen. Mit env sehen Sie eine Liste der Variablennamen mit den Werten. Interessant ist z.B. die Java-Version, die Sie verwenden: echo $JAVA_HOME Ist eine Variable nicht gesetzt, kommt eine Leerzeile zurück. Soll eine Variable gesetzt werden, und zwar so, daß sie auch innerhalb von anderen shell scripts (nicht nur innerhalb Ihrer Shell) zur Verfügung steht, dann verwenden Sie den Befehl “export”: export JAVA_HOME=$HOME/jdk1.6.0 Die Variable HOME enthählt natürlich den Pfad auf Ihr home directory. Wenn Sie nun nochmals 6 echo $JAVA_HOME eingeben, sehen Sie den gesamten Pfad. Environment variables werden typischerweise in .bashrc gesetzt, eine Datei, die beim Start jeder Shell ausgeführt wird. Sie können sich diese Datei mit dem Editor ansehen; ändern sollten Sie zunächst besser nichts, bevor Sie sich nicht mit shell scripts auskennen. 8 Shell scripts Wenn der Inhalt von Variablen abgefragt werden soll, dann muß das Zeichen $ verwendet werden. Das ist oft umständlich, funktioniert aber auch innerhalb von Texten: echo "Im Verzeichnis $HOME sind meine Dateien." Der Befehl “echo” wertet den Ausdruck aus und gibt das Ergebnis zurück. Damit sind wir auch schon mitten im Shell-Programmieren, das nicht anders ist als das interaktive Arbeiten. Legen Sie mit dem Pico-Editor eine Datei “doit” an und schreiben Sie folgendes hinein: #!/bin/sh rm -rf tmp.dir mkdir tmp.dir cd tmp.dir date > file1.txt pwd >> file1.txt 1. Zeile: dieses Skript wird mit /bin/sh als Shell ausgeführt. Auch andere Programme können Textdateien als Code auffassen und ausführen, z.B. Perl, Python. 2. Zeile: bleibt per Konvention leer. Hier könnten Sie Ihren Namen und Datum hinterlassen, falls es sich um etwas größeres handelt. 3. Wir löschen das Verzeichnis “tmp.dir” (und hoffentlich hatten Sie dort nichts wichtiges gespeichert). 4. Wir legen ein Verzeichnis mit gleichem Namen neu an, das jetzt auf jeden Fall existiert und leer ist. 5. Wir wechseln in das neue Verzeichnis. Da dieses Skript mit einer eigenen Shell ausgeführt wird, hat sich damit unser aktuelles Verzeichnis in der interaktiven Shell nicht geändert. 6. Der Befehl “date” gibt Datum, Uhrzeit und Zeitzone aus. Das Ergebnis leiten wir in eine neue Datei mit dem Namen “file1.txt” um. 7. Den Namen des aktuellen Verzeichnisses hängen wir an das Ende der Dateil file1.txt an. Speichern Sie, verlassen Sie den Editor und setzen Sie die permissions auf Ausführen: chmod +x doit Nur Sie selbst sollen dieses Script ausführen, daher diesmal kein “go”. Geben Sie “doit” ein und danach “ls”. Nun haben Sie ein Verzeichnis “tmp.dir”. Falls Sie eine Fehlermeldung “not found” bekommen, dann ist das aktuelle Verzeichnis nicht in Ihrem Pfad: echo $PATH 7 Der Pfad ist eine Liste von Verzeichnissen, in denen ausführbare Dateien gesucht werden. Es gibt es zwei Möglichkeiten, Ihr Shell script dennoch auszuführen: mit ./doit stellen Sie klar, daß die Datei “doit” im aktuellen Verzeichnis gemeint ist; oder Sie fügen das aktuelle Verzeichnis zum Pfad hinzu: export PATH=$PATH:. Eine weitere, bessere Variante ist, sich ein eigenes bin Verzeichnis anzulegen (cd; mkdir bin) und dort alle Shell scripts zu speichern. Dann können Sie mit export PATH=$PATH:$HOME/bin dieses Verzeichnis zum Suchpfad hinzufügen, vermeiden einige Sicherheitsprobleme, haben einen guten Überblick über Ihre Shell scripts, und können Sie in jedem anderen Verzeichnis verwenden! Werfen Sie nun einen Blick ins Verzeichnis tmp.dir und kontrollieren Sie den Inhalt von file1.txt mit cat file1.txt Wir müssen also nicht jedesmal einen Editor starten; den Inhalt einer kurzen Textdatei können wir uns mit “cat” auch im Terminal ausgeben lassen. bash: Verschiedenes Tools wie find liefern den gesamten Dateinamen inklusive Pfad; oft möchte man aber nur den letzten Teil davon haben: base=$(basename $fullfile) extension=${base##*.} name=${base%.*} Anwendung (interaktiv, in einer Zeile eingeben): for file in /media/SD4/DCIM/100NCD40/*; do echo $file; convert -resize 50% -quality 50% $file pics/$(basename $file); done 9 Pipe Oft haben wir die Situation, daß wir das Ergebnis des einen Programms als Eingabe für das nächste verwenden wollen. Natürlich könnten wir eine temporäre Datei verwenden, die wir nachher wieder löschen, eleganter ist aber eine pipe: ls *.txt | wc 8 Das Ergebnis von ls ist eine Liste, die an das Programm wc (für word count) weitergegeben wird. Ein kurzer Blick ins online manual (man wc) sagt uns, daß der erste Wert die Anzahl der Zeilen ist, daher wissen wir nun, wieviele Dateien mit der Endung “.txt” wir im aktuellen Verzeichnis haben. Ein Unixsystem besteht aus einer großen Zahl von scheinbar unzusammenhängenden Programmen wie wc, die verschiedenste Aufgaben erfüllen. Einige dieser Werkzeuge sollte man kennen, und eines der wichtigsten ist wohl grep. 10 Grep Mit dem Programm grep können wir Zeilen aus Dateien ausgeben, die bestimmte Texte enthalten: grep section *.tex Alle Zeilen mit “section”, “section” usw. in allen Dateien mit der Endung “.tex” werden ausgegeben. grep printf *.java | wc -l Wieviele Printf-Befehle haben wir in allen unseren Java-Programmen? grep -l Wurlitzer *.java | sort -u Nicht die Zeilen, sondern die Namen der Dateien werden ausgegeben, uns zwar dank “sort -u” (für unique) nur einmal: nun wissen wir, wo unsere Klasse Wurlitzer verwendet wird. 11 Find Oft stehen wir vor Aufgaben, die sich nur lösen lassen, wenn mehrere Verzeichnisse durchsucht oder sonstwie abgearbeitet werden. Mit dem Programm “find” ist das einfach: find . -name ’*.java’ -exec grep -l Wurlitzer {} \; | sort -u Im aktuellen Verzeichnis und allen Unterverzeichnissen werden alle Java-Dateien nach dem Text “Wurlitzer” durchsucht. Wie vorher wird nur der Name der Datei ausgegeben, und das Ergebnis wird mit “sort -u” sortiert, sodaß mehrfache Vorkommen entfernt werden. find . -name ’*.zip’ -size +1000k Alle ZIP-Dateien, die größer als 1 MB sind. find . -name ’*.zip’ -size +1000k -exec ls -s {} \; Die Größe in KB dazu. find . -name ’*.zip’ -size +1000k -exec ls -l {} \; | sort -n Das Ergebnis sortiert, und zwar numerisch. 9 Wie man sieht, ist find vor allem zusammen mit anderen Werkzeugen wir grep und sort sehr nützlich. Es lohnt sich daher, die man pages und die dortigen Beispiele zu studieren! Oft enthalten Dateinamen auch Leerzeichen, dann ist die Option -print0 nützlich: damit wird das NullZeichen zur Trennung zwischen Dateinamen ausgegeben, und andere Programme (wie z.B. xargs mit der -0 Option können damit weiterarbeiten. 12 Xargs Oft möchte man ein bestimmtes Kommando auf eine Liste von Dateien anwenden, die als Resultat eines vorherigen Kommandos in einer Pipe zur Verfügung stehen; dazu kann xargs verwendet werden: find . -exec grep -l println {} \; | xargs wc -l Der Befehl wc wird nun auf jede einzelne Datei angewendet, die aus dem find kommt, also den Text “println” enthält. Würden wir xargs aus der obigen Zeile weglassen, dann würden wir die Anzahl der Zeilen zählen, die find ausgegeben hat. Entsprechend der Option -print0 bei find gibt es hier die Option -0 zur Trennung von Dateinamen mittels Null-Zeichen statt Leerzeichen, also z.B. find /some/where -size +10M -print0 | xargs -0 ls -lrts für eine Liste von Dateien (mit Leerzeichen im Namen) die größer als 10 MB sind, sortiert nach Datum, neueste zuletzt. Welche Scripts machen etwas mit der Datei file42? Wenn grep file42 * zu aufwendig ist: find . -type f -perm -u+x | xargs grep file42 13 Stdin, stdout, stderr Unix-Programme haben eine Standard-Eingabe, das ist ein Strom von Bytes, die numerisch mit 0 und alphabetisch mit “stdin” bezeichnet werden. Entprechend gibt es auch den “stdout” mit der Nummer 1, sowie den “stderr” mit der Nummer 2. Die Standard-Eingabe kann eine Datei sein, aber auch die Tastatur: wc Nun passiert zunächst nichts; geben Sie einige kurze Zeilen Text ein und danach Strg-D, das bedeutet Ende der Eingabe. Nun arbeitet das Programm wc (word count) mit Ihrem Text und zählt Zeilen, Wörter und Bytes. Wenn auf der Kommandozeile nichts angegeben wird, dann wird als stdin von der Tastatur gelesen und als stdout am Terminal ausgegeben; die beiden können aber auch in Dateien umgeleitet werden: wc < file1.txt > cnt.txt Dabei sind die spitzen Klammern wie Pfeile zu verstehen, d.h. der Inhalt der Dateil file1.txt “fließt” hinein ins word count, und das Ergebnis fließt in die Datei cnt.txt. 10 Manchmal produzieren Programme eine große Zahl von Fehlermeldungen, die ebenfalls am Terminal ausgegeben werden. Diese kann man in eine Datei umleiten, um später (z.B. mit grep) nach bestimmten Fehlern zu suchen: bigStatistics < largeInput.dat > largeOutput.dat 2>error.log Wenn die Fehlermeldungen ignoriert werden können, müssen sie nicht gespeichert werden. Unix stellt dafür das null device zur Verfügung: prog <input >output 2>/dev/null Damit werden alle Ausgaben nach stderr auf das null device umgeleitet d.h. weggeworfen. 14 .bashrc Da wir nun einige shell script Grundlagen kennen, werfen wir einen Blick auf die Datei .bashrc in Ihrem home directory. Dort werden einige Einstellungen gemacht, die sich auf Ihre Arbeit auswirken. Sie können diese verändern und z.B. weitere Umgebungsvariablen setzen, wie die schon bekannte Java-Version, indem Sie am Ende der Datei folgenden Befehl hinzufügen: export JAVA_HOME=$HOME/jdk1.6.0 Natürlich hat das nur Sinn, wenn sich in diesem Verzeichnis auch wirklich eine Java-Installation befindet. Sonst suchen Sie lieber die systemweite Version, z.B. mit find / -type d -name ’*/bin/javac’ oder (schneller) locate javac Die Datei .bashrc wird jedesmal ausgeführt, wenn eine neue Shell gestartet wird, also z.B. auch, wenn Sie ein weiteres Terminalfenster öffnen. Wenn Sie die .bashrc geändert haben und die Änderungen in Ihrer aktuellen Shell merken wollen, müssen Sie source ~/.bashrc eingeben, wobei die Tilde “~” für Ihr home directory steht. Stattdessen können Sie natürlich auch source $HOME/.bashrc verwenden. Damit ist das shell script .bashrc neuerlich ausgeführt worden. Im .bashrc können Sie auch Ihren Pfad ändern, wenn Sie z.B. ein bin/ Verzeichnis in Ihrem home directory anlegen und alle shell scripts dort speichern. Dann lassen Sie den Suchpfad mit diesem Verzeichnis beginnen, damit bei Namensgleichheit Ihre Version verwendet wird: export PATH=$HOME/bin:$PATH 11 15 Alias Viele Aufgaben sind so einfach, daß nicht jedesmal ein shell script geschrieben werden muß. So könnte es z.B. ein Program geben, das Sie immer mit bestimmten Optionen verwenden. Dann könnten Sie natürlich ein shell script gleichen Namens schreiben: #!/bin/bash someprog -b $* Nun bekommt Ihr someprog immer die Option -b sowie eventuelle restliche Parameter mit dem Ausdruck $*. Einfacher ist dieser Effekt aber mit einem alias zu erreichen. Schreiben Sie in Ihr .bashrc folgendes: alias someprog=’/usr/bin/someprog -b’ Dazu müssen Sie zunächst feststellen, in welchem Verzeichnis sich Ihr someprog befindet: which someprog Der Befehl which gibt Ihnen den kompletten Pfad, den Sie im alias verwenden. Mit alias bekommen Sie eine Liste der gesetzten alias Einträge. Noch ein Beispiel: df (disk free) zeigt den freien Speicher in verschiedenen Bereichen, mit der –h Option in der netteren human readable form: df -h Dabei sind aber einige Bereiche, die mich nicht interessieren; ausserdem möchte ich nicht jedesmal die –h Option tippen müssen; daher finde ich interaktive heraus, wie ich die Ausgabe in eine für mich bessere Form bringen kann: /bin/df -h|egrep ’^F|^/dev’ Mit egrep werden auch die extended regular expressions unterstützt, damit kann ich mit a|b entweder das Muster a oder b selektieren; hier sind das die erste Zeile (beginnt mit Filesystem) sowie die /dev Zeilen (ŝteht für Beginn der Zeile). Nun setze ich im .bashrc den alias: alias df="/bin/df -h|egrep ’^F|^/dev’" 16 Top Einen Überblick über die laufenden Prozesse auf Ihren Rechner erhalten Sie mit top Dort werden alle Prozesse aufgelistet und nach definierbaren Kriterien sortiert. Alle fünf Sekunden wird die Liste erneuert. Es gibt Parameter wie z.B. 12 top -d 1 um jede Sekunde eine neue Liste zu erhalten, aber auch top versteht auch einige interaktive Kommandos, z.B. “1” zum Einblenden der Auslastung der einzelnen Prozessoren (falls es mehrere gibt), sowie “k” (für kill) zum Beenden von Prozessen; danach werden Sie zur Eingabe der prozess id und des Interrupts aufgefordert, dabei ist 9 der sicherste kill. Manchmal brauchen einzelne Prozesse sehr viel Rechenzeit, was den interaktiven Betrieb mühsam macht. Dann können Sie versuchen, durch geringere Priorität die Situation zu retten, ohne den Prozess zu killen, indem Sie ihn renicen, d.h. Sie geben “R” gefolgt vom PID und priority ein. Die normale Priorität ist 10, höhrere Werte bedeuten weniger Rechenzeit und damit weniger Belastung das Systems. Die meisten Prozesse sind die meiste Zeit im Modus S für sleep, d.h. sie verbrauchen fast keine Resourcen. In der top Anzeige sind die Prozesse nach der verbrauchten CPU Zeit gereiht, und der oberste kann im Zustand R für running sein. Gelegentlich sieht man auch D für dead und sogar Z für Zombie. Solche Prozesse sind meist die Folge von Programmabstürzen und können gekillt werden. Im Unterschied zu anderen Betriebssystemen wird Unix nicht durch einzelne Prozesse zum Stillstand gebracht. Die Prozesse sind hier sauber voneinander und vom Betriebssystemkern getrennt. Auch vieles, was als Betriebssystemaufgabe verstanden wird läuft über Prozesse. Typischerweise bringen nur schwere Hardwareprobleme das ganze System zum Stillstand, wenn z.B. nicht mehr auf die Festplatte zugegriffen werden kann. Es ist nicht ungewöhnlich, daß Unixrechner wochenlang oder monatelang ohne Unterbrechung und ohne Probleme laufen, und zwar nicht nur Server ohne direkte Benutzer, sondern auch solche, mit denen als PC interaktiv am Desktop gearbeitet wird. Sie können die Liste der Prozesse auch auf den stdout leiten, indem Sie das Kommando ps -ef verwenden. Nun können Sie die Liste in Ruhe studieren, oder auch als inputs in ihren Shell scripts verwenden. 17 bg, fg, nohup Wenn Sie Programme verwenden, die sehr lange laufen, weil z.B. Simulationen gerechnet werden oder aufwendige Auswertungen vorgenommen werden, dann können Sie mit bigjob -some -options < input.txt > output.txt & ein solches Programm in den “Hintergrund” schicken und in der Shell weiterarbeiten. Mit jobs erhalten Sie eine Liste der aktuell im Hintergrund arbeitenden Prozesse. Falls ein Prozess doch wieder in den Vordergrung soll, dann geben Sie ein: fg oder, falls es mehrere gibt: fg %1 13 für den ersten Job in der Liste. Hintergrundprozesse laufen weiter, solange Sie eingeloggt sind; wenn Sie allerdings ausloggen, werden alle jobs gekillt, ausser jene, die Sie mit nohup gestartet haben: nohup bigjob > output.txt & Nun können Sie nach Hause gehen und morgen wieder einloggen, und der Job läuft immer noch, außer der Rechner wurde zwischendurch neugestartet, oder einer der Sysadmins hat Ihren job gekillt, weil er zuviel Systemresourcen verbraucht hat. Wie sehr Ihr Job das System belastet, können Sie selbst ja mit top feststellen. 18 Rsync Zur Synchronisierung von Dateien, oft genutzt für backup, weil es nur kopiert soweit nötig: #!/bin/sh # removable media dest=/media/usbdisk/bak/ # rsync options OPTS="-av --max-size=1m" # check media is plugged in if [ ! -x $dest ]; then echo "Backup media not mounted" exit 1 fi # local host cd rsync $OPTS vw publ projects "$dest/pc" # remote host rsync $OPTS balrog:www/le "$dest/balrog/www" Hier wird auf eine mobile USB disk gesichert, daher prüfen wir zunächst, ob diese Platte auch wirklich angeschlossen ist. Mit rsync können wir nun Verzeichnisse auf dem lokalen Rechner sichern, und auch Verzeichnisse von anderen Rechnern (remote hosts), wenn wir dort mit ssh ohne Passwortangabe einloggen können.1 19 Übersicht Editoren pico — einfach und problemlos, aber auch nicht sehr mächtig. 1 D.h. wenn unser id dsa.pub aus dem .ssh Verzeichnis im authorized keys file am remote host enthalten ist, und wir uns lokal mit ssh-add authentisiert haben. 14 jed — Syntax Highlighting und Indentation. emacs — fast schon ein eigenes Betriebssystem gedit — Gnome Text Editor mit GUI vi — für Unix-Gurus 20 IDE Integrated Development Environments eclipse — sehr viele Möglichkeiten, aber nicht ganz problemlos netbeans — etwas einfacher 21 make In einem makefile können Abhängigkeiten zwischen Dateien formuliert werden, und damit ausgelöste Befehle: JAVAC=/usr/lib/jvm/java-6-sun-1.6.0.03/bin/javac JAVA=/usr/lib/jvm/java-6-sun-1.6.0.03/bin/java Hello.class: Hello.java $(JAVAC) Hello.java $(JAVA) Hello hello: hello.c cc -o hello hello.c ./hello Urpsprünglich für umfangreiche (und damals noch sehr langwierige) Kompilieraufgaben, heute auch für viele andere Aufgaben verwendbar. Kann auch shell scripts ersetzen. 22 Vergleich einiger Programmiersprachen unter Linux • bash: kurze Scripts mit einfachen Operationen auf Strings. Performance extrem schlecht. • perl: viel genutzt für verschiedenste Aufgaben in Unix, aber nicht numerische. Performance mäßig. • python: immer beliebter wegen einfacher und übersichtlicher Syntax – executable pseudo code. Performance gut. • C: für sehr rechenaufwendige Aufgaben, klassische Unix Programmiersprache. ISO Standard! Performance maximal. • C++, Java: durch Objektorientierung für Kooperation in Programmierteams besonders gut geeignet. Performance maximal, bei Java ev. Einschränkung durch startup der runtime. Zur Messung der Performance: time myprog someargs 15 Bash, Perl, Sed, und Awk sind auf praktisch allen Unix-System verfügbar. Einen C-Compiler gibt es meist auch, außer es wurden bei der Installation die Development-Komponenten ausgelassen. Python ist ebenfalls fast immer installiert, nicht unbedingt aber alle libraries. Java ist meist installiert, jedoch gibt es unterschiedliche JREs (Java Runtime Environment) mit unterschiedlichen Eigenschaften, insb. bezüglich Performance. Oft ist auch nur die Runtime Version installiert und der Compiler fehlt; dann muß der JDK (Java Development Kit) installiert werden. 23 Bash Die Bourne Again Shell ist der interaktive Kommandointerpreter in Linux, der im Terminal verwendet wird, um die Benutzereingaben auszuführen. • Shell scripts sind vor allem für wiederholte Arbeitsabläufe geeignet sowie für Installation von Software und Unix, wo die Performance keine Rolle spielt. • Die bash ist sehr ähnlich der sh, csh, tcsh, und einige andere. • Für numerische Aufgaben ist die bash nicht gedacht. • Details siehe frühere Einheit. 24 Sed Streaming editor. Besonders interessant in Zusammenhang mit Editor-Makros. sed ’1,$s//\ö/g’ < infile 25 Awk Benannt nach Autoren Aho, Weinberger, Kernighan. Für kurze Einzeiler gut, durch BEGIN und END Block. awk ’{ s += $2 } END { print s }’ < infile 26 Perl Practical Extraction and Reporting Language. • Für umfangreiche Aufgaben in der Systemadministration und auch als eigenständige allgemeine Entwicklungssprache geeignet. • Die Syntax ist durch die vielen $ Zeichen für Variablennamen etwas gewöhnungsbedürftig. 16 Hier ist der insertion sort (Sortieren durch Einfügen) in Perl: #!/usr/bin/perl sub insertion_sort { my $a = shift; for ($i = 1; $i < @$a; $i++) { my $x = $$a[$i]; for ($j = $i; $j >= 0; $j--) { if ($j == 0 || $x >= $$a[$j-1]) { $$a[$j] = $x; last; } else { $$a[$j] = $$a[$j-1]; } } } } sub check { my $a = shift; for ($i = 0; $i < @$a-1; $i++) { if ($$a[$i] > $$a[$i+1]) { print STDERR "NOT SORTED!\n"; return 0; } } return 1; } $n = $ARGV[0] * 1; $debug = $ARGV[1] * 1; @a = (); for ($i = 0; $i < $n; $i++) { $a[$i] = int(rand($n + 10*$n)); } if ($debug==1) { print "list: ", (join " ", @a), "\n"; } insertion_sort \@a; if ($debug==1) { print "sorted: ", (join " ", @a), "\n"; } check \@a; Mit dem Gnome2 Modul kann recht schnell eine GUI Applikation erstellt werden. Der GTK Gnome Tool Kit verwendet wie Java Swing ein hierarchisches Konzept für die GUI-Elemente, die wie mit einem Baukasten zusammengestellt und verschachtelt werden. Interessant ist, daß die Ubuntu Live CD bereits alles enthält, um solche Applikationen zu erstellen. Hier ist eine kleine GTK-Applikation in Perl: #!/usr/bin/perl use Glib qw/TRUE FALSE/; use Gtk2 ’-init’; 17 sub callback { my ($button, $data) = @_; my $x = $entry->get_text; print "x is now: $x\n"; } sub delete_event { print "Good Bye!\n"; Gtk2->main_quit; return FALSE; } $window = Gtk2::Window->new(’toplevel’); $window->set_title("Hello!"); $window->signal_connect(delete_event => \&delete_event); $window->set_border_width(10); $box1 = Gtk2::HBox->new(FALSE, 0); $window->add($box1); $label = Gtk2::Label->new($str="Enter value for x:"); $entry = Gtk2::Entry->new(); $box1->pack_start($label, TRUE, TRUE, 0); $box1->pack_start($entry, TRUE, TRUE, 0); $button = Gtk2::Button->new("OK"); $button->signal_connect(clicked => \&callback, ’button 1’); $box1->pack_start($button, TRUE, TRUE, 0); $button->show; $label->show; $entry->show; $box1->show; $window->show; Gtk2->main; 0; 27 Python • Die Sprace besticht durch klare Syntax, sie wird daher oft auch “executable pseudo-code” genannt. • Ungewöhnlich: Blockstruktur wird durch Einrücken markiert. Eine geniale Lösung, die viel überflüssige Syntax vermeidet, manchmal aber auch Probleme bereitet. • Der Interpreter unterstützt die interaktive Entwicklung und das Testen von einzelnen Funktionen. • Für die i386 32bit Architektur gibt es einen Compiler (psyco), der einen Faktor von 10 bis 20 in der Performance bringt. #!/usr/bin/python import string import sys 18 import random import psyco psyco.full() def insertion_sort(a): n = len(a) for i in xrange(1,n): x = a[i] for j in xrange(i,-1,-1): if (j == 0 or x >= a[j-1]): a[j] = x break else: a[j] = a[j-1] def check(a): n = len(a) for i in xrange(0,n-1): if (a[i] > a[i+1]): print "NOT SORTED!" def main(): n = string.atoi(sys.argv[1]) debug = string.atoi(sys.argv[2]) a = range(n) for i in xrange(0,n): a[i] = random.randint(n,10*n) if (debug==1): print "random: ", a insertion_sort(a) if (debug==1): print "sorted: ", a check(a) if __name__ == ’__main__’: main() 28 C • ISO Standard! • Low-level, aber trotzdem maschinenunabhängig • Beste Performance, Compiler seit Jahrzehnten ausgereift. • Schneller geht es nur noch mit Assembler, aber nicht viel und nicht mehr portierbar, weil Rechnerund Architekturspezifisch. • Einfache Sprache – schnell zu lernen, aber schwer zu beherrschen: Vorsicht mit Pointern und Speicherverwaltung, schlampiges Programmieren kann böse Folgen haben. • Der C-Compiler (cc, gcc, ..) erzeugt native code, der ohne Interpreter auf jedem Rechner mit passender Architektur läuft. • C-Code ist typischerweise deutlich länger als vergleichbare Programme in höheren Sprachen wie Python. Auch die Entwicklungszeit ist länger. C unterstützt den Rechner, nicht den Programmierer. 19 • C ist die klassische Entwicklungssprache in Unix; viele Werkzeuge und praktisch alle Teile des Betriebssystems im engeren Sinn sind in C oder C++ geschrieben. • C++ ist die objektorientierte Erweiterung von C, in der ebenfalls viele Unix-Applikationen geschrieben werden, sowie auch viele kommerzielle Produkte, vor allem wenn es auf höchste Performance ankommt, z.B. Spiele. Sortieren durch Einfügen in C: #include <stdio.h> #include <stdlib.h> void insertion_sort(int* a, int n) { int i,j,x; for (i = 1;i < n; i++) { x = a[i]; for (j = i; j >= 0; j--) { if (j == 0 || x >= a[j-1]) { a[j] = x; break; } else { a[j] = a[j-1]; } } } } void print(char* s, int* a, int n) { int i; printf("%s",s); for (i = 0; i < n; i++) { printf("%d ",a[i]); } printf("\n"); } int main(int argc, char* argv[]) { int i,n,debug,*a; n = atoi(argv[1]); debug = atoi(argv[2]); a = malloc(n*sizeof(int)); for (i = 0; i < n; i++) { a[i] = rand() % (n + 10*n); } insertion_sort(a,n); if (debug==1) print("ins: ", a, n); } 20 29 Java Java ist eine objektorientierte Sprache, die speziell auf Plattformunabhängigkeit entwickelt wurde - write once, run anywhere. Trotzdem: unterschiedliche Versionen von JDK und JRE können Probleme bereiten. Syntax und Konzepte ähnlich C und C++, daher für den Programmierer ähnlich mühsam – keine “höhere” Programmiersprache. Der Java Compiler javac erzeugt Byte Code, der in der Runtime interpretiert wird. Die meisten heute verbreiteten Java Runtime Systeme haben neben dem javac auch einen JIT (Just In Time) Compiler, sodaß Java heute nicht mehr unter den Performance-Problemen leidet wie noch vor einigen Jahren. Ist ein JIT Compiler in der Runtime vorhanden, dann werden häufig verwendete Codeteile in native Code compiliert. Mit JIT Compiler ist die Performance meist nur wenig schlechter als bei kompilierten Sprachen wie C und C++; manchmal sogar besser, weil der Java JIT Compiler ja zur Laufzeit arbeitet und daher mehr Informationen hat als der C-Compiler, was bessere Optimierung bedeuten kann. Zum Laufen von Java Programmen ist nur die Runtime erforderlich, nicht der Development Kit. Sortieren durch Einfügen in Java: import java.util.*; import java.text.*; class InsertionSort { public static void main(String[] args) { int n = Integer.parseInt(args[0]); int debug = Integer.parseInt(args[1]); Random rand = new Random(); int a[] = new int[n]; for (int i = 0; i < n; i++) { a[i] = rand.nextInt(n + 10*n); } insertionSort(a); if (debug==1) print("ins: ", a); } static void insertionSort(int[] a) { int n = a.length; for (int i = 1; i < n; i++) { int x = a[i]; for (int j = i; j >= 0; j--) { if (j == 0 || x >= a[j-1]) { a[j] = x; break; } else { a[j] = a[j-1]; } } } 21 } static void print(String s, int[] a) { System.out.print(s); for (int i = 0; i < a.length; i++) { System.out.print(a[i] + " "); } System.out.println(""); } } 30 Laufzeiten im Vergleich Laufzeiten in Sekunden für den Insertion Sort mit n integer Elementen, auf drei verschiedenen Rechnern (PC 2006, PC Schulungsraum 2009, Server Schulungsraum 2008): n C 5000 10000 20000 40000 80000 0.013 0.046 0.209 0.741 2.831 5000 10000 20000 40000 80000 0.009 0.030 0.118 0.476 1.857 5000 10000 20000 40000 80000 0.016 0.050 0.192 0.760 3.020 Java Python aipc20 0.100 0.338 0.201 0.719 0.483 2.742 1.707 6.399 pc7101 0.096 0.220 0.094 0.414 0.194 1.559 0.444 1.545 xmdimrill 0.148 3.273 0.240 12.811 0.415 50.639 1.079 3.708 Perl 6.360 25.148 3.629 14.136 5.990 28.303 • Java: unterschiedliche VM beeinflussen Verhältnis C/Java deutlich. • Python: Schulungsraumserver dimrill: 64-bit, daher kein Psyco. • In C recht schön zu sehen: Insertion Sort Laufzeit wächst quadratisch mit Problemgröße. 31 LUKS Linux Unified Key Setup - cryptsetup • Eine ganze Partition wird verschlüsselt, daher ohne pass phrase nicht nur – keine Dateiinhalte, sondern auch – keine Informationen über Dateisystem, Verzeichnisse, Dateigrößen und -namen • Sehr empfehlenswert für Datenträger, die leicht verlorengehen können, wie USB Sticks • auch internal hd möglich (home directories, swap space, ..) 22 • Alle Zugriffe erfolgen über dm crypt Kernel Modul, transparent für Applikationen. • Kompatibel mit anderen Betriebssystemen über FreeOTFE Beispiel Setup USB Stick mit einer Partition und FAT Dateisystem: 1. Eventuelle Daten am Stick sichern; gehen sonst alle verloren. 2. Admin Rechte notwendig (nur für die folgenden Schritte, nicht für spätere Verwendung des Sticks) sudo bash 3. cryptsetup package installieren (falls notwendig) apt-get install cryptsetup Kontrolle: lsmod | grep crypt Keine Zeile mit dm crypt: Modul nicht geladen. insmod oder Neustart. 4. USB Stick anstecken und device file herausfinden: $ df Filesystem 1K-blocks Used Available Use% Mounted on ... /dev/sdc1 486000 0 486000 0% /media/DISK_IMG 5. umount - Verbindung device file / directory gelöst $ umount /dev/sdc1 LUKS format mit pass phrase (RICHTIGES device file angeben...aufpassen...) $ cryptsetup luksFormat /dev/sdc1 6. LUKS open erzeugt crypt mapping in /dev/mapper/ cryptsetup luksOpen /dev/sdc1 mystick 7. file system mit volume label mkfs.vfat -F 32 -n mystick /dev/mapper/mystick Fertig. Beim nächsten Anstecken wird pass phrase gefragt (außer wenn in keyring gespeichert und keyring schon geöffnet in dieser session), dann unter /media/mystick gemountet. 32 PGP keys - seahorse Public/Private key pair zum • Signieren • Verschlüsseln Key enthält Name und Email Adresse • • • • • • • seahorse, auch unter Applications/Accessories/Passwords and Encryption Keys File/New, PGP Key, Advanced options RSA (sign only) 2048 oder 4096 bits Personal Keys, Properties, Details, Subkeys, Add, RSA (encrypt only) Remote, Sync and Publish Keys Keyserver, zB hkp://pool.sks-keyservers.net Problem: jeder kann Key erzeugen und publizieren, d.h. Information im Key (Name, Email Adresse) muß nicht stimmen.. 23 • Key Fingerprint auf homepage • Key auf Keyserver publizieren • Web of Trust: Key signieren = bestätigen, daß der Keyinhaber tatsächlich der ist, der er vorgibt zu sein 33 LaTeX Statt WYSIWYG (What you see is what you get) wird ähnlich HTML eine Beschreibungssprache eingesetzt, die mit Macros aber sehr mächtig ist; basierend auf (plain) TeX von Donald Knuth, im wissenschaftlichen Bereich quasi Standard. Am bestem mit einem Beispieldokument veranschaulicht: \documentclass{article} \usepackage{epsf} \title{Sample Document} \author{Johann Mitl\"ohner} \begin{document} \maketitle \section{Introduction} The area of a circle is $ a = r^2 \pi $ and the circumference is $ c = 2 r \pi $. Here is another famous formula: \begin{equation} E = m c^2 \label{eq:energy} \end{equation} Relationship \ref{eq:energy} and figure \ref{fig:plot} can be cited in the same sentence. Remember to run LaTeX twice to get these references right. \begin{figure} \begin{center} \epsffile{plot.eps} \caption{This is an interesting plot.} \label{fig:plot} \end{center} \end{figure} \section{Conclusion} Latex is really great, but it’s even better when used with BibTeX. \end{document} 24 Diesen Text speichern wir z.B. als muster.tex und übersetzen es mit dem Befehl pdflatex muster. Es wird die Datei muster.pdf erzeugt. Die Referenzen stimmen erst nach einem zweiten Durchlauf, daher erstellen wir am besten gleich ein makefile: muster: pdflatex muster pdflatex muster Nun können wir mit dem Befehl make schnell eine neue Version der PDF Datei erzeugen. Ansehen können wir die PDF Datei z.B. mit dem Programm evince bzw. durch Doppelklick im Dateimanager (nautilus). Die Grafik plot.eps wird mit dem Programm gnuplot erzeugt, das als Input folgende Datei plot.gp erhählt: set output ’plot.eps’ set size 0.6, 0.4 set style data lines set grid set term postscript eps plot ’plot.dat’ using 1:2 notitle Wir geben das Kommando gnuplot plot.gp. Die Ausgabe erfolgt in die Datei plot.eps (EPS für encapsulated postscript), die Daten zum Plotten stammen aus der Datei plot.dat: 10 20 25 30 40 50 500 600 740 340 450 280 Da alle in diesem Abschnitt genannten Programme mit Textdateien als Input arbeiten, können diese Textdateien recht einfach mit Hilfe von selbstgeschriebenen Scripts erzeugt werden, um so automatisiert Dokumenten zu erstellen. Wenn sich dann z.B. die Datei plot.dat ändert, kann das Dokument muster.pdf einfach durch das Kommando make aktualisiert werden. 34 Literatur Unix- und Linux-Bücher gibt es viele, aber der Klassiker zum Thema Unix ist immer noch The Unix Programming Environment, Brian W. Kernighan, Rob Pike, Prentice Hall, 1984. Kann ruhig eine ältere antiquarische Auflage sein, zeitlose Konzepte! 25 A reader from down under. Picture by Phil McCrea 26