[ zurück ] [ Inhalt ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ A ] [ weiter ]


Debian-Referenz
Kapitel 13 - Programmierung


Verwenden Sie nicht "test" als Namen für eine ausführbare Testdatei. test ist ein Shell-builtin.


13.1 Wo man startet

Referenzen:

Viele lange info-Dokumente können als Taschenbuch von GNU erhalten werden.

Die nächsten vier Abschnitte enthalten Beispielskripte in verschiedenen Sprachen, die eine Textdatei mit Zugangsinformationen erzeugen, welche an /etc/passwd mittels einer Stapelverarbeitung wie das newusers-Programm angehangen werden. Jedes Skript erfordert als Eingabe eine Datei mit Zeilen der Gestalt Vorname Nachname Passwort. (Homeverzeichnisse werden mit diesen Skripten nicht erzeugt.)


13.2 Shell

Das Lesen von Shellskripten ist der beste Weg, um zu verstehen, wie ein Unix-artiges System arbeitet. Ich gebe hier einige Hinweise zur Shellprogrammierung an. Lesen Sie Shell-Fehler um aus Fehlern zu lernen.


13.2.1 Bash – interaktive GNU-Standard-Shell

Referenzen für Bash:

Kurzes Programmbeispiel (erzeugt Zugangswerte für newusers von der Standardeingabe):

     #!/bin/bash
     # (C) Osamu Aoki Sun Aug 26 16:53:55 UTC 2001 Public Domain
     pid=1000;
     while read n1 n2 n3 ; do
     if [ ${n1:0:1} != "#" ]; then
     let pid=$pid+1
     echo ${n1}_${n2}:password:${pid}:${pid}:,,,/home/${n1}_${n2}:/bin/bash
     fi
     done

13.2.2 POSIX-Shells

Verschiedene Pakete bieten eine POSIX-Shell in Debian an:

Wollen Sie portable Shellskripte schreiben, ist es am besten es als POSIX-Shellskript zu schreiben. Verwenden Sie /bin/sh verlinkt auf ash (oder dash), um dessen POSIX-Konformität zu testen. Vermeiden Sie Skripte mit "bashisms" oder "zshisms" zu schreiben. Vermeiden Sie zum Beispiel:

Die Erläuterungen zu Shells in diesem Dokument beziehen sich nur auf POSIX-Shells und damit nicht auf csh-artige Shells wie tcsh.


13.2.3 Shellparameter

Verschiedene spezielle Parameter zum Einprägen:

     $0      = Name der Shell oder des Shellskripts
     $1      = erstes Shellargument
      ...
     $9      = neuntes Shellargument
     $#      = Anzahl der Parameter
     "$*"    = "$1 $2 $3 $4 ... $n"
     "$@"    = "$1" "$2" "$3" "$4" ... "$n"
     $?      = Exit-Status des zuletzt ausgeführten Kommandos
     $$      = Prozessnummer (PID) dieses Shellskripts
     $!      = PID des zuletzt ausgeführten Hintergrundkommandos

Grundlegende Parameterauswertungen zum Einprägen:

     Ausdruck        Wenn var gesetzt ist Wenn var nicht gesetzt ist
     ${var:-string}  $var                 string
     ${var:+string}  string               null
     ${var:=string}  $var                 string (und setzt var=string)
     ${var:?string}  $var                 (string Ausgabe und Abbruch)

