Inhaltsverzeichnis
Ich gebe hier einige Startimpulse, um Programmierung im Debian-System zumindest so weit zu erlernen, dass der Programmcode aus Debian-Quellpaketen zwecks Fehlersuche nachverfolgt werden kann. Hier einige erwähnenswerte Pakete und dazugehörige Dokumentation:
Handbuchseiten (manpages) sind verfügbar, indem Sie nach Installation der
manpages
- und manpages-dev
-Pakete
"man programmname
" eingeben. Informationen über
GNU-Werkzeuge erhalten Sie über "info programmname
" nach
Installation der entsprechenden Dokumentationspakete. Sie müssen unter
Umständen die Bereiche contrib
und
non-free
des Archivs zusätzlich zu
main
freigeben, da einige GFDL-Dokumentation als nicht
DFSG-frei angesehen wird.
Ziehen Sie bitte die Nutzung eines Versionskontrollsystems in Erwägung, siehe Abschnitt 10.5, „Git“.
Warnung | |
---|---|
Verwenden Sie nicht " |
Achtung | |
---|---|
Sie sollten Software, die direkt aus den Quellen kompiliert wurden, in
" |
Tipp | |
---|---|
Die Code-Beispiele zum Erzeugen des Songs "99 Bottles of Beer" sollten Ihnen gute Ideen zu nahezu allen Programmiersprachen liefern. |
Das Shell-Skript ist eine Textdatei mit gesetztem Ausführungsbit und enthält Befehle in der folgenden Form:
#!/bin/sh ... command lines
Die erste Zeile spezifiziert den Shell-Interpreter, der den Inhalt dieser Datei liest und ausführt.
Das Lesen von Shell-Skripten ist der beste Weg, um zu verstehen, wie ein Unix-artiges System arbeitet. Ich gebe hier einige Hinweise zur Shell-Programmierung. Lesen Sie "Shell Mistakes" (https://www.greenend.org.uk/rjk/2001/04/shell.html), um aus Fehlern zu lernen.
Anders als der interaktive Shell-Modus (lesen Sie Abschnitt 1.5, „Der einfache Shell-Befehl“ und Abschnitt 1.6, „Unix-ähnliche Textverarbeitung“) verwenden Shell-Skripte häufig Parameter, bedingte Ausdrücke und Schleifen.
Viele Systemskripte können von jeder POSIX-konformen Shell (lesen Sie Tabelle 1.13, „Liste von Shell-Programmen“) interpretiert werden.
Die nicht-interaktive Standard-POSIX-Shell "/usr/bin/sh
"
ist ein symbolischer Link auf /usr/bin/dash
und wird von
vielen Systemprogrammen genutzt.
Die interaktive Standard-POSIX-Shell ist /usr/bin/bash
.
Vermeiden Sie, in Shell-Skripten Bashisms
oder Zshisms (speziell für Bash oder Zsh
angepasste Shell-Befehle) zu verwenden, damit sie auf alle POSIX-Shells
portierbar sind. Sie können dies mittels checkbashisms
(1)
überprüfen.
Tabelle 12.1. Liste typischer Bashisms
Gut: POSIX | Vermeiden: Bashism |
---|---|
if [ "$foo" = "$bar" ] ; then … |
if [ "$foo" == "$bar" ] ; then … |
diff -u datei.c.orig datei.c |
diff -u datei.c{.orig,} |
mkdir /foobar /foobaz |
mkdir /foo{bar,baz} |
funktionsname() { … } |
function funktionsname() { … } |
Oktalformat: "\377 " |
Hexadezimalformat: "\xff " |
Der Befehl "echo
" muss mit Vorsicht verwendet werden, da
seine Implementierung sich zwischen Shell-Builtins und externen Befehlen
unterscheidet:
vermeiden Sie die Verwendung jeglicher Befehlsoptionen außer
"-n
";
vermeiden Sie die Verwendung von Escape-Sequenzen in Zeichenketten, da deren Handhabung unterschiedlich ist.
Anmerkung | |
---|---|
Obwohl die Option " |
Tipp | |
---|---|
Nutzen Sie den " |
Einige spezielle Shell-Parameter werden oft in Shell-Skripten verwendet:
Tabelle 12.2. Liste von Shell-Parametern
Shell-Parameter | Wert |
---|---|
$0 |
Name der Shell oder des Shell-Skripts |
$1 |
erstes (1.) Shell-Argument |
$9 |
neuntes (9.) Shell-Argument |
$# |
Anzahl der Parameter |
"$*" |
"$1 $2 $3 $4 … " |
"$@" |
"$1" "$2" "$3" "$4" … |
$? |
Beendigungs-Status des zuletzt ausgeführten Befehls |
$$ |
Prozessnummer (PID) des Shell-Skripts |
$! |
PID des zuletzt ausgeführten Hintergrundbefehls |
Grundlegende Parameterauswertungen, die Sie sich einprägen sollten:
Tabelle 12.3. Liste von Parameterauswertungen
Parameterauswertung | Wert, falls var gesetzt ist |
Wert, falls var nicht gesetzt ist |
---|---|---|
${var:-string} |
"$var " |
"string " |
${var:+string} |
"string " |
"null " |
${var:=string} |
"$var " |
"string " (und ausführen von
"var=string ") |
${var:?string} |
"$var " |
Ausgabe von "string " auf stderr (und mit Fehlerstatus beenden) |
Hierbei ist der Doppelpunkt ":
" in allen Operatoren
optional:
mit ":
" = Operatortest
für existiert und nicht Null;
ohne ":
" =
Operatortest nur für existiert.
Tabelle 12.4. Liste von Shell-Parameterersetzungen
Parameterersetzung | Ergebnis |
---|---|
${var%suffix} |
entferne kleinstes Suffix-Muster |
${var%%suffix} |
entferne größtes Suffix-Muster |
${var#prefix} |
entferne kleinstes Prefix-Muster |
${var##prefix} |
entferne größtes Prefix-Muster |
Jeder Befehl gibt einen Beendigungs-Status (Exit-Status) zurück, der für einen bedingten Ausdruck verwendet werden kann:
Erfolg: 0 ("Wahr/True")
Fehler: nicht 0 ("Falsch/False")
Anmerkung | |
---|---|
"0" im Kontext eines bedingten Ausdrucks für die Shell bedeutet "Wahr", während "0" im Kontext eines bedingten Ausdrucks für ein C-Programm "Falsch" bedeutet. |
Anmerkung | |
---|---|
" |
Grundlegende Ausdrucksformen für bedingte Ausdrücke, die Sie sich einprägen sollten:
"befehl &&
bei_erfolg_auch_diesen_befehl_ausführen ||
true
"
"befehl ||
falls_kein_erfolg_auch_diesen_befehl_ausführen ||
true
"
ein mehrzeiliger Skriptschnipsel wie dieser:
if [ conditional_expression ]; then if_success_run_this_command else if_not_success_run_this_command fi
Hierbei ist das "|| true
" am Ende erforderlich, um
sicherzustellen, dass das Shell-Skript sich bei dieser Zeile nicht
fälschlicherweise beendet, wenn die Shell mit der
"-e
"-Option aufgerufen wird.
Tabelle 12.5. Liste von Dateivergleichsoperatoren in bedingten Ausdrücken
Gleichung | 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 (Änderungszeitpunkt) |
datei1 -ot
datei2 |
datei1 älter als datei2 ist (Änderungszeitpunkt) |
datei1 -ef
datei2 |
datei1 und datei2 die gleiche Device- und Inode-Nummer haben |
Tabelle 12.6. Liste von String-Vergleichsoperatoren im bedingten Ausdruck
Gleichung | Wahr wenn … |
---|---|
-z str |
die Länge von str gleich Null ist |
-n str |
die Länge von str nicht Null ist |
str1 = str2 |
str1 und str2 gleich sind |
str1 != str2 |
str1 und str2 ungleich sind |
str1 < str2 |
str1 in der Sortierung vor str2 erscheint (Locale-abhängig) |
str1 > str2 |
str1 in der Sortierung hinter str2 erscheint (Locale-abhängig) |
Arithmetische Ganzzahlvergleicher in
bedingten Ausdrücken sind "-eq
",
"-ne
", "-lt
",
"-le
", "-gt
" und
"-ge
".
Es gibt mehrere Ausdrucksweisen für Schleifen, die in POSIX-Shells genutzt werden können:
"for x in foo1 foo2 … ; do befehl ; done
" führt Schleifen
aus, indem Einträge aus der Liste "foo1 foo2 …
" der
Variable "x
" zugewiesen werden und dann
"befehl
" ausgeführt wird.
"while bedingung ; do befehl ; done
" wiederholt
"befehl
", solange "bedingung
" wahr
ist.
"until bedingung ; do befehl ; done
" wiederholt
"befehl
", solange "bedingung
" nicht
wahr ist.
"break
" ermöglicht, die Bearbeitung der Schleife zu
beenden.
"continue
" ermöglicht, den nächsten Umlauf der Schleife
fortzusetzen.
Tipp | |
---|---|
Die der C-Sprache ähnliche nummerische Wiederholung
(Iteration) kann realisiert werden, indem |
Einige populäre Umgebungsvariablen für den normalen Shell-Befehlsprompt könnten in der Ausführungsumgebung Ihres Skriptes nicht verfügbar ein.
Statt "$USER
" nutzen Sie besser "$(id
-un)
"
Statt "$UID
" nutzen Sie besser "$(id
-u)
"
Statt "$HOME
" nutzen Sie besser "$(getent passwd
"$(id -u)"|cut -d ":" -f 6)
" (dies funktioniert auch für Abschnitt 4.5.2, „Modernes zentralisiertes Systemmanagement“).
Die Shell verarbeitet ein Skript im Prinzip in der folgenden Abfolge:
Die Shell liest eine Zeile.
Die Shell gruppiert Teile der Zeile zu zusammengehörigen Ausdrücken (Token) zusammen, wenn
diese sich innerhalb von "…"
oder '…'
befinden.
Die Shell splittet andere Teile der Zeile in einzelne Ausdrücke (Token) auf, wenn diese wie folgt von einander getrennt sind:
Whitespace-Zeichen: Leerzeichen
Tabulator newline
Metazeichen: < > | ; & ( )
Die Shell prüft jeden Ausdruck auf Schlüsselworte (wenn nicht innerhalb von
"…"
oder '…'
), um deren Verhalten
anzupassen.
Schlüsselwörter sind: if then
elif else fi for in while unless do done case esac
Die Shell expandiert Alias-Befehle (wenn
nicht innerhalb von "…"
oder '…'
).
Die Shell expandiert eine Tilde (wenn
nicht innerhalb von "…"
oder '…'
):
"~
" → Heimatverzeichnis des aktuellen Benutzers
"~benutzer
" → Heimatverzeichnis von
benutzer
Die Shell expandiert Parameter in deren
Wert (wenn nicht innerhalb von '…'
):
Parameter:
"$PARAMETER
" oder "${PARAMETER}
"
Die Shell expandiert Befehlsersetzungen / command
substitutions (wenn nicht innerhalb von '…'
):
"$( befehl )
" → die Ausgabe von
"befehl
"
"` befehl `
" → die Ausgabe von
"befehl
"
Die Shell expandiert Pfadnamenmuster in
die passenden Dateinamen (wenn nicht innerhalb von "…"
oder '…'
):
*
→ jegliche Zeichen (eins oder mehrere)
?
→ irgendein (nur ein) Zeichen
[…]
→ jegliche Zeichen von denen in
"…
"
Die Shell sucht befehl in folgenden Definitionen und führt ihn aus:
Funktions-Definition
Builtin (integrierter Befehl)
ausführbare Datei in
"$PATH
"
Die Shell geht zur nächsten Zeile und wiederholt diesen kompletten Ablauf vom Anfang.
Einfache Anführungszeichen innerhalb von doppelten Anführungszeichen haben keine Wirkung.
Das Ausführen von "set -x
" in der Shell oder das Aufrufen
einer Shell mit der Option "-x
" veranlasst die Shell,
alle ausgeführten Befehle auch auf dem Bildschirm auszugeben. Dies ist sehr
nützlich zur Fehlersuche.
Um Ihr Shell-Programm innerhalb des Debian-Systems möglichst weit portierbar zu machen, ist es eine gute Idee, die zu nutzenden Hilfsprogramme auf diejenigen einzuschränken, welche durch die essential-Pakete bereitgestellt werden:
"aptitude search ~E
" listet alle essential-Pakete auf;
"dpkg -L paketname |grep
'/man/man.*/'
" listet Handbuchseiten (manpages) derjenigen Befehle
auf, die von dem Paket paketname
bereitgestellt werden.
Tabelle 12.7. Liste der Pakete, die kleine Hilfsprogramme für Shell-Skripte enthalten
Paket | Popcon | Größe | Beschreibung |
---|---|---|---|
dash
|
V:884, I:997 | 191 | kleine und schnelle, fast POSIX-kompatible Shell für sh |
coreutils
|
V:880, I:999 | 18307 | Grundlegende GNU-Werkzeuge |
grep
|
V:782, I:999 | 1266 | GNU grep , egrep und
fgrep |
sed
|
V:790, I:999 | 987 | GNU sed |
mawk
|
V:442, I:997 | 285 | kleine und schnelle Alternative zu awk |
debianutils
|
V:907, I:999 | 224 | verschiedene Hilfsprogramme speziell für Debian |
bsdutils
|
V:519, I:999 | 356 | grundlegende Kommandos aus 4.4BSD-Lite |
bsdextrautils
|
V:596, I:713 | 339 | weitere Kommandos aus 4.4BSD-Lite |
moreutils
|
V:15, I:38 | 231 | zusätzliche Unix-Hilfsprogramme |
Tipp | |
---|---|
Obwohl |
Beispiele finden Sie in Abschnitt 1.6, „Unix-ähnliche Textverarbeitung“.
Tabelle 12.8. Liste von Interpreter-betreffenden Paketen
Paket | Popcon | Größe | Dokumentation |
---|---|---|---|
dash
|
V:884, I:997 | 191 | sh: kleine und schnelle POSIX-kompatible Shell für
sh |
bash
|
V:838, I:999 | 7175 | sh: "info bash " aus dem
bash-doc -Paket |
mawk
|
V:442, I:997 | 285 | AWK: kleine und schnelle Alternative zu
awk |
gawk
|
V:285, I:349 | 2906 | AWK: "info gawk " aus dem
gawk-doc -Paket |
perl
|
V:707, I:989 | 673 | Perl: perl (1) bzw. die
HTML-Seiten aus dem perl-doc - oder
perl-doc-html -Paket |
libterm-readline-gnu-perl
|
V:2, I:29 | 380 | Perl-Erweiterung für die GNU ReadLine/History-Bibliothek:
perlsh (1) |
libreply-perl
|
V:0, I:0 | 171 | REPL für Perl: reply (1) |
libdevel-repl-perl
|
V:0, I:0 | 237 | REPL für Perl: re.pl (1) |
python3
|
V:718, I:953 | 81 | Python: python3 (1) bzw. die
HTML-Seiten aus dem python3-doc -Paket |
tcl
|
V:25, I:218 | 21 | Tcl: tcl (3) und detaillierte
Handbuchseiten aus dem tcl-doc -Paket |
tk
|
V:20, I:211 | 21 | Tk: tk (3) und detaillierte
Handbuchseiten aus dem tk-doc -Paket |
ruby
|
V:86, I:208 | 29 | Ruby: ruby (1),
erb (1), irb (1),
rdoc (1), ri (1) |
Wenn Sie auf einem Debian-System eine Aufgabe automatisieren möchten, sollten Sie es zunächst mit einer Interpreter-Sprache versuchen. Eine Richtschnur für die Auswahl der passenden Sprache ist:
Verwenden Sie dash
, wenn die Aufgabe einfach ist und
CLI-Programme mit einem Shell-Programm kombiniert werden.
Verwenden Sie python3
, wenn es keine einfache Aufgabe ist
und Sie alles von Grund auf neu schreiben.
Verwenden Sie perl
, tcl
,
ruby
, ... falls bereits vorhandener Code in einer dieser
Sprachen existiert, der übernommen werden muss, um die Aufgabe erledigen zu
können.
Falls der resultierende Code zu langsam ist, können Sie den kritischen Teil zwecks Ausführung in einer kompilierten Sprache neu schreiben und diesen von der Interpreter-Sprache aus aufrufen.
Die meisten Interpreter bieten eine grundlegende Syntaxprüfung und Funktionalitäten zur Code-Nachverfolgung.
“dash -n script.sh” - Syntaxprüfung eines Shell-Skripts
“dash -x script.sh” - Nachverfolgung (Trace) eines Shell-Skripts
“python -m py_compile script.py” - Syntaxprüfung eines Python-Skripts
“python -mtrace --trace script.py” - Nachverfolgung (Trace) eines Python-Skripts
“perl -I ../libpath -c script.pl” - Syntaxprüfung eines Perl-Skripts
“perl -d:Trace script.pl” - Nachverfolgung (Trace) eines Perl-Skripts
Um Code für dash
zu testen, versuchen Sie Abschnitt 9.1.4, „Readline-Wrapper“, um eine bash
-ähnliche
interaktive Umgebung zu erhalten.
Um Code für perl
zu testen, versuchen Sie eine
REPL-Umgebung für Perl; sie bietet Ihnen eine Python-ähnliche REPL (=READ + EVAL + PRINT +
LOOP)-Umgebung für Perl.
Ein Shell-Skript kann aufgewertet werden, um ein attraktives GUI-Programm zu
erzeugen. Der Trick ist, eines der sogenannten Dialog-Programme zu
verwenden, statt der stumpfen Interaktion über echo
- und
read
-Befehle.
Tabelle 12.9. Liste von Dialog-Programmen
Paket | Popcon | Größe | Beschreibung |
---|---|---|---|
x11-utils
|
V:192, I:566 | 651 | xmessage (1): eine Nachricht oder Abfrage in einem Fenster
anzeigen (X) |
whiptail
|
V:284, I:996 | 56 | nutzerfreundliche Dialogboxen von Shell-Skripten anzeigen (newt) |
dialog
|
V:11, I:99 | 1227 | nutzerfreundliche Dialogboxen von Shell-Skripten anzeigen (ncurses) |
zenity
|
V:76, I:363 | 183 | grafische Dialogboxen von Shell-Skripten anzeigen (GTK) |
ssft
|
V:0, I:0 | 75 | Werkzeug für Shell-Skript-Oberflächen (Aufrufprogramm für zenity, kdialog und dialog mit gettext) |
gettext
|
V:56, I:259 | 5818 | "/usr/bin/gettext.sh ": Meldungen übersetzen |
Hier ein Beispiel für ein GUI-Programm, um zu demonstrieren, wie einfach es sein kann mit nur einem Shell-Skript.
Dieses Skript nutzt zenity
, um eine Datei auszuwählen
(Standardvorwahl ist /etc/motd
) und sie anzuzeigen.
Ein grafischer Starter für dieses Skript kann erstellt werden gemäß Abschnitt 9.4.10, „Ein Programm aus der grafischen Oberfläche heraus starten“.
#!/bin/sh -e # Copyright (C) 2021 Osamu Aoki <osamu@debian.org>, Public Domain # vim:set sw=2 sts=2 et: DATA_FILE=$(zenity --file-selection --filename="/etc/motd" --title="Select a file to check") || \ ( echo "E: File selection error" >&2 ; exit 1 ) # Check size of archive if ( file -ib "$DATA_FILE" | grep -qe '^text/' ) ; then zenity --info --title="Check file: $DATA_FILE" --width 640 --height 400 \ --text="$(head -n 20 "$DATA_FILE")" else zenity --info --title="Check file: $DATA_FILE" --width 640 --height 400 \ --text="The data is MIME=$(file -ib "$DATA_FILE")" fi
Dieser Ansatz eines grafischen Programms mit einem Shell-Skript ist nur für einfache Auswahlen sinnvoll. Wenn Sie komplexere Programme schreiben, sollten Sie die Nutzung von geeigneten Plattformen in Erwägung ziehen.
Grafische Dateimanager können erweitert werden, um einige populäre Aktionen für ausgewählte Dateien ausführen zu können; dazu müssen eventuell zusätzliche Erweiterunspakete installiert werden. Auch können spezielle eigene Aktionen ausführt werden, indem Sie selbst erstellte Skripte hinzufügen.
Für GNOME lesen Sie dazu NautilusScriptsHowto.
Für KDE finden Sie weitere Details in Creating Dolphin Service Menus.
Für Xfce sollten Sie Thunar - Custom Actions und https://help.ubuntu.com/community/ThunarCustomActions besuchen.
Für LXDE schauen Sie unter Custom Actions.
Um Prozessdaten zu verarbeiten, muss sh
Unterprozesse
generieren, um cut
, grep
,
sed
usw. aufrufen zu können; und es ist langsam. Auf der
anderen Seite enthält perl
interne Funktionalitäten zur
Verarbeitung von Prozessdaten, und es ist schnell. Daher nutzen viele
Wartungsskripte in Debian perl
.
Denken wir an folgendes einzeilige AWK-Skript und sein Äquivalent in Perl:
awk '($2=="1957") { print $3 }' |
Es ist äquivalent zu jeder der folgenden Zeilen:
perl -ne '@f=split; if ($f[1] eq "1957") { print "$f[2]\n"}' |
perl -ne 'if ((@f=split)[1] eq "1957") { print "$f[2]\n"}' |
perl -ne '@f=split; print $f[2] if ( $f[1]==1957 )' |
perl -lane 'print $F[2] if $F[1] eq "1957"' |
perl -lane 'print$F[2]if$F[1]eq+1957' |
Das letzte ist eine Knobelaufgabe. Es nutzt die Vorteile folgender Perl-Funktionen:
Der Whitespace ist optional.
Es existiert eine automatische Konvertierung von Zahlen zu Zeichenketten.
Perl's Befehlsausführungstricks über Befehlszeilen-Optionen:
perlrun
(1)
Perl's spezielle Variablen: perlvar
(1)
Diese Flexibilität ist die Stärke von Perl. Gleichzeitig erlaubt sie aber auch die Erstellung von kryptischem und verwinkeltem Code. Seien Sie vorsichtig.
Tabelle 12.10. Liste von Compiler-betreffenden Paketen
Paket | Popcon | Größe | Beschreibung |
---|---|---|---|
gcc
|
V:167, I:550 | 36 | GNU-C-Compiler |
libc6-dev
|
V:248, I:567 | 12053 | GNU-C-Bibliothek: Entwicklungsbibliotheken und Header-Dateien |
g++
|
V:56, I:501 | 13 | GNU-C++-Compiler |
libstdc++-10-dev
|
V:14, I:165 | 17537 | GNU Standard-C++-Bibliothek Version 3 (Entwicklungsdateien) |
cpp
|
V:334, I:727 | 18 | GNU-C-Preprozessor |
gettext
|
V:56, I:259 | 5818 | GNU-Werkzeuge für die Internationalisierung |
glade
|
V:0, I:5 | 1204 | Builder für die GTK-Bedienoberfläche |
valac
|
V:0, I:4 | 725 | C#-ähnliche Sprache für das GObject-System |
flex
|
V:7, I:73 | 1243 | LEX-kompatibler schneller lexikalischer Analysegenerator |
bison
|
V:7, I:80 | 3116 | YACC-kompatibler Parser-Generator |
susv2
|
I:0 | 16 | die "Single UNIX Specifications v2" |
susv3
|
I:0 | 16 | die "Single UNIX Specifications v3" |
susv4
|
I:0 | 16 | die "Single UNIX Specifications v4" |
golang
|
I:20 | 11 | Compiler für die Programmiersprache Go |
rustc
|
V:3, I:14 | 8860 | Rust System-Programmiersprache |
haskell-platform
|
I:1 | 12 | Standard-Haskell-Bibliothek und zugehörige Werkzeuge |
gfortran
|
V:6, I:62 | 15 | GNU-Fortran-95-Compiler |
fpc
|
I:2 | 103 | Free Pascal |
Hierbei sind flex (siehe Abschnitt 12.3.3, „Flex - ein besseres Lex“) und bison (siehe Abschnitt 12.3.4, „Bison - ein besseres Yacc“) mit aufgeführt, um zu zeigen, wie Compiler-ähnliche Programme in der Sprache C erstellt werden können, indem höherwertige Beschreibungssprachen in C kompiliert werden.
Sie können wie folgt eine korrekte Umgebung zum Kompilieren von in der C-Programmiersprache geschriebenen Programmen einrichten:
# apt-get install glibc-doc manpages-dev libc6-dev gcc build-essential
Das Paket libc6-dev
(d.h. die GNU-C-Bibliothek) bietet
als C-Standard-Bibliothek eine
Sammlung von Header-Dateien und Bibliotheksroutinen, die von der C-Sprache
genutzt werden.
Referenzen für C finden Sie über:
"info libc
" (Referenz für Funktionen der C-Bibliothek)
gcc
(1) und "info gcc
"
jeglicher_funktionsname_aus_der_c_bibliothek
(3)
Kernighan & Ritchie, "The C Programming Language", 2. Ausgabe (Prentice Hall)
Hier ein einfaches Beispiel zum Kompilieren von
"example.c
" mit der Bibliothek "libm
"
in eine ausführbare Datei "run_example
":
$ 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); /* prevent buffer overflow */ y[10] = '\0'; /* fill to make sure string ends with '\0' */ printf("%5i, %5.3f, %10s, %10s\n", argc, x, y, argv[1]); return 0; } EOF $ gcc -Wall -g -o run_example example.c -lm $ ./run_example 1, 2.915, ./run_exam, (null) $ ./run_example 1234567890qwerty 2, 3.082, ./run_exam, 1234567890qwerty
Hierbei wird "-lm
" benötigt, um die Bibliothek
"/usr/lib/libm.so
" aus dem libc6
-Paket
für sqrt
(3) zu verlinken. Die eigentliche Bibliothek
liegt in "/lib/
" und hat den Dateinamen
"libm.so.6
", was ein symbolischer Link auf
"libm-2.7.so
" ist.
Schauen Sie sich den letzten Parameter im ausgegebenen Text an. Dort werden
mehr als 10 Zeichen ausgegeben, obwohl "%10s
" angegeben
wurde.
Die Verwendung von Funktionen, die Zeiger auf Speicherbereiche ohne
Bereichsüberprüfung nutzen (wie sprintf
(3) und
strcpy
(3)), wird missbilligt, um das Ausnutzen von
Pufferüberläufen zu verhindern, die obige Überlaufeffekte in Gang
bringen. Verwenden Sie stattdessen snprintf
(3) und
strncpy
(3).
Flex ist ein Lex-kompatibler schneller lexikalischer Analysegenerator.
Eine Einführung zu flex
(1) finden Sie in "info
flex
".
Many simple examples can be found under
"/usr/share/doc/flex/examples/
". [7]
Einige Pakete stellen Yacc-kompatible LR-Parser- oder LALR-Parser-Generatoren in Debian bereit:
Eine Einführung zu bison
(1) finden Sie in "info
bison
".
Sie müssen Ihre eigenen "main()
"- und
"yyerror()
"-Funktionen
bereitstellen. "main()
" ruft
"yyparse()
" auf, das wiederum
"yylex()
" aufruft, was gewöhnlich von FleX erzeugt wird.
Here is an example to create a simple terminal calculator program.
Let's create example.y
:
/* calculator source for bison */ %{ #include <stdio.h> extern int yylex(void); extern int yyerror(char *); %} /* declare tokens */ %token NUMBER %token OP_ADD OP_SUB OP_MUL OP_RGT OP_LFT OP_EQU %% calc: | calc exp OP_EQU { printf("Y: RESULT = %d\n", $2); } ; exp: factor | exp OP_ADD factor { $$ = $1 + $3; } | exp OP_SUB factor { $$ = $1 - $3; } ; factor: term | factor OP_MUL term { $$ = $1 * $3; } ; term: NUMBER | OP_LFT exp OP_RGT { $$ = $2; } ; %% int main(int argc, char **argv) { yyparse(); } int yyerror(char *s) { fprintf(stderr, "error: '%s'\n", s); }
Let's create, example.l
:
/* calculator source for flex */ %{ #include "example.tab.h" %} %% [0-9]+ { printf("L: NUMBER = %s\n", yytext); yylval = atoi(yytext); return NUMBER; } "+" { printf("L: OP_ADD\n"); return OP_ADD; } "-" { printf("L: OP_SUB\n"); return OP_SUB; } "*" { printf("L: OP_MUL\n"); return OP_MUL; } "(" { printf("L: OP_LFT\n"); return OP_LFT; } ")" { printf("L: OP_RGT\n"); return OP_RGT; } "=" { printf("L: OP_EQU\n"); return OP_EQU; } "exit" { printf("L: exit\n"); return YYEOF; } /* YYEOF = 0 */ . { /* ignore all other */ } %%
Then execute as follows from the shell prompt to try this:
$ bison -d example.y $ flex example.l $ gcc -lfl example.tab.c lex.yy.c -o example $ ./example 1 + 2 * ( 3 + 1 ) = L: NUMBER = 1 L: OP_ADD L: NUMBER = 2 L: OP_MUL L: OP_LFT L: NUMBER = 3 L: OP_ADD L: NUMBER = 1 L: OP_RGT L: OP_EQU Y: RESULT = 9 exit L: exit
Lint-ähnliche Werkzeuge können bei der automatisierten statischen Code-Analyse helfen.
Werkzeuge wie Indent können Menschen bei Code-Überprüfungen helfen, indem Quellcode einheitlich formatiert wird.
Ctags-ähnliche Werkzeuge können Menschen bei Code-Überprüfungen helfen, indem eine Index- (oder Tag-)Datei mit im Quellcode gefundenen Namen erzeugt wird.
Tipp | |
---|---|
Konfigurieren Sie Ihren Lieblingseditor (z.B. |
Tabelle 12.12. Liste von Werkzeugen für die statische Code-Analyse
Paket | Popcon | Größe | Beschreibung |
---|---|---|---|
vim-ale
|
I:0 | 2591 | Asynchrone Lint-Engine für Vim 8 und NeoVim |
vim-syntastic
|
I:3 | 1379 | Syntaxprüfungen für Vim |
elpa-flycheck
|
V:0, I:1 | 808 | moderne on-the-fly Syntaxprüfung für Emacs |
elpa-relint
|
V:0, I:0 | 147 | Fehlersuche mittels Regexp für Emacs-Lisp-Dateien |
cppcheck-gui
|
V:0, I:1 | 7224 | Werkzeug für die statische C/C++-Code-Analyse (GUI) |
shellcheck
|
V:2, I:13 | 18987 | Lint-Werkzeug für Shell-Skripte |
pyflakes3
|
V:2, I:15 | 20 | passive Prüfung von Python3-Programmen |
pylint
|
V:4, I:20 | 2018 | Statisches Prüfprogramm für Python-Code |
perl
|
V:707, I:989 | 673 | Interpreter mit internem statischen Code-Prüfmechanismus:
B::Lint (3perl) |
rubocop
|
V:0, I:0 | 3247 | statischer Code-Analyser für Ruby |
clang-tidy
|
V:2, I:11 | 21 | clang-basiertes C++-Linter-Werkzeug |
splint
|
V:0, I:2 | 2320 | Werkzeug zur statischen Überprüfung von C-Programmen auf Programmfehler |
flawfinder
|
V:0, I:0 | 205 | Werkzeug zur Durchsuchung von Quellcode auf Sicherheitsschwächen |
black
|
V:3, I:13 | 660 | kompromissloser Python-Code-Formatierer |
perltidy
|
V:0, I:4 | 2493 | Einrücker und Neuformatierer für Perl-Skripte |
indent
|
V:0, I:7 | 431 | Code-Formatierer für C |
astyle
|
V:0, I:2 | 785 | Quelltextformatierer für C, C++, Objective-C, C# und Java |
bcpp
|
V:0, I:0 | 111 | C(++)-Code schön machen |
xmlindent
|
V:0, I:1 | 53 | Neuformatierung von XML-Datenströmen |
global
|
V:0, I:2 | 1908 | Werkzeuge zum Suchen und Browsen in Quelltext |
exuberant-ctags
|
V:2, I:20 | 341 | Erzeugen von Indexdateien aus Quelltextdefinitionen |
universal-ctags
|
V:1, I:11 | 3386 | Erzeugen von Indexdateien aus Quelltextdefinitionen |
Debugging ist ein wichtiger Teil der Programmieraktivitäten. Das Wissen darüber, wie man in Programmen einen Fehler sucht, macht Sie zu einem guten Debian-Nutzer, der aussagekräftige Fehlerberichte erstellen kann.
Das primäre Programm zur Fehlersuche
(Debugger) im Debian-System ist gdb
(1), welches
Ihnen erlaubt, ein Programm zu inspizieren, während es läuft.
Wir installieren gdb
und zugehörige Programme wie folgt:
# apt-get install gdb gdb-doc build-essential devscripts
Gute Einführungen zu gdb
finden Sie unter:
“info gdb
”
“Debugging with GDB” in
/usr/share/doc/gdb-doc/html/gdb/index.html
Hier ein einfaches Beispiel zur Verwendung von gdb
(1) bei
einem Programm namens "program
", kompiliert mit der
Option "-g
", um Debugging-Informationen auszugeben.
$ gdb program (gdb) b 1 # set break point at line 1 (gdb) run args # run program with args (gdb) next # next line ... (gdb) step # step forward ... (gdb) p parm # print parm ... (gdb) p parm=12 # set value to 12 ... (gdb) quit
Tipp | |
---|---|
Viele |
Da installierte Binärdateien auf einem Debian-System normalerweise nicht
unnötig aufgebläht sein sollten, werden Debugging-Symbole in normalen
Paketen meistens entfernt. Um bei solchen Paketen Debugging mit
gdb
(1) durchführen zu können, müssen
*-dbgsym
-Pakete installiert werden
(z.B. coreutils-dbgsym
für das
coreutils
-Paket). Die Quellpakete erzeugen diese
*-dbgsym
-Debug-Pakete automatisch mit den normalen
Binärpaketen und sie werden in dem separaten Archiv debian-debug abgelegt. Bitte lesen Sie die
entsprechenden Artikel im Debian
Wiki, wenn Sie weitere Informationen benötigen.
Falls ein Paket, bei dem eine Fehlersuche durchgeführt werden soll, kein
*-dbgsym
-Paket anbietet, müssen Sie es händisch neu bauen
und dann installieren, wie hier:
$ mkdir /path/new ; cd /path/new $ sudo apt-get update $ sudo apt-get dist-upgrade $ sudo apt-get install fakeroot devscripts build-essential $ apt-get source package_name $ cd package_name* $ sudo apt-get build-dep ./
Beheben Sie die Fehler, falls erforderlich.
Erhöhen Sie die Paketversion auf eine Versionsnummer, die nicht mit
offiziellen Debian-Versionen kollidiert (Sie können z.B. ein
"+debug1
" anhängen, wenn Sie eine existierende
Paketversion neu kompilieren, oder Sie hängen "~pre1
" an,
wenn Sie eine noch nicht veröffentlichte Paketversion selbst
kompilieren). Verwenden Sie dazu:
$ dch -i
Kompilieren und installieren Sie ein Paket mit Debugging-Symbolen wie folgt:
$ export DEB_BUILD_OPTIONS="nostrip noopt" $ debuild $ cd .. $ sudo debi package_name*.changes
Sie müssen die Build-Skripte des Pakets überprüfen und sicherstellen, dass
"CFLAGS=-g -Wall
" zum Kompilieren der Binärdateien
verwendet wird.
Wenn Sie einen Programmabsturz erlitten haben, ist es eine gute Idee, einen Fehlerbericht einzureichen und an diesen zusätzliche Backtrace-Informationen (Daten zur Rückverfolgung von Vorgängen in Programmen zwecks Fehleranalyse) anzuhängen, die Sie mittels Kopieren-und-Einfügen erhalten.
Solche Backtrace-Informationen lassen sich mittels gdb
(1)
über einen der folgenden Ansätze gewinnen:
der Ansatz "Absturz in GDB":
ein Programm über GDB starten
einen Absturz des Programms herbeiführen
"bt
" am GDB-Prompt eingeben
der Ansatz "Zunächst den Absturz herbeiführen":
Aktualisieren der Datei “/etc/security/limits.conf”, so dass sie folgendes enthält:
* soft core unlimited
Eingabe von "ulimit -c unlimited
" in der Shell
Aufruf des Programms aus dieser Shell
einen Absturz des Programms herbeiführen, um eine Dump-Datei zu erzeugen
Laden der Dump-Datei in GDB mit
"gdb gdb ./program_binary core
"
"bt
" am GDB-Prompt eingeben
Im Falle einer Endlosschleife oder bei eingefrorener Tastatur können Sie
einen Absturz des Programms mit Strg-\
oder
Strg-C
herbeiführen, oder indem Sie “kill -ABRT
PID
” ausführen (Näheres dazu in Abschnitt 9.4.12, „Einen Prozess beenden (kill)“).
Tipp | |
---|---|
Oft stellt man fest, dass in den Backtrace-Informationen eine oder mehrere
der ersten Zeilen " $ MALLOC_CHECK_=2 gdb hello |
Tabelle 12.14. Liste erweiterter gdb-Befehle
Befehl | Beschreibung |
---|---|
(gdb) thread apply all bt |
Backtrace für alle Threads eines Multi-Thread-Programms auslesen |
(gdb) bt full |
Parameter auslesen, die auf dem Aufruf-Stack der Funktionsaufrufe aufgelaufen sind |
(gdb) thread apply all bt full |
Backtrace und Parameter als Kombination der vorangegangenen Optionen auslesen |
(gdb) thread apply all bt full 10 |
Backtrace und Parameter für die ersten 10 Aufrufe auslesen, um irrelevante Ausgaben abzuschneiden |
(gdb) set logging on |
Protokoll der Ausgabe von gdb in eine Datei schreiben
(Standard ist "gdb.txt ") |
Verwenden Sie ldd
(1) wie hier, um zu ermitteln, von
welchen Bibliotheken ein Programm abhängt:
$ ldd /usr/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
(1) in einer "chroot"-Umgebung funktioniert,
müssen die obigen Bibliotheken in der "chroot"-Umgebung vorhanden sein.
Lesen Sie dazu Abschnitt 9.4.6, „Programmaktivitäten verfolgen“.
Es gibt verschiedene Werkzeuge zur dynamischen Aufrufverfolgung in Debian. Schauen Sie in Abschnitt 9.4, „Überwachen, Steuern und Starten von Programmaktivitäten“.
Wenn ein GNOME-Programm preview1
einen X-Fehler empfangen
hat, sollten Sie eine Meldung wie diese sehen:
The program 'preview1' received an X Window System error.
Sollte dies der Fall sein, können Sie versuchen, das Programm mit der Option
"--sync
" zu starten und einen Haltepunkt für die Funktion
"gdk_x_error
" zu setzen, um einen Backtrace zu bekommen.
Es gibt verschiedene Werkzeuge zur Erkennung von Speicherlecks in Debian:
Tabelle 12.15. Liste von Werkzeugen zur Erkennung von Speicherlecks
Paket | Popcon | Größe | Beschreibung |
---|---|---|---|
libc6-dev
|
V:248, I:567 | 12053 | mtrace (1): malloc-Debugging-Funktionalität in glibc |
valgrind
|
V:6, I:37 | 78191 | Speicher-Debugging- und Analyse-Programm |
electric-fence
|
V:0, I:3 | 73 | malloc (3)-Debugging-Programm |
libdmalloc5
|
V:0, I:2 | 390 | Bibliothek zur Fehlersuche bei Speicherzuweisungen |
duma
|
V:0, I:0 | 296 | Bibliothek zur Detektierung von Pufferüber- oder -unterläufen in C- und C++-Programmen |
leaktracer
|
V:0, I:1 | 56 | Werkzeug zur Verfolgung von Speicherlecks in C++-Programmen |
Tabelle 12.16. Liste von Paketen mit Bauwerkzeugen
Paket | Popcon | Größe | Dokumentation |
---|---|---|---|
make
|
V:151, I:555 | 1592 | "info make " aus dem make-doc -Paket |
autoconf
|
V:31, I:230 | 2025 | "info autoconf " aus dem
autoconf-doc -Paket |
automake
|
V:30, I:228 | 1837 | "info automake " aus dem
automake1.10-doc -Paket |
libtool
|
V:25, I:212 | 1213 | "info libtool " aus dem
libtool-doc -Paket |
cmake
|
V:17, I:115 | 36607 | cmake (1) - plattformübergreifendes, quelloffenes
Make-System |
ninja-build
|
V:6, I:41 | 428 | ninja (1) - kleines Bausystem nah am Geiste von Make |
meson
|
V:3, I:22 | 3759 | meson (1) - hochproduktives Bausystem, aufbauend auf
ninja |
xutils-dev
|
V:0, I:9 | 1484 | imake (1), xmkmf (1) usw. |
Make ist ein Werkzeug, um Gruppen von Programmen
zu betreuen. Bei Ausführung des Befehls make
(1) liest
make
die Regeldatei "Makefile
" und
aktualisiert ein Ziel (Target), falls sich Dateien, von denen das Makefile
abhängt, seit der letzten Modifizierung des Targets verändert haben oder
falls das Target nicht existiert. Die Ausführungen dieser Aktualisierungen
können zeitgleich erfolgen.
Die Syntax der Regeldatei ist folgende:
target: [ prerequisites ... ] [TAB] command1 [TAB] -command2 # ignore errors [TAB] @command3 # suppress echoing
Hierbei ist "[TAB]
" ein TAB-Code. Jede Zeile wird nach
Ersetzung der Variablen durch die Shell interpretiert. Verwenden Sie
"\
" am Ende einer Zeile, um den Befehl in der nächsten
Zeile fortzusetzen. Zur Angabe von Umgebungsvariablen müssen Sie statt
"$
" hier "$$
" schreiben.
Implizite Regeln für das Target und Voraussetzungen können z.B. wie folgt angegeben werden:
%.o: %.c header.h
Hier enthält das Target das Zeichen "%
" (exakt eines
davon). Das "%
" passt auf jeden nicht leeren Teil-String
in den eigentlichen Dateinamen des Targets. Auch die Voraussetzungen nutzen
auf ähnliche Art ein "%
", um den Bezug zum Namen des
Targets anzuzeigen.
Tabelle 12.17. Liste von automatischen make-Variablen
automatische Variable | Wert |
---|---|
$@ |
Ziel |
$< |
erste Voraussetzung |
$? |
alle neueren Voraussetzungen |
$^ |
alle Voraussetzungen |
$* |
"% " trifft auf den Stamm im Target-Muster zu |
Tabelle 12.18. Liste von make-Variablenexpandierungen
Variablenexpandierung | Beschreibung |
---|---|
foo1 := bar |
einmalige Expandierung |
foo2 = bar |
rekursive Expandierung |
foo3 += bar |
anhängen |
Führen Sie "make -p -f/dev/null
" aus, um alle internen
automatischen Regeln zu sehen.
Autotools ist eine Sammlung von Programmierwerkzeugen, entwickelt, um dabei zu helfen, Quellcode-Pakete auf viele Unix-artige Systeme portierbar zu machen.
Autoconf ist ein Werkzeug, das ein
"configure
"-Shell-Skript aus einer
"configure.ac
"-Datei erzeugt.
"configure
" wird dann später verwendet, um aus der
Vorlage "Makefile.in
" die
"Makefile
"-Datei zu generieren.
Automake erstellt aus einer
"Makefile.am
" eine "Makefile.in
".
Libtool ist ein Shell-Skript für die Problematik der Portabilität beim Kompilieren dynamischer Bibliotheken aus Quellcode.
Warnung | |
---|---|
Überschreiben Sie keine Systemdateien, wenn Sie Ihre selbst kompilierten Programme installieren. |
Debian verändert keine Dateien unter "/usr/local/
" oder
"/opt
". Wenn Sie also ein Programm aus den Quellen
kompilieren, sollten Sie es in "/usr/local/
"
installieren, damit es nicht mit Debian kollidiert.
$ cd src $ ./configure --prefix=/usr/local $ make # this compiles program $ sudo make install # this installs the files in the system
Wenn Sie noch den Original-Quellcode haben, dieser
autoconf
(1)/automake
(1) nutzt und Sie
noch wissen, wie Sie es konfiguriert haben, verfahren Sie wie folgt, um das
Programm zu deinstallieren:
$ ./configure all-of-the-options-you-gave-it
$ sudo make uninstall
Wenn Sie sich absolut sicher sind, dass der Installationsprozess Dateien nur
unter "/usr/local/
" abgelegt hat und und es nichts
Wichtiges mehr dort gibt, können Sie alternativ auch alles löschen, wie
hier:
# find /usr/local -type f -print0 | xargs -0 rm -f
Falls Sie nicht sicher sind, wo die Dateien installiert sind, sollten Sie
einen Blick auf checkinstall
(8) aus dem
checkinstall
-Paket werfen, das einen leeren Pfad für die
Deinstallation liefert. Es unterstützt jetzt auch die Erzeugung eines
Debian-Pakets mit der Option "-D
".
Das Software-Bausystem hat sich weiterentwickelt:
Autotools als Aufsatz für Make war seit den 1990'ern der De-Facto-Standard für portable Bauinfrastruktur. Es ist sehr langsam.
CMake initially released in 2000 improved speed significantly but was originally built on the top of inherently slow Make. (Now Ninja can be its backend.)
Ninja initially released in 2012 is meant to replace Make for the further improved build speed and is designed to have its input files generated by a higher-level build system.
Meson - erstmals veröffentlicht 2013 - ist das neue populäre und schnelle, hochwertige Bausystem; es verwendet Ninja als Backend.
Sie finden Dokumente hierzu unter "The Meson Build system" and "The Ninja build system".
Einfache interaktive dynamische Webseiten können wie folgt erstellt werden:
Abfragen werden mittels HTML-Formularen dem Browser-Nutzer präsentiert.
Das Ausfüllen und Anklicken von Formulareinträgen sendet einen URL-String mit kodierten Parametern vom Browser zum Webserver:
"https://www.foo.dom/cgi-bin/program.pl?WERT1=WERT1&WERT2=WERT2&WERT3=WERT3
"
"https://www.foo.dom/cgi-bin/program.py?VAR1=WERT1&VAR2=WERT2&VAR3=WERT3
"
"https://www.foo.dom/program.php?VAR1=WERT1&VAR2=WERT2&VAR3=WERT3
"
"%nn
" in einer URL wird durch ein Zeichen mit
hexadezimalem nn
-Wert ersetzt.
Die Umgebungsvariable wird gesetzt als: "ABFRAGE_STRING="VAR1=WERT1
VAR2=WERT2 VAR3=WERT3"
".
Ein CGI-Programm (irgendeines von
"program.*
") auf dem Webserver führt sich selbst mit der
Umgebungsvariable "$ABFRAGE_STRING
" aus.
Die Standardausgabe (stdout
) eines CGI-Programms wird zum
Webbrowser gesandt und dort als interaktive dynamische Webseite angezeigt.
Aus Sicherheitsgründen wird empfohlen, keinen eigenen zusammengebastelten Code zum Parsen von CGI-Parametern zu verwenden. Es gibt dafür etablierte Module in Perl und Python. PHP unterstützt diese Funktionalitäten. Wenn eine Speicherung der Daten auf dem Client nötig ist, werden HTTP-Cookies verwendet. Ist eine Verarbeitung der Daten auf dem Client erforderlich, wird häufig Javascript genutzt.
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 der kodierten URL https://www.google.com/search?hl=en&ie=UTF-8&q=CGI+tutorial direkt in der Adresszeile des Browsers ist eine gute Möglichkeit, das CGI-Skript auf dem Google-Server in Aktion zu beobachten.
Es gibt verschiedene Programme zur Übersetzung von Quellcode:
Tabelle 12.19. Liste von Programmen zur Übersetzung von Quellcode
Paket | Popcon | Größe | Schlüsselwort | Beschreibung |
---|---|---|---|---|
perl
|
V:707, I:989 | 673 | AWK → PERL | Quellcode von AWK nach PERL konvertieren: a2p (1) |
f2c
|
V:0, I:3 | 442 | FORTRAN → C | Quellcode von FORTRAN 77 nach C/C++ konvertieren: f2c (1) |
intel2gas
|
V:0, I:0 | 178 | intel → gas | Konvertierer von NASM (Intel-Format) nach GNU Assembler (GAS) |
Wenn Sie ein Debian-Paket erstellen möchten, lesen Sie folgendes:
Kapitel 2, Debian-Paketmanagement, um die Grundlagen des Paketsystems zu verstehen;
Abschnitt 2.7.13, „Ein Paket auf das Stable-System portieren“, um den grundlegenden Portierungsprozess zu verstehen;
Abschnitt 9.11.4, „Chroot-System“, um die grundlegenden chroot-Techniken zu verstehen;
debuild
(1) und sbuild
(1)
Abschnitt 12.5.2, „Fehlersuche (Debugging) in einem Debian-Paket“ für Informationen zum Rekompilieren von Quellcode zwecks Fehlersuche (Debugging);
Handbuch für
Debian-Paketbetreuer (aus dem debmake-doc
-Paket).
Debian-Entwicklerreferenz
(aus dem developers-reference
-Paket);
Debian Policy-Handbuch (aus dem
debian-policy
-Paket);
Es gibt auch Pakete wie debmake
,
dh-make
, dh-make-perl
usw., die beim
Paketieren helfen.