diff --git a/schmutzige_tricks.tex b/schmutzige_tricks.tex index 010e119..560e0b7 100644 --- a/schmutzige_tricks.tex +++ b/schmutzige_tricks.tex @@ -388,10 +388,10 @@ kill $watchdogpid > /dev/null 2>&1 exit 0 \end{lstlisting} -Dann wird durch ein \texttt{wait}\index{wait} darauf gewartet, daß sich der -überwachte Prozeß beendet. Dabei würde \texttt{wait} bis in alle Ewigkeit -warten, wäre da nicht der Watchdog in der Subshell. Wenn dem die Ausführung zu -lange dauert, sorgt er dafür daß der Prozeß beendet wird. +Dann wird durch ein \texttt{wait}\index{wait=\texttt{wait}} darauf gewartet, +daß sich der überwachte Prozeß beendet. Dabei würde \texttt{wait} bis in alle +Ewigkeit warten, wäre da nicht der Watchdog in der Subshell. Wenn dem die +Ausführung zu lange dauert, sorgt er dafür daß der Prozeß beendet wird. Kommt der überwachte Prozeß aber rechtzeitig zurück, sorgt \texttt{kill} in Zeile 8 dafür daß der Wachhund `eingeschläfert' wird. @@ -399,3 +399,36 @@ Zeile 8 daf Auf diese Weise ist sichergestellt, daß der \texttt{ping} auf keinen Fall länger als fünf Sekunden läuft. + +\section{Unter Druck: Auf Tasten warten}\label{tastendruck}\index{Tastendruck} + +Oft baut man in längere Ausgaben eine Art Warte-Prompt im Stile von `Bitte +Enter drücken um fortzufahren' ein. Gewartet wird dann mit Hilfe des +\texttt{read}-Kommandos\index{read=\texttt{read}}. + +Will man nicht nur auf den Druck der Enter-Taste reagieren, sondern auf einen +beliebigen Tastendruck, eignet sich das folgende Konstrukt: + +\begin{lstlisting} +stty raw -echo +inputchar=`dd if=/dev/tty bs=1 count=1 2> /dev/null` +stty sane +\end{lstlisting} + +Zur Erklärung: Mit dem Kommando \texttt{stty}\index{stty=\texttt{stty}} kann +ein Terminal konfiguriert werden. Dabei kann es sich sowohl um eine Leitung wie +die serielle Schnittstelle des Rechners handeln, als auch um das Terminal an +dem der Benutzer sitzt. Jedes Terminal hat eine Reihe von Eigenschaften. +Mittels \lstinline|stty raw -echo| wird das Terminal in einen passenden Modus +geschaltet. Das \texttt{-echo} sorgt dafür, daß eingegebene Zeichen nicht in +der Konsole wiedergegeben werden. + +Danach wird mit \texttt{dd}\index{dd=\texttt{dd}} genau ein Zeichen eingelesen. +Die Fehlerausgabe von \texttt{dd} wird dabei nach /dev/null umgeleitet, da +ansonsten auf der Konsole die Erfolgsmeldungen \textit{1+0 Datensätze ein, 1+0 +Datensätze aus} erscheinen würden. Das gelesene Zeichen wird in der Variablen +\texttt{\$inputchar} gesichert und steht somit zur Verfügung. + +Nach dem Einlesevorgang wird die Konsole schließlich mittels +\lstinline|stty sane| wieder in einen benutzbaren Zustand zurückversetzt. +