[ zurück ] [ Inhalt ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ A ] [ weiter ]
Verwenden Sie nicht "test" als Namen für eine ausführbare Testdatei.
test
ist ein Shell-builtin.
Referenzen:
Dokumente und Beispiele unter /usr/share/doc/Paket
Linux Programming Bible (John Goerzen/IDG books)
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.)
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.
Referenzen für Bash:
bash(1)
info bash
das LDP BASH Programming -
Introduction HOWTO
als Information für Starter.
mc /usr/share/doc/bash/examples/ /usr/share/doc/bash/
(Installieren Sie das bash-doc
-Paket für Beispieldateien.)
Learning the bash Shell, 2. Ausgabe (O'Reilly)
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
Verschiedene Pakete bieten eine POSIX-Shell in Debian an:
dash
(Sarge)
Priority: optional
Installed-Size: 176
Kleinste und schnellste – das Beste zum Booten
ash
(Woody)
Priority: optional
Installed-Size: 180
Kleiner und viel schneller – gut für Bootprozess
bash
Essential: yes
Priority: required
Installed-Size: 580
Größer und vielfältig – viele implementierte Erweiterungen
pdksh
Priority: optional
Installed-Size: 408
Komplett AT&T ksh ähnlich
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:
if [ foo == bar ] ; then ...
diff -u Datei.c{.orig,}
mkdir /foo{bar,baz}
Die Erläuterungen zu Shells in diesem Dokument beziehen sich nur auf
POSIX-Shells und damit nicht auf csh
-artige Shells wie
tcsh
.
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.
Mit `:' = Operatortest für "existiert" und "nicht Null".
Ohne `:' = Operatortest nur für "existiert".
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
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:
stdin: Standardeingabe (Datei-Descriptor = 0)
stdout: Standardausgabe (Datei-Descriptor = 1)
stderr: Fehlerausgabe (Datei-Descriptor = 2)
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.
Jedes Kommando gibt einen Exit-Status zurück, was für einen bedingten Ausdruck verwendet werden kann:
Erfolg: 0 (wahr)
Fehler: 1–255 (falsch)
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.
Die Shell führt ein Skript wie folgt aus:
aufsplitten in Token durch Metazeichen: LEERZEICHEN, TABULATOR, NEUEZEILE, ;, (, ), <, >, |, &
überprüfen auf Schlüsselworte außerhalb von "..." und '...' (Schleife)
expandieren der Aliase außerhalb von "..." und '...' (Schleife)
expandieren der geschweiften Klammern, a{1,2} -> a1 a2 außerhalb von "..." und '...'
expandieren der Tilde, ~Nutzer -> Nutzers Homeverzeichnis außerhalb von "..." und '...'
expandieren der Parameter, $PARAMETER außerhalb von '...'
expandieren der Kommandosubstitutionen, $(Kommando) außerhalb von '...'
aufsplitten in Wörter mit $IFS außerhalb von "..." und '...'
expandieren von *?[] in Pfadnamen außerhalb von "..." und '...'
schauen nach Kommando
Funktion
builtin
Datei in $PATH
Schleife
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.
Referenzen für Awk:
Effective awk Programming, 3. Ausgabe (O'Reilly)
Sed & awk, 2. Ausgabe (O'Reilly)
mawk(1)
und gawk(1)
info gawk
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:
mawk
Priority: required
Installed-Size: 228
Kleiner und viel schneller – gut zur Standardinstallation
Compilezeit-Limitierungen bestehen
NF = 32767
sprintf buffer = 1020
gawk
Priority: optional
Installed-Size: 1708
Größer und reichhaltig – viele implementierte Erweiterungen
System V Release 4 Version von UNIX
Bell Labs awk
GNU-spezifisch
Dies ist der Interpreter auf einem Unix-artigen System.
Referenzen für Perl:
perl(1)
Programming Perl, 3. Ausgabe (O'Reilly)
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'
Dies ist ein netter objektorientierter Interpreter.
Referenzen für Python:
python(1)
Learning Python (O'Reilly).
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)
Referenzen für Make:
info make
make(1)
Managing Projects with make, 2. Ausgabe (O'Reilly)
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.
Vorbereitung:
# apt-get install glibc-doc manpages-dev libc6-dev gcc
Referenzen für C:
info libc (Referenz der C-Bibliotheksfunktionen)
gcc(1)
jede_C_Bibliotheksfunktion(3)
Kernighan & Ritchie, Die Programmiersprache C, 2. Ausgabe
(Prentice Hall). http://cm.bell-labs.com/cm/cs/cbook/
ISO C standard. http://www.open-std.org/jtc1/sc22/wg14/
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.
gdb
Vorbereitung:
# apt-get install gdb
Referenzen für gdb
:
info gdb (Tutorial)
gdb(1)
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:
Erhöhen Sie die Paketversion
durch Editieren von debian/control
.
Überprüfen Sie die Build-Skripte und stellen Sie sicher, dass CFLAGS=-g -Wall zum Kompilieren der Binarys verwendet wird.
Exportieren Sie DEB_BUILD_OPTIONS=nostrip,noopt zum Bauen des Debian-Pakets.
Vergleichen Sie Policy
10.1
für weitere Informationen.
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:
strace
: verfolgt Systemaufrufe und Signale
ltrace
: verfolgt Bibliotheksaufrufe
Es gibt verschiedene Tools zur Erkennung von Speicherlecks in Debian.
njamd
valgrind
dmalloc
electric-fence
memprof
memwatch
(nicht paketiert, verfügbar unter memwatch
.)
mpatrol
leaktracer
libgc6
Insure++ von Parasoft
. (nicht frei, kommerziell)
Überprüfen Sie auch Debugging
Tools für dynamische Speicherzuordnung und -Management
.
flex
ist ein schneller lexikalischer Analysegenerator.
Referenzen für flex
:
info flex (Tutorial)
flex(1)
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.
Einige Pakete bieten einen Yacc kompatiblen LALR-Parser-Generator in Debian an:
bison
: GNU-LALR-Parser-Generator
byacc
: Der Berkeley-LALR-Parser-Generator
btyacc
: Rückfolgender Parser-Generator basierend auf
byacc
Referenzen für bison
:
info bison (Tutorial)
bison(1)
Sie müssen Ihre eigenen main()
und yyerror()
Funktionen implementieren. main()
ruft yyparse()
,
was wiederum yylex()
aufruft, das gewöhnlich von FleX erzeugt
wird.
%% %%
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
.
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
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.
Einfache interaktive dynamische Webseiten können wie folgt erstellt werden:
Abfragen werden mittels HTML-Formularen dem Browser-Nutzer präsentiert.
Ausfüllen von und Klicken auf Formulareinträge sendet eine URL mit kodierten Parametern [20] vom Browser zum Webserver. Zum Beispiel:
http://www.foo.dom/cgi-bin/program.pl?VAR1=VAL1&VAR2=VAL2&VAR3=VAL3
http://www.foo.dom/cgi-bin/program.py?VAR1=VAL1&VAR2=VAL2&VAR3=VAL3
http://www.foo.dom/program.php?VAR1=VAL1&VAR2=VAL2&VAR3=VAL3
Ein CGI-Programm (ein beliebiges program.*
) auf dem Webserver wird
kodierte Parameter "VAR1=VAL1 VAR2=VAL2 VAR3=VAL3" als
Inhalt der Umgebungsvariablen "QUERY_STRING" erhalten
und sich selbst ausführen.
Die Standardausgabe stdout des CGI-Programms wird zum Web-Browser gesendet und als eine interaktive dynamische Webseite präsentiert.
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.
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
Vorbereitung:
# apt-get install debiandoc-sgml debiandoc-sgml-doc
Referenzen für debiandoc-sgml
:
/usr/share/doc/debiandoc-sgml-doc
debiandoc-sgml(1)
DocBook:
The Definitive Guide
von Walsh und Muellner (O'Reilly) (Paket
docbook-defguide
)
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:
"<" --> <
">" --> >
" " --> (nicht trennbares Leerzeichen)
"&" --> &
"%" --> %
"©" --> ©
"–" --> –
"—" --> —
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"> ¶m;
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.
Vorbereitung:
# tasksel # wählen Sie Miscellaneous --> TeX/LaTeX-Umgebung
Referenzen für LaTeX:
tex(1)
latex(1)
The TeXbook von Donald E. Knuth (Addison-Wesley) [21]
Das LaTeX-Handbuch von Leslie Lamport (Addison-Wesley)
Der LaTeX-Begleiter von Goossens, Mittelbach, Samarin (Addison-Wesley)
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:
teTeX - A Documentation
Guide
(tetex-doc
Paket)
Viele weitere
deutschsprachige Dokumente zu LaTeX
(u.a. Das kleine
TeX-Buch, eine deutscher Auszug aus The TeXbook)
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
).
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.
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
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.
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:
Das Debian-Paketverwaltungssystem, Abschnitt 2.2 (Grundlagen)
Debian New Maintainers' Guide (Tutorial)
dh-make(1)
Debian Developer's Reference (sehr praxisnah)
Debian Policy Manual (die ultimative Dokumentation)
Packaging Manual (Potato)
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
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 UTCosamu#at#debian.org
tux-master#at#web.de