From 22b4e0ea46fc6f8f04e045ac5469d045dff43e9e Mon Sep 17 00:00:00 2001 From: "Hans J. Koch" Date: Fri, 19 Jun 2009 01:34:07 +0200 Subject: Completed linux-basics/boot-process/handout_boot-process_de.tex --- .../boot-process/handout_boot-process_de.tex | 150 ++++++++++++++++++++- 1 file changed, 144 insertions(+), 6 deletions(-) (limited to 'linux-basics') diff --git a/linux-basics/boot-process/handout_boot-process_de.tex b/linux-basics/boot-process/handout_boot-process_de.tex index 4c391b2..7f39dc7 100644 --- a/linux-basics/boot-process/handout_boot-process_de.tex +++ b/linux-basics/boot-process/handout_boot-process_de.tex @@ -1,17 +1,155 @@ -\documentclass{article} +\documentclass{lxarticle} \usepackage{german} \usepackage[utf8]{inputenc} +\usepackage{lxheaders} +\usepackage{lxextras} \begin{document} -\section*{Titel} +\section*{Der Linux-Boot-Prozess} -\subsection*{Abschnitt1} +\subsection*{Aufgaben des Bootloaders} -Text +Hauptaufgabe des Bootloaders ist die rudimentäre Initialisierung der +Hardware, so dass mindestens das RAM benutzt werden kann. Dazu ist auf den +meisten Boards die Initialisierung eines (S)DRAM-Controllers erforderlich. -\subsection*{Abschnitt2} +Soll das Board aus einem NAND-Flash booten können, so muss auch dessen +Controller initialisiert werden. -Text +Viele Prozessoren beinhalten PLLs, die aus dem Prozessortakt andere Clocks +für verschiedene Peripherie-Einheiten generieren. Auch diese müssen +initialisiert werden. + +Anschließend müssen die Peripherie-Einheiten initialisiert werden, die +der Bootloader benötigt, um den Kernel laden zu können. Für TFTP-Boot wäre +dies beispielsweise der Netzwerk-Chip. + +Meist ist es auch erwünscht, dass der Bootloader eine serielle Schnittstelle +initialisiert. Dies ermöglicht nicht nur hilfreiche Meldungen aus dem +Bootloader, es ermöglicht auch dem Kernel bereits im frühen Stadium des +Bootvorgangs die Ausgabe von Meldungen (und nicht erst nach dem Laden seines +UART-Treibers und der Konsole). Viele Bootloader bieten ausserdem eine Art +Monitorprogramm, mit dem man mit Hilfe eines Terminalprogramms interaktiv +Einstellungen ändern oder Speicher lesen und schreiben kann. + +Nach erfolgreicher Initialisierung lädt der Bootloader von der gewählten +Quelle das komprimierte Kernel-Image ins RAM. Am Anfang eines komprimierten +zImage steht (natürlich unkomprimiert) der Dekompressor-Code. Der Bootloader +springt diese Adresse an und hat damit seine Arbeit beendet. Alles weitere +läuft im Kernel ab. + +\subsection*{Gängige Bootloader} + +Die Wahl des Bootloaders ist weitgehend eine Geschmacksfrage. Die +verbreiteten Bootloader U-Boot und Redboot bieten im Wesentlichen die gleiche +Funktionalität. Die Bedienung unterscheidet sich zwar deutlich, aber der +ohnehin nötige Einarbeitungsaufwand dürfte bei beiden etwa gleich sein. + +Auch beim Kompilieren dieser Bootloader sind die Unterschiede nicht gross. +Beide zeichnen sich durch schwer durchschaubaren Sourcecode und ein +eigenwilliges Buildsystem aus. + +Es gibt aber auch die Möglichkeit, ganz auf einen derartigen Bootloader zu +verzichten. Statt dessen verwendet man einen minimalen \emph{Initial Program +Loader (IPL)}, der lediglich die rudimentären Initialisierungsaufgaben +erfüllt und danach einen minimalen Bootkernel lädt und ausführt. Dieser +lädt wiederum den eigentlichen Produktiv-Kernel nach. + +Vorteile der letztgenannten Vorgehensweise sind hohe Flexibilität und die +Tatsache, dass man im Bootkernel schon nach wenigen hundert Millisekunden +jeden gewünschten Treiber zur Verfügung hat. Dadurch können in elegante +Weise Anforderungen wie das Anzeigen eines Bildes auf einem TFT (500 +Millisekunden nach dem Einschalten) gelöst werden. Wollte man dies mit +einem der oben erwähnten Bootloader erreichen, müsste man zunächst die +für das TFT benötigten Treiber vom Kernel in den Bootloader portieren und +dort zum Laufen bringen. Ähnliches gilt für andere gängige Forderungen, +wie das Booten von einem USB-Stick. + +Es erscheint als überflüssige Mühe, einen im Kernel bereits +funktionierenden Treiber in den Bootloader portieren zu müssen. Mit IPL und +Bootkernel sind ausserdem komplexe Aufgaben während des Bootvorgangs, +beispielsweise automatisierte und sichere Firmware-Updates leicht +realisierbar. + +\subsection*{Bootprobleme: Im Bootloader} + +Während der Entwicklungsphase sind Probleme im Bootloader besonders +unangenehm. Falls dieser bereits abstürzt, ehe er die serielle Schnittstelle +initialisieren konnte, so sieht man schlichtweg gar nichts. Aber auch bei +späteren Fehlern ist der Entwicklungszyklus mühsam, da man den Bootloader +meist erst mit einem JTAG-Adapter oder ähnlichen Werkzeugen ins Flash des +Boards befördern muss, bevor man den nächsten Versuch machen kann. Bei +Änderungen am Bootloader-Code ist daher große Sorgfalt geboten. Wenn möglich, +sollte man zu zweit an solchem Code arbeiten und sich ständig gegenseitig +kontrollieren. + +Häufige Problemquellen im Bootloader sind beispielsweise: + +\begin{itemize} +\item Der Bootloader wurde nicht korrekt ins Flash geschrieben. In einem Fall + passierte dies beispielsweise, wenn der Compiler ein Binary mit + ungerader Länge erzeugte. Aber auch falsche Konfiguration des JTAGer + kann zu solchen Problemen führen. +\item Im Bootloader wurden die Timings für Bus-Schnittstellen wie RAM oder + Flash nicht korrekt eingestellt. Gerade wenn die Timings nicht ganz + falsch, sondern nur grenzwertig sind, kann es zu schwer + reproduzierbaren Bootproblemen kommen. +\item Die Ladeadresse für den Kernel ist nicht korrekt. Bei manchen + Bootloadern kann es leicht zu Verwechslungen zwischen physikalischen + und virtuellen Adressen kommen. Weder U-Boot noch Redboot melden + einen Fehler, wenn man den Kernel an eine Adresse lädt, an der + sich überhaupt kein RAM befindet... +\item Beim Laden des Kernels per TFTP kann es zusätzlich weitere Probleme + geben, die mit dem Netzwerk zusammenhängen. Diese reichen von falsch + aufgesetzten TFTP-Servern über falsch konfigurierte DHCP-Server oder + falschen IP-Adressen bis hin zu Treiber- oder Hardware-Problemen. +\end{itemize} + +\subsection*{Bootprobleme: Im Kernel} + +Bootprobleme im Kernel sind vergleichsweise einfach zu finden, sobald man +eine Konsole auf der seriellen Schnittstelle hat. Der Kernel gibt meist recht +aussagekräftige Fehlermeldungen und bietet viele zusätzliche Debug-Funktionen, +die man in der Kernel-Konfiguration aktivieren kann. Falls sich der Kernel +bereits früher aufhängt, so dass man nach der Meldung + +\cmd{Uncompressing Linux.....} + +überhaupt nichts mehr sieht, dann wird es schwieriger. Man sollte zunächst +überprüfen, ob die im Bootloader vorgegebene Commandline für den Kernel +korrekt ist, insbesondere die Einstellung der für die Konsole verwendeten +seriellen Schnittstelle (\cmd{console=tty...}). + +Ein weiteres gängiges Problem ist, dass der Kernel am Ende des Bootvorgangs +kein Root-Filesystem mounten kann. Dies kann daran liegen, dass man bei der +Kernelkonfiguration vergessen hat, dass \emph{alle} für das Rootfs nötigen +Hardware- und Dateisystem-Treiber in den Kernel einkompiliert sein müssen +und nicht etwa als Module gebaut wurden. Bei Medien, die erst detektiert +werden müssen (z.B. SD-Karten) kann es passieren, dass das Medium noch nicht +bereit ist, wenn der Kernel es mounten will. In diesem Fall hilft der +Parameter \cmd{rootwait}. + +Falls der Kernel zwar das Rootfs mounten kann, aber danach mit einer +Fehlermeldung hängen bleibt, anstatt \cmd{/sbin/init} zu starten, dann +liegt dies oft an fehlenden Device-Nodes im Verzeichnis \cmd{/dev}. +Überprüfen Sie dies. + +\subsection*{Bootprobleme: In den Startskripten} + +Wenn der Kernel erfolgreich das Rootfs mounten und \cmd{/sbin/init} starten +konnte, wird letzteres versuchen, die in \cmd{/etc/inittab} angegebenen +Anweisungen auszuführen. Dies ist normalerweise zunächst der Aufruf eines +Startskripts, das in der Regel weitere Skripte und Programme aufruft. Je +nach Art der aufgerufenen Programme kann es hier zu weiteren Problemen +kommen. Dazu gehören etwa fehlerhafte Konfigurationsdateien, fehlende +Device-Nodes oder Ähnliches. + +Ausserdem kommt es bei Startskripten vor, dass diese nicht auf jede Situation +sauber und fehlertolerant reagieren. Man sollte vermeiden, dass sich das +Skript zur Konfiguration des Netzwerks aufhängt, wenn kein DHCP-Server +gefunden wurde oder kein Netzwerkkabel eingesteckt ist. Des weiteren sollte +das Skript selber erkennen, wenn über die Netzwerkschnittstelle das Rootfs +per NFS gemountet wurde, und dann eine Neukonfiguration tunlichst unterlassen. \end{document} -- cgit v1.2.3 From 658ebb0590425e4d5a245292b30df4a58a7dbacb Mon Sep 17 00:00:00 2001 From: "Hans J. Koch" Date: Fri, 19 Jun 2009 21:21:02 +0200 Subject: Added linux-basics/sh-programming --- linux-basics/sh-programming/Makefile | 9 + .../sh-programming/handout_sh-programming_de.tex | 17 +- .../sh-programming/pres_sh-programming_de.tex | 247 ++++++++++++++++++++- 3 files changed, 259 insertions(+), 14 deletions(-) create mode 100644 linux-basics/sh-programming/Makefile (limited to 'linux-basics') diff --git a/linux-basics/sh-programming/Makefile b/linux-basics/sh-programming/Makefile new file mode 100644 index 0000000..325aad0 --- /dev/null +++ b/linux-basics/sh-programming/Makefile @@ -0,0 +1,9 @@ +all: + pdflatex pres_sh-programming_de.tex + pdflatex hints_sh-programming_de.tex + pdflatex handout_sh-programming_de.tex + pdflatex handout_sh-programming_de.tex + +clean: + rm -f *.aux *.log *.pdf *.log *.snm *.toc *.vrb *.nav *.out + diff --git a/linux-basics/sh-programming/handout_sh-programming_de.tex b/linux-basics/sh-programming/handout_sh-programming_de.tex index 4c391b2..5590e6e 100644 --- a/linux-basics/sh-programming/handout_sh-programming_de.tex +++ b/linux-basics/sh-programming/handout_sh-programming_de.tex @@ -1,17 +1,26 @@ -\documentclass{article} +\documentclass{lxarticle} \usepackage{german} \usepackage[utf8]{inputenc} +\usepackage{lxheaders} +\usepackage{lxextras} \begin{document} -\section*{Titel} +\section*{Einführung in die Shell-Programmierung} -\subsection*{Abschnitt1} +\subsection*{Aufbau von Shell-Skripten} Text -\subsection*{Abschnitt2} +\subsection*{Variablen und Parameter} Text +\subsection*{Bedingte Verzweigungen} + + +\subsection*{Schleifen} +\subsection*{Einbinden anderer Skripte} +\subsection*{Zugriff auf Dateien} + \end{document} diff --git a/linux-basics/sh-programming/pres_sh-programming_de.tex b/linux-basics/sh-programming/pres_sh-programming_de.tex index 07db328..dbecb3d 100644 --- a/linux-basics/sh-programming/pres_sh-programming_de.tex +++ b/linux-basics/sh-programming/pres_sh-programming_de.tex @@ -1,24 +1,251 @@ -\documentclass{article} +\documentclass{beamer} +\usetheme{linutronix} \usepackage{german} \usepackage[utf8]{inputenc} +\usepackage{pgf} +\usepackage{graphicx} +\usepackage{lxextras} + +\title{Einführung in die Shell-Programmierung} +\institute{Linutronix GmbH} \begin{document} -\section*{Block \lq Was ist Linux?\rq} +\maketitle -\subsection*{Lernziele} +% ----- Slide ------------------ +\begin{frame} +\frametitle{Aufbau von Shell-Skripten} \begin{itemize} -\item Lernziel 1 -\item Lernziel 2 -\item Lernziel 3 +\item Syntax: \cmd{\#!/ein/interpreter} +\pause +\item Beliebiges Programm als Interpreter möglich +\pause +\item Beispiele hier: \cmd{\#!/bin/sh} +\pause +\item Danach beliebige Shell-Befehle möglich \end{itemize} +\end{frame} + +% ----- Slide ------------------ +\begin{frame}[fragile] +\frametitle{Hello World als Shell-Script} +\begin{lstlisting} +#!/bin/sh +echo Hello World +\end{lstlisting} +\end{frame} + +% ----- Slide ------------------ +\begin{frame}[fragile] +\frametitle{Variablen und Parameter} +\begin{lstlisting} +#!/bin/sh + +MY_VAR=17 +PAR_1=$1 +datum=`date` + +echo variable is $(MYVAR), parameter is $(PAR_1) +\end{lstlisting} + +\end{frame} + +% ----- Slide ------------------ +\begin{frame}[fragile] +\frametitle{Ausgabe-Umleitung} +\begin{lstlisting} +#!/bin/sh + +# How many lines in addr.txt contain "Jones" ? +# Store the result in "jones_count" +grep Jones addr.txt | wc -l > jones_count + +# Append a message to a log file +echo "My message" >> log_file + +exit 0 + +\end{lstlisting} + +\end{frame} + +% ----- Slide ------------------ +\begin{frame}[fragile] +\frametitle{Bedingte Verzweigungen} +\begin{lstlisting} +#!/bin/sh + +if [ bedingung ] + then + ... + else + ... +fi + +# in one line: + +if [ bedingung ] ; then ... ; fi + +\end{lstlisting} + +\end{frame} + +% ----- Slide ------------------ +\begin{frame}[fragile] +\frametitle{Bedingte Verzweigungen} +\begin{lstlisting} +#!/bin/sh + +# Zahlentests: -eq -ne -lt -gt -le -ge +zahl=15 +if [ $zahl -lt 20 ] ; then ... + +# String-Tests: = != < > -n -z +string="Hallo" +if [ $string != "hello" ] ; then ... + +\end{lstlisting} + +\end{frame} + +% ----- Slide ------------------ +\begin{frame}[fragile] +\frametitle{Bedingte Verzweigungen} +\begin{lstlisting} +#!/bin/sh +# Dateitests, z.B. if [ -f $datei ] ; then ... +# Auswahl: +# -f ist eine normale Datei +# -d ist ein Verzeichnis +# -e existiert +# -s existiert und ist nicht leer +# -r ist lesbar +# -w ist schreibbar +# -x ist ausfuehrbar +# -b ist ein Block Device +# -c ist ein Character Device +\end{lstlisting} + +\end{frame} + +% ----- Slide ------------------ +\begin{frame}[fragile] +\frametitle{Bedingte Verzweigungen} +\begin{lstlisting} +#!/bin/sh + +# Does addr.txt contain "Jones" ? +if grep Jones addr.txt ; then ... + +# Return value 0 means OK +exit 0 + +\end{lstlisting} +\end{frame} + +% ----- Slide ------------------ +\begin{frame}[fragile] +\frametitle{Bedingte Verzweigungen} +\begin{lstlisting} +#!/bin/sh + +# Short circuit tests: + +make && make install + +grep Jones addr.txt || echo "No Jones found!" + +\end{lstlisting} +\end{frame} + +% ----- Slide ------------------ +\begin{frame}[fragile] +\frametitle{Schleifen} +\begin{lstlisting} +#!/bin/sh + +for datei in datei1 datei2 datei3 +do + cp $datei $datei.bak +done + +for datei in * +do + ... +done + +\end{lstlisting} +\end{frame} + +% ----- Slide ------------------ +\begin{frame}[fragile] +\frametitle{Schleifen} +\begin{lstlisting} +#!/bin/sh + +while [ bedingung ] +do + ... +done + +while [ bedingung ] ; do ... ; done + +# bedingung wie bei if + +\end{lstlisting} +\end{frame} + +% ----- Slide ------------------ +\begin{frame}[fragile] +\frametitle{Funktionen} +\begin{lstlisting} +#!/bin/sh + +error_log() { + echo "Fehler: $1" >> my_log_file +} + +... + +error_log "Datei nicht gefunden." + +\end{lstlisting} +\end{frame} + +% ----- Slide ------------------ +\begin{frame}[fragile] +\frametitle{Einbinden anderer Skripte} +\begin{lstlisting} +#!/bin/sh + +# Include an external script: +. my_other_script + +# run another script/command in the background: +my_other_script& + +\end{lstlisting} +\end{frame} + +% ----- Slide ------------------ +\begin{frame}[fragile] +\frametitle{Zugriff auf Dateien} +\begin{lstlisting} +#!/bin/sh -\subsection*{Unterrichts-Ablauf} +ls -1 > dateiliste.txt -Hinweise zur Präsentation, Zeitplanung, etc. +while read dateiname +do + if [ -d $dateiname ] + then + echo "$dateiname ist ein Verzeichnis" + fi +done < dateiliste.txt -\subsection*{Übungen bei vorhandener Hardware} +\end{lstlisting} +\end{frame} -Hinweise zu Übungen, Zeitlimit dazu. \end{document} -- cgit v1.2.3 From d3835cbfea3bbc19b386f31c4972d4bc37b9347b Mon Sep 17 00:00:00 2001 From: "Hans J. Koch" Date: Sat, 20 Jun 2009 03:00:55 +0200 Subject: Added Makefiles in each folder to allow make all or make clean from top level directory --- Makefile | 6 ++++++ application-devel/Makefile | 6 ++++++ kernel-devel/Makefile | 6 ++++++ linux-basics/Makefile | 6 ++++++ realtime/Makefile | 7 +++++++ 5 files changed, 31 insertions(+) create mode 100644 application-devel/Makefile create mode 100644 kernel-devel/Makefile create mode 100644 linux-basics/Makefile create mode 100644 realtime/Makefile (limited to 'linux-basics') diff --git a/Makefile b/Makefile index 4929de1..494db82 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,5 @@ +SUBDIRS = kernel-devel linux-basics realtime application-devel + latex-install: mkdir -p /usr/share/texmf-texlive/tex/latex/linutronix cp latex/lxarticle/lxarticle.cls /usr/share/texmf-texlive/tex/latex/linutronix/ @@ -10,3 +12,7 @@ latex-install: cp latex/latex-beamer/*vf /usr/share/texmf/fonts/vf/linutronix texhash +all clean:: + for dir in $(SUBDIRS) ; do \ + (cd $$dir && make $@); \ + done diff --git a/application-devel/Makefile b/application-devel/Makefile new file mode 100644 index 0000000..d62fe78 --- /dev/null +++ b/application-devel/Makefile @@ -0,0 +1,6 @@ +SUBDIRS = app-debugging compile-tools devel-best-practices devel-environment embedded-devel + +all clean:: + for dir in $(SUBDIRS) ; do \ + (cd $$dir && make $@); \ + done diff --git a/kernel-devel/Makefile b/kernel-devel/Makefile new file mode 100644 index 0000000..f325edd --- /dev/null +++ b/kernel-devel/Makefile @@ -0,0 +1,6 @@ +SUBDIRS = char-device driver-basics kernel-basics kernel-best-practices kernel-build uio-driver + +all clean: + for dir in $(SUBDIRS) ; do \ + (cd $$dir && make $@); \ + done diff --git a/linux-basics/Makefile b/linux-basics/Makefile new file mode 100644 index 0000000..ab3b327 --- /dev/null +++ b/linux-basics/Makefile @@ -0,0 +1,6 @@ +SUBDIRS = boot-process filesystem-structure important-tools linux-processes sh-programming what-is-linux + +all clean:: + for dir in $(SUBDIRS) ; do \ + (cd $$dir && make $@); \ + done diff --git a/realtime/Makefile b/realtime/Makefile new file mode 100644 index 0000000..fa8db4f --- /dev/null +++ b/realtime/Makefile @@ -0,0 +1,7 @@ +SUBDIRS = rt-app-basics rt-basics rt-specialties + +all clean:: + for dir in $(SUBDIRS) ; do \ + (cd $$dir && make $@); \ + done + -- cgit v1.2.3 From afd08dc5de43af71d11f41c3d9d84a695d15efd5 Mon Sep 17 00:00:00 2001 From: "Hans J. Koch" Date: Sun, 21 Jun 2009 17:05:15 +0200 Subject: Update handout sh-programming --- .../sh-programming/handout_sh-programming_de.tex | 190 ++++++++++++++++++++- 1 file changed, 188 insertions(+), 2 deletions(-) (limited to 'linux-basics') diff --git a/linux-basics/sh-programming/handout_sh-programming_de.tex b/linux-basics/sh-programming/handout_sh-programming_de.tex index 5590e6e..f27f70e 100644 --- a/linux-basics/sh-programming/handout_sh-programming_de.tex +++ b/linux-basics/sh-programming/handout_sh-programming_de.tex @@ -10,17 +10,203 @@ \subsection*{Aufbau von Shell-Skripten} -Text +\begin{itemize} +\item Syntax: \cmd{\#!/ein/interpreter} +\item Beliebiges Programm als Interpreter möglich +\item Beispiele hier: \cmd{\#!/bin/sh} +\item Danach beliebige Shell-Befehle möglich +\end{itemize} + +Das übliche \cmd{Hello World} sieht als Shell-Skript etwa so aus: + +\begin{lstlisting} +#!/bin/sh +echo Hello World +\end{lstlisting} \subsection*{Variablen und Parameter} -Text +\begin{lstlisting} +#!/bin/sh + +MY_VAR=17 +PAR_1=$1 +datum=`date` + +echo variable is $(MYVAR), parameter is $(PAR_1) +\end{lstlisting} + +Variablen können einfach in der Form \cmd{Name=Wert} geschrieben werden. Sie +haben in Shell-Skripten keinen Typ und werden bei der ersten Verwendung +automatisch angelegt. + +\subsection*{Ausgabe-Umleitung} + +\begin{lstlisting} +#!/bin/sh + +# How many lines in addr.txt contain "Jones" ? +# Store the result in "jones_count" +grep Jones addr.txt | wc -l > jones_count + +# Append a message to a log file +echo "My message" >> log_file + +exit 0 +\end{lstlisting} + \subsection*{Bedingte Verzweigungen} +Allgemeine Form: + +\begin{lstlisting} +#!/bin/sh + +if [ bedingung ] + then + ... + else + ... +fi + +# in one line: + +if [ bedingung ] ; then ... ; fi +\end{lstlisting} + +Zahlentests: + +\begin{lstlisting} +#!/bin/sh + +# Zahlentests: -eq -ne -lt -gt -le -ge +zahl=15 +if [ $zahl -lt 20 ] ; then ... + +# String-Tests: = != < > -n -z +string="Hallo" +if [ $string != "hello" ] ; then ... +\end{lstlisting} + +Dateitests: + +\begin{lstlisting} +#!/bin/sh +# Dateitests, z.B. if [ -f $datei ] ; then ... +# Auswahl: +# -f ist eine normale Datei +# -d ist ein Verzeichnis +# -e existiert +# -s existiert und ist nicht leer +# -r ist lesbar +# -w ist schreibbar +# -x ist ausfuehrbar +# -b ist ein Block Device +# -c ist ein Character Device +\end{lstlisting} + +Test des Rückgabewerts von Programmen: + +\begin{lstlisting} +#!/bin/sh + +# Does addr.txt contain "Jones" ? +if grep Jones addr.txt ; then ... + +# Return value 0 means OK +exit 0 + +\end{lstlisting} + +Short circuit tests: + +\begin{lstlisting} +#!/bin/sh + +# Short circuit tests: + +make && make install + +grep Jones addr.txt || echo "No Jones found!" +\end{lstlisting} + \subsection*{Schleifen} + +For-Schleife: + +\begin{lstlisting} +#!/bin/sh + +for datei in datei1 datei2 datei3 +do + cp $datei $datei.bak +done + +for datei in * +do + ... +done +\end{lstlisting} + +While-Schleife: + +\begin{lstlisting} +#!/bin/sh + +while [ bedingung ] +do + ... +done + +while [ bedingung ] ; do ... ; done + +# bedingung wie bei if +\end{lstlisting} + +\subsection*{Funktionen} + +\begin{lstlisting} +#!/bin/sh + +error_log() { + echo "Fehler: $1" >> my_log_file +} + +... + +error_log "Datei nicht gefunden." +\end{lstlisting} + \subsection*{Einbinden anderer Skripte} + +\begin{lstlisting} +#!/bin/sh + +# Include an external script: +. my_other_script + +# run another script/command in the background: +my_other_script& + +\end{lstlisting} + \subsection*{Zugriff auf Dateien} +\begin{lstlisting} +#!/bin/sh + +ls -1 > dateiliste.txt + +while read dateiname +do + if [ -d $dateiname ] + then + echo "$dateiname ist ein Verzeichnis" + fi +done < dateiliste.txt + +\end{lstlisting} + \end{document} -- cgit v1.2.3 From f45f06860f0e60acd5ce3297581288f9b13f884a Mon Sep 17 00:00:00 2001 From: Jan Altenberg Date: Mon, 22 Jun 2009 00:35:17 +0200 Subject: Added Linus' newsgroup message to the 'What is Linux?' part --- linux-basics/what-is-linux/pres_what-is-linux_de.tex | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'linux-basics') diff --git a/linux-basics/what-is-linux/pres_what-is-linux_de.tex b/linux-basics/what-is-linux/pres_what-is-linux_de.tex index 85bcdb2..fbd44f1 100644 --- a/linux-basics/what-is-linux/pres_what-is-linux_de.tex +++ b/linux-basics/what-is-linux/pres_what-is-linux_de.tex @@ -45,6 +45,19 @@ \end{figure} \end{frame} +% ----- Slide ------------------ +\begin{frame}[fragile] +\begin{verbatim} +Hello everybody out there using minix - + +I'm doing a (free) operating system (just a hobby, +won't be big andprofessional like gnu) for +386(486) AT clones. This has been brewing +since april, and is starting to get ready. +\end{verbatim} +Linus Torvalds (1991 / Minix newsgroup) +\end{frame} + % ----- Slide ------------------ \begin{frame} \begin{figure}[h] -- cgit v1.2.3