Der Doppelpunkt `:' in all diesen Operatoren ist optional.

Grundlegende Parametersubstitutionen zum Einprägen:

     Ausdruck        Ergebnis
     ${var%suffix}   Entferne kleinstes suffix-Muster
     ${var%%suffix}  Entferne größtes suffix-Muster
     ${var#präfix}   Entferne kleinstes präfix-Muster
     ${var##präfix}  Entferne größtes präfix-Muster

13.2.4 Shellumleitung

Grundlegende Umleitungen zum Einprägen ([n] ist eine optionale Nummer die den Datei-Descriptor spezifiziert):

     [n]> Datei         Umleiten von stdout (oder n) zu Datei.
     [n]>> Datei        Anhängen von stdout (oder n) an Datei.
     [n]< Datei         Umleiten von stdin (oder n) von Datei.
     [n1]>&n2           Umleiten von stdout (oder n1) zu n2.
     2> Datei  >&2      Umleiten von stdout und stderr zu Datei.
      > Datei 2>&1      Umleiten von stdout und stderr zu Datei.
     | Kommando         stdout an Kommando weiterreichen.
     2>&1 | Kommando    stderr und stdout an Kommando weiterreichen.

Es wurden folgende Schreibweisen verwendet:

Die Shell erlaubt mittels des eingebauten exec, Dateien mit einem beliebigen Datei-Descriptor zu öffnen.

     $ echo Hallo >foo
     $ exec 3<foo 4>bar  # Dateien öffnen
     $ cat <&3 >&4       # umleiten von stdin nach 3, stdout nach 4
     $ exec 3<&- 4>&-    # Dateien schließen
     $ cat bar
     Hallo

Dabei bedeutet n<&- und n>&- das Schließen des Datei-Descriptors n.


13.2.5 Bedingte Ausdrucke in der Shell

Jedes Kommando gibt einen Exit-Status zurück, was für einen bedingten Ausdruck verwendet werden kann:

Es ist zu beachten, dass die Verwendung des 0 Werts im Sinne von "wahr" sich von den üblichen Konventionen in anderen Bereichen der Programmierung unterscheidet. Auch ist `[' das Äquivalent des test-Kommandos, das sein Argument bis zu `]' als bedingten Ausdruck auswertet.

Grundlegende bedingte Ausdrucke zum Einprägen sind:

     Kommando && bei_Erfolg_dies_starten || true
     Kommando || bei_Misserfolg_dies_starten
     
     if [ bedingter_Ausdruck ]; then
      bei_Erfolg_dies_starten
     else
      bei_Misserfolg_dies_starten
     fi

Es wurde || true verwendet, um sicherzustellen, dass das Shellskript in dieser Zeile nicht versehentlich abgebrochen wird, wenn die Shell (oder set) mit der Option -e gestartet wird.

Dateivergleichsoperatoren im bedingten Ausdruck sind:

     Ausdruck          Wahr wenn ...
     -e Datei          Datei existiert.
     -d Datei          Datei existiert und ein Verzeichnis ist.
     -f Datei          Datei existiert und eine reguläre Datei ist.
     -w Datei          Datei existiert und schreibbar ist.
     -x Datei          Datei existiert und ausführbar ist.
     Datei1 -nt Datei2 Datei1 neuer als Datei2 ist. (Modifizierungszeit)
     Datei1 -ot Datei2 Datei1 älter als Datei2 ist. (Modifizierungszeit)
     Datei1 -ef Datei2 beide die selbe Device- und Inode-Nummer haben.

Stringvergleichsoperatoren im bedingten Ausdruck sind:

     Ausdruck       Wahr wenn ...
          -z str    die Länge von str Null ist.
          -n str    die Länge von str nicht Null ist.
     str1 == str2   str1 und str2 gleich sind.
     str1 =  str2   str1 und str2 gleich sind.
        ("=" sollte statt "==" für POSIX-Konformität verwendet werden)
     str1 != str2   str1 und str2 ungleich sind.
     str1 <  str2   str1 vor str2 einsortiert wird (locale abhängig).
     str1 >  str2   str1 nach str2 einsortiert wird (locale abhängig).

Arithmetische Ganzzahlvergleiche im bedingten Ausdruck sind -eq, -ne, -lt, -le, -gt und -ge.


13.2.6 Kommandozeilenbearbeitung

Die Shell führt ein Skript wie folgt aus:

Einfache Anführungszeichen innerhalb von doppelten Anführungszeichen haben keinen Effekt.

Das Ausführen von set -x in der Shell oder das Starten der Shell mit der Option -x veranlasst die Shell alle gestarteten Kommandos auszugeben. Dies ist sehr nützlich zum Debuggen.


13.3 Awk

Referenzen für Awk:

Kurzes Programmbeispiel (erzeugt newusers-Kommandoeintrag):

     #!/usr/bin/awk -f
     # Skript zum Erzeugen einer für das 'newusers'-Kommando geeigneten
     # Datei aus einer Datei bestehend aus Nutzer-IDs und Passwörtern
     # in der Form:  Vorname Nachname Passwort
     # Copyright (c) KMSelf Sat Aug 25 20:47:38 PDT 2001
     # Verteilbar unter GNU GPL v 2 oder (je nach Ihrer Wahl) einer
     # späteren Version.
     # Dieses Programm wird OHNE JEGLICHE HAFTUNG vertrieben.
     
     BEGIN {
         # zuweisen der anfänglichen UID, GID
         if ( ARGC > 2 ) {
             startuid = ARGV[1]
             delete ARGV[1]
         }
         else {
             printf( "Verwendung: newusers startUID Datei\n" \
             " wobei:\n" \
             "  startUID die erste Nutzer-ID zum Hinzufügen ist und\n"\
             "  Datei eine Eingabedatei der folgenden Gestalt ist:\n" \
             "    Vorname Nachname Passwort\n" \
             )
             exit
         }
     
         infile = ARGV[1]
         printf( "Erste UID: %s\n\n", startuid )
     }
     
     /^#/ { next }
     
     {
         ++record
         first = $1
         last = $2
         passwd = $3
         user= substr( tolower( first ), 1, 1 ) tolower( last )
         uid = startuid + record - 1
         gid = uid
         printf( "%s:%s:%d:%d:%s %s,,/home/%s:/bin/bash\n",  \
             user, passwd, uid, gid, first, last, user \
             )
     }

Zwei Pakete bieten POSIX-awk in Debian an:


13.4 Perl

Dies ist der Interpreter auf einem Unix-artigen System.

Referenzen für Perl:

Kurzes Programmbeispiel (erzeugt newusers-Kommandoeintrag):

     #!/usr/bin/perl
     # (C) Osamu Aoki Sun Aug 26 16:53:55 UTC 2001 Public Domain
     $pid=1000;
     while (<STDIN>) {
             if (/^#/) { next;}
             chop;
             $pid++;
             ($n1, $n2, $n3) = split / /;
             print $n1,"_",$n2,":", $n3, ":",$pid,
                       ":",$pid,",,,/home/",$n1,"_",$n2,":/bin/bash\n"
     }

Installieren eines Perl-Moduls Modul:

     # perl -MCPAN -e 'install Modul'

13.5 Python

Dies ist ein netter objektorientierter Interpreter.

Referenzen für Python:

Kurzes Programmbeispiel (erzeugt newusers-Kommandoeintrag):

     #! /usr/bin/env python
     import sys, string
     
     # (C) Osamu Aoki Sun Aug 26 16:53:55 UTC 2001 Public Domain
     # Portiert von awk Skript durch KMSelf Sat Aug 25 20:47:38 PDT 2001
     # Dieses Programm wird OHNE JEGLICHE HAFTUNG vertrieben.
     
     def usages():
         print \
     "Verwendung: ", sys.argv[0], " start_UID [Dateiname]\n" \
     "\tstartUID ist die erste Nutzer-ID zum Hinzufügen.\n" \
     "\tDateiname ist eine Eingabedatei. " \
     "Ohne Angabe wird die Standardeingabe verwendet.\n\n" \
     "Format der Eingabedatei:\n" \
     "\tVorname Nachname Passwort\n"
                     return 1
     
     def parsefile(startuid):
         #
         # filtern
         #
         uid = startuid
         while 1:
             line = infile.readline()
             if not line:
                 break
             if line[0] == '#':
                 continue
             (first, last, passwd) = string.split(string.lower(line))
             # obiges stürzt bei falscher Parameteranzahl ab :-)
             user = first[0] + last
             gid = uid
             lineout = "%s:%s:%d:%d:%s %s,,/home/%s:/bin/bash\n" %  \
                 (user, passwd, uid, gid, first, last, user)
             sys.stdout.write(lineout)
             +uid
     
     if __name__ == '__main__':
         if len(sys.argv) == 1:
             usages()
         else:
             uid = int(sys.argv[1])
             #print "# UID Start von: %d\n" % uid
             if len(sys.argv) > 1:
                 infilename   = string.join(sys.argv[2:])
                 infile = open(infilename, 'r')
                 #print "# Lese Datei von: %s\n\n" % infilename
             else:
                 infile = sys.stdin
             parsefile(uid)

13.6 Make

Referenzen für Make:

Einfache automatische Variablen:

Regelsyntax:

     Ziel: [ Voraussetzungen ... ]
      [TAB]  Kommando1
      [TAB]  -Kommando2 # ignoriere Fehler
      [TAB]  @Kommando3 # unterdrücke Kommandozeilenausgabe

Hier ist [TAB] ein Tabulator. Jede Zeile wird von der Shell nach einer Variablensubstitution interpretiert. Verwenden Sie \ am Ende einer Zeile zur Fortsetzung des Skripts. Statt $ ist $$ für Umgebungsvariablen zu schreiben.

Implizite Regeln für Ziel und Voraussetzungen können beispielsweise wie folgt geschrieben werden:

     %: %.c header.h

oder

     %.o: %.c header.h

Hier enthält Ziel das Zeichen % (exakt einmal). % passt auf jeden nicht leeren Teilstring in den aktuellen Zieldateinamen. Voraussetzungen verwendet % ähnlich um auszudrücken, wie sich diese Namen zum aktuellen Ziel verhalten.

Suffixregeln sind der veraltete Weg zur Definition impliziter Regeln für make. Sie werden noch in GNU-make zur Kompatibilität unterstützt, aber man sollte äquivalente Musterregeln wann immer möglich verwenden:

     alte Suffixregel --> neue Musterregel
     .c:              --> %  : %.c
     .c.o:            --> %.o: %.c

Automatische Variablen für diese Regel:

     foo.o: neu1.c neu2.c alt1.c neu3.c
     $@ == foo.o                         (Ziel)
     $< == neu1.c                        (erstes der neueren Objekte)
     $? == neu1.c neu2.c neu3.c          (alle neueren Objekte)
     $^ == neu1.c neu2.c alt1.c neu3.c   (alle)
     $* == `%' aktuelles Ziel ohne Suffix.

Variablenreferenzen:

     foo1 := bar    # einmalige Expandierung
     foo2  = bar    # rekursive Expandierung
     foo3 += bar    # anhängen
     SRCS := $(wildcard *.c)
     OBJS := $(foo:c=o)
     OBJS := $(foo:%.c=%.o)
     OBJS := $(patsubst %.c,%.o,$(foo))
     DIRS  = $(dir directory/filename.ext) # Extracts "directory"
      $(notdir NAMES...), $(basename NAMES...), $(suffix NAMES...) ...

Starten Sie make -p -f/dev/null, um alle internen automatischen Regeln zu sehen.


13.7 C

Vorbereitung:

     # apt-get install glibc-doc manpages-dev libc6-dev gcc

Referenzen für C:


13.7.1 Ein einfaches C-Programm (gcc)

Ein einfaches Beispiel zum Kompilieren von example.c mit einer Bibliothek libm in eine ausführbare Datei namens Testbeispiel:

     $ cat > example.c <<EOF
     #include <stdio.h>
     #include <math.h>
     #include <string.h>
     
     int main(int argc, char **argv, char **envp){
             double x;
             char y[11];
             x=sqrt(argc+7.5);
             strncpy(y, argv[0], 10); /* Pufferüberlauf verhindern */
             y[10] = '\0'; /* füllen, so dass String mit '\0' endet */
             printf("%5i, %5.3f, %10s, %10s\n", argc, x, y, argv[1]);
             return 0;
     }
     EOF
     
     $ gcc -Wall -g -o Testbeispiel example.c -lm
     $ ./Testbeispiel
             1, 2.915, ./Testbeis,     (null)
     $ ./Testbeispiel 1234567890qwertz
             2, 3.082, ./Testbeis, 1234567890qwertz

Hier wird -lm benötigt, um mit der Bibliothek libm für sqrt() zu linken. Die eigentliche Bibliothek ist in /lib/ mit dem Dateinamen libm.so.6, was ein symbolischer Link auf libm-2.1.3.so ist.

Schauen Sie auf den letzten Parameter im Ausgabetext. Es gibt mehr als 10 Buchstaben, obwohl %10s spezifiziert ist.

Die Verwendung von Funktionen die Zeiger auf Speicherbereiche ohne Bereichscheck nutzen, wie sprintf und strcpy wird missbilligt, um das Ausnutzen von Pufferüberläufen zu verhindern, die obige Überlaufeffekte verwenden. Stattdessen sollte man snprintf und strncpy verwenden.


13.7.2 Fehlersuche


13.7.2.1 Fehlersuche (Debugging) mit gdb

Vorbereitung:

     # apt-get install gdb

Referenzen für gdb:

Verwenden Sie gdb, um ein mit der -g-Option kompiliertes Programm zu debuggen. Viele Kommandos können abgekürzt werden. Vervollständigungen arbeiten wie in der Shell mit der Tabulator-Taste.

     $ gdb Programm
     (gdb) b 1                # Haltepunkt in Zeile 1 setzen
     (gdb) run arg1 arg2 arg3 # Programm starten
     (gdb) next               # nächste Zeile
     ...
     (gdb) step               # einen Schritt vorwärts
     ...
     (gdb) p parm             # parm ausgeben
     ...
     (gdb) p parm=12          # Wert auf 12 setzen

Um aus Emacs heraus zu debuggen, wird auf Zusammenfassung der Editorkommandos (Emacs, Vim), Abschnitt 11.3.4 verwiesen.

Da alle installierten Binarys standardmäßig in einem Debian-System gestript sein sollten, sind die meisten Debug-Informationen entfernt. Um gdb sinnvoll zum Debuggen von Debian-Paketen einsetzen zu können, müssen entsprechende Pakete unter Beachtung von Folgendem neu gebaut werden:

Vergleichen Sie Policy 10.1 für weitere Informationen.


13.7.2.2 Überprüfen der Abhängigkeiten von Bibliotheken

Verwenden Sie ldd, um die Abhängigkeiten eines Programms von Bibliotheken zu bestimmen:

     $ ldd /bin/ls
             librt.so.1 => /lib/librt.so.1 (0x4001e000)
             libc.so.6 => /lib/libc.so.6 (0x40030000)
             libpthread.so.0 => /lib/libpthread.so.0 (0x40153000)
             /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Damit ls in einer chroot-Umgebung funktioniert, müssen die obigen Bibliotheken in der chroot-Umgebung vorhanden sein.

Die folgenden Kommandos sind auch nützlich:


13.7.2.3 Debuggen mit Tools zur Erkennung von Speicherlecks

Es gibt verschiedene Tools zur Erkennung von Speicherlecks in Debian.

Überprüfen Sie auch Debugging Tools für dynamische Speicherzuordnung und -Management.


13.7.3 Flex – ein besseres Lex

flex ist ein schneller lexikalischer Analysegenerator.

Referenzen für flex:

Sie müssen Ihre eigenen Funktionen main() und yywrap() implementieren oder Ihr Programm.l sollte wie folgt aussehen, um ohne eine Bibliothek zu kompilieren (yywrap ist ein Makro; %option main aktiviert %option noyywrap implizit):

     %option main
     %%
     .|\n    ECHO ;
     %%

Alternativ kann mit der -lfl-Linker-Option am Ende Ihrer cc-Kommandozeile kompiliert werden (wie AT&T-Lex mit -ll). Keine %option wird in diesem Fall benötigt.


13.7.4 Bison – ein besseres Yacc

Einige Pakete bieten einen Yacc kompatiblen LALR-Parser-Generator in Debian an:

Referenzen für bison:

Sie müssen Ihre eigenen main() und yyerror() Funktionen implementieren. main() ruft yyparse(), was wiederum yylex() aufruft, das gewöhnlich von FleX erzeugt wird.

     %%
     
     %%

13.7.5 Autoconf

autoconf ist ein Tool zum Erzeugen von Shellskripten, die Softwarequellpakete automatisch so konfigurieren, dass sie sich an viele UNIX-artige Systeme unter Verwendung des vollständigen GNU-Build-Systems anpassen.

autoconf erzeugt das Konfigurationsskript configure. configure erzeugt automatisch ein angepasstes Makefile aus Makefile.in.


13.7.5.1 Kompilieren und Installieren eines Programms

Debian ändert keine Dateien unter /usr/local/ (vergleichen Sie Unterstützung von Vielfalten, Abschnitt 2.5). Kompilieren Sie ein Programm aus den Quellen, so sollten Sie es in /usr/local/ installieren, damit es nicht mit Debian interferiert.

     $ cd src
     $ ./configure --prefix=/usr/local
     $ make
     $ make install # dies kopiert die Dateien ins System

13.7.5.2 Deinstallation eines Programms

Wenn Sie noch den Quellcode haben, dieser autoconf/automake nutzt und Sie noch wissen, wie Sie es konfiguriert haben, verfahren Sie wie folgt:

     $ ./configure alle-verwendeten-Optionen
     # make uninstall

Sind Sie sich absolut sicher, dass der Installationsprozess Dateien nur unter /usr/local/ ablegt und es nichts wichtiges darunter gibt, können Sie alles wie folgt löschen:

     # find /usr/local -type f -print0 | xargs -0 rm -f

Sind Sie nicht sicher, wo Dateien installiert sind, sollten Sie einen Blick auf checkinstall werfen, was einen leeren Pfad bei der Deinstallation liefert.


13.8 Web

Einfache interaktive dynamische Webseiten können wie folgt erstellt werden:

Aus Sicherheitsgründen wird es empfohlen keinen eigenen zusammengebastelten Code zum Parsen von CGI-Parametern zu verwenden. Es gibt etablierte Module dafür in Perl (man vergleiche Perl, Abschnitt 13.4) und Python (man vergleiche Python, Abschnitt 13.5). PHP unterstützt diese Funktionalität. Wenn eine Speicherung der Daten auf dem Client erfolgen soll, werden Cookys verwendet. Wenn eine Verarbeitung der Daten auf dem Client erwünscht ist, wird häufig Javascript benutzt.

Für weitere Informationen wird auf Das Common-Gateway-Interface, Die Apache-Software-Foundation und JavaScript verwiesen.

Die Suche nach "CGI tutorial" auf Google durch Eingabe einer kodierten URL http://www.google.com/search?hl=en&ie=UTF-8&q=CGI+tutorial direkt im Browser ist eine gute Möglichkeit, die Wirkung des CGI-Skripts auf dem Google-Server zu betrachten.


13.9 Dokument-Aufbereitung


13.9.1 Das roff-Satzsystem

Traditionell ist roff das wichtigste Unix-Textbearbeitungssystem.

Vergleichen Sie roff(7), groff(7), groff(1), grotty(1), troff(1), groff_mdoc(7), groff_man(7), groff_ms(7), groff_me(7), groff_mm(7) und info groff.

Es gibt eine gute Einführung zu -me Makros. Haben Sie groff (1.18 oder neuer), suchen Sie /usr/share/doc/groff/meintro.me.gz und führen Sie das Folgende aus:

     $ zcat /usr/share/doc/groff/meintro.me.gz | \
          groff -Tascii -me - | less -R

Das Folgende erzeugt eine einfache Textdatei:

     $ zcat /usr/share/doc/groff/meintro.me.gz | \
         GROFF_NO_SGR=1 groff -Tascii -me - | col -b -x > meintro.txt

Verwenden Sie die PostScript-Ausgabe zum Drucken.

     $ groff -Tps meintro.txt | lpr
     $ groff -Tps meintro.txt | mpage -2 | lpr

13.9.2 SGML

Vorbereitung:

     # apt-get install debiandoc-sgml debiandoc-sgml-doc

Referenzen für debiandoc-sgml:

SGML ermöglicht das Verwalten mehrerer Dokumentformate. Ein einfaches SGML-System ist Debiandoc, was hier verwendet wird. Dies erfordert kleinere Umwandlungen der Textdateien für die folgenden Buchstaben:

Um einen Abschnitt als nicht ausgebbaren Kommentar zu markieren, wird Folgendes verwendet:

     <!-- Darlegen des Sachverhalts ... -->

Für einen Abschnitt mit abschaltbarem Kommentar:

     <![ %FIXME; [ Darlegen des Sachverhalts ... ]]>

In SGML gewinnt die erste Definition einer Entität. Zum Beispiel:

     <!entity % qref "INCLUDE">
     <![ %qref; [ <!entity param "Daten 1"> ]]>
     <!entity param "Daten 2">
     &param;

Dies endet mit "Daten 1". Enthält die erste Zeile "IGNORE" anstatt "INCLUDE", endet es mit "Daten 2" (die zweite Zeile ist eine bedingte Anweisung). Es ist auch möglich, einzelne wiederholende Textabschnitte separat vom Inhalt zu definieren.

     <!entity wessen "mein">
     Hallo &wessen; Freund.
     Dies ist &wessen; Buch.

Dies ergibt das Folgende:

     Hallo mein Freund.
     Dies ist mein Buch.

Vergleichen Sie mit dem kurzen SGML-Beispiel sample.sgml im Beispielverzeichnis.

Wenn SGML-Dokumente größer werden, hat TeX, das intern zur Textbearbeitung verwendet wird, manchmal Probleme. Vergleichen Sie TeX/LaTeX, Abschnitt 13.9.3.


13.9.3 TeX/LaTeX

Vorbereitung:

     # tasksel # wählen Sie Miscellaneous  --> TeX/LaTeX-Umgebung

Referenzen für LaTeX:

Dies ist das mächtigste Textsatzprogramm. Viele SGML-Bearbeitungsprogramme verwenden dies zur Textbearbeitung im Hintergrund. Lyx und GNU-TeXmacs, die mit den Paketen lyx, lyx-xforms und lyx-qt bzw. texmacs bereitgestellt werden, bieten eine nette WYSIWYG-Umgebung zum Editieren für LaTeX, zu der viele Emacs und Vim als Quellcode-Editor wählen.

Es gibt viele Online-Verweise:

Wenn Dokumente größer werden, hat TeX manchmal Probleme. Um dies zu korrigieren, muss die Pool-Größe in /etc/texmf/texmf.cnf erhöht werden (oder editieren Sie besser /etc/texmf/texmf.d/95NonPath und starten Sie update-texmf).


13.9.4 Literate Programming

Anstatt Code zu schreiben, der Dokumentationen enthält, schreibt der gebildete Programmierer (literate programmer) Dokumentation die Code enthält. Dieser Ansatz sichert eine gute Dokumentation für ein Programm.

Für weitere Informationen zu literate-programming wird auf Literate Programming verwiesen.


13.9.4.1 Noweb

Vorbereitung:

     # apt-get install nowebm

Referenzen für Noweb:

Dies ist ein WEB-artiges literate-programming Werkzeug, das einfacher ist, sowie erweiterbar und sprachunabhängig. [22] Wenn noweb gestartet wird, schreibt es den Programmquellcode in Ausgabedateien, die in der noweb-Datei angegeben sind, und es erstellt eine TeX-Datei für die Dokumentation.

Das Debian-Paket ifupdown ist ein gutes Beispiel.

     $ apt-get source ifupdown
     $ cd ifupdown*
     $ make ifupdown.pdf ifupdown.ps

13.9.4.2 Doxygen

Vorbereitung:

     # apt-get install doxygen doxygen-doc doxygen-gui

Referenzen für Doxygen (von doxygen erstellt!):

Es kann HTML-, RTF-, Unix-Handbuchseiten-, PostScript- und PDF- (durch LaTeX) Dokumentation für C++-, C-, Java-, IDL- und zum Teil PHP- sowie C#-Programme erstellen. Doxygen ist kompatibel zu JavaDoc (1.1), Qt-Doc, KDOC und wurde speziell entworfen, um Projekte die Troll Tech's Qt Bibliothek nutzen, zu unterstützen. Es erstellt Include-Abhängigkeitsdiagramme, Diagramme zu Zusammengehörigkeiten und grafische Darstellungen der Klassenhierarchien sogar für nicht dokumentierte Programme. Die Ausgabe ist ähnlich zu Qt's Dokumentation.


13.10 Paketerzeugung

Vorbereitung:

     # apt-get install debian-policy developers-reference \
                       maint-guide dh-make debhelper
     # apt-get install packaging-manual # für Potato

Referenzen für die Paketerzeugung:


13.10.1 Paketerzeugung für ein einzelnes Programm

Eine schnelle und unsaubere Methode der Paketerzeugung für ein einzelnes Programm ist nach Joey Hess:

     # mkdir -p mypkg/usr/bin mypkg/DEBIAN
     # cp binary mypkg/usr/bin
     # cat > mypkg/DEBIAN/control
     Package: mypackage
     Version: 1
     Architecture: i386
     Maintainer: Joey Hess <joeyh@debian.org>
     Description: my little package
      Don't expect much.
     ^D
     # dpkg-deb -b mypkg

13.10.2 Paketerzeugung mit Tools

Verwenden Sie dh_make aus dem dh-make-Paket, um eine solide Grundlage für ein Paket zu gewinnen. Folgen Sie danach den Anweisungen in dh-make(1). Dies nutzt debhelper in debian/rules.

Ein älterer Zugang ist das Verwenden von deb-make aus dem debmake-Paket. Dies nutzt keine debhelper-Skripte und hängt nur von der Shell ab. Verwenden Sie dies nicht länger.

Für Beispiele von Paketen mit mehreren Quelldateien vergleichen Sie mit "mc" (dpkg-source -x mc_4.5.54.dsc), das "sys-build.mk" von Adam Heath (doogie@debian.org) nutzt und "glibc" (dpkg-source -x glibc_2.2.4-1.dsc), das ein anderes System von Joel Klecker (espy@debian.org) nutzt.


[ zurück ] [ Inhalt ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ A ] [ weiter ]


Debian-Referenz

CVS, Don 18. Jan 2007, 11:52:59 UTC

Osamu Aoki osamu#at#debian.org
Übersetzer: Jens Seidel tux-master#at#web.de
Autoren, Abschnitt A.1