Viele Aenderungen, Tabellen durch Syntax-Boxen ausgetauscht, neues Kapitel: date
This commit is contained in:
@ -9,12 +9,12 @@ Nachteile der Shell zum tragen: Die Geschwindigkeit.
|
||||
|
||||
In einem Shell-Skript wird f<>r jedes externe Kommando\footnote{Externe
|
||||
Kommandos sind solche, die nicht direkt in der Shell enthalten sind, f<>r die
|
||||
also eine eigene Datei aufgerufen wird.} ein eigener Proze<7A> gestartet. Das
|
||||
also ein eigenes Binary aufgerufen wird.} ein eigener Proze<7A> gestartet. Das
|
||||
kostet nat<61>rlich Zeit und Speicher.
|
||||
|
||||
Zeitkritische Anwendungen sind also kein Einsatzgebiet f<>r Shell-Skripte. Die
|
||||
schreibt man besser in Perl, oder noch besser in einer `compilierten' Sprache
|
||||
wie C oder C++.
|
||||
schreibt man besser in Perl, Python, oder noch besser in einer `compilierten'
|
||||
Sprache wie C oder C++.
|
||||
|
||||
Es stehen jedoch an der Shell viele sehr n<>tzliche externe Kommandos zur
|
||||
Ver\-f<EFBFBD>\-gung, die einem die Entwicklung entsprechender eigener Routinen
|
||||
@ -64,7 +64,7 @@ nur Dateien im Sinne von `ein paar Kilobytes Daten, die irgendwo auf der
|
||||
Festplatte rumliegen' gibt. Vielmehr findet man hier die Ger<65>te des Rechners
|
||||
als Dateien unter /dev. Der Kernel selbst stellt Schnittstellen in Form von
|
||||
virtuellen Dateien unter /proc (ab Kernel 2.6 auch unter /sys) zur Verf<72>gung.
|
||||
Und Schlu<EFBFBD>endlich k<>nnen Prozesse sich sogenannte Named Pipes\index{Named Pipe}
|
||||
Und schlu<EFBFBD>endlich k<>nnen Prozesse sich sogenannte Named Pipes\index{Named Pipe}
|
||||
anlegen, in die sie schreiben oder aus denen sie lesen.
|
||||
|
||||
Diese Kommandos sind also universell n<>tzlich, nicht nur im Zusammenhang mit
|
||||
@ -72,6 +72,7 @@ Dateien auf der Festplatte.
|
||||
|
||||
\begin{itemize}
|
||||
\item \texttt{cat} (\ref{cat}): Dateien einlesen und ausgeben
|
||||
\item \texttt{date} (\ref{date}): Datum oder Zeit ausgeben
|
||||
\item \texttt{echo} (\ref{echo}): Daten ausgeben
|
||||
\item \texttt{grep} (\ref{grep}): In Dateien suchen
|
||||
\item \texttt{head} (\ref{head}): Dateianfang ausgeben
|
||||
@ -578,6 +579,39 @@ Dateien in Spalten zusammengef
|
||||
\index{cut=\texttt{cut}|)}
|
||||
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
\subsection{date}\label{date}\index{date=\texttt{date}|(textbf}
|
||||
|
||||
Ein einfacher Aufruf von \texttt{date} f<>hrt zu einem Ergebnis in der Art:
|
||||
|
||||
\lstinline|Do Jan 27 00:17:51 CET 2005|
|
||||
|
||||
Wie man sieht, wird das Datum auf dem System entsprechend der lokalen
|
||||
Einstellungen ausgegeben. Auf diesem Rechner ist das deutsch, auf den meisten
|
||||
Rechnern wird Englisch voreingestellt sein.
|
||||
|
||||
Neben dieser umfassenden aber starren Ausgabe ist es m<>glich, das Datum den
|
||||
eigenen W<>nschen entsprechend zu formatieren. Ein paar Beispiele:
|
||||
|
||||
\begin{lstlisting}
|
||||
$ date +"%d.%m.%y, %H:%M"
|
||||
27.01.05, 00:17
|
||||
|
||||
$ date +"Heute ist %A."
|
||||
Heute ist Donnerstag.
|
||||
|
||||
$ date +"%A ist der %u. Tag der Woche."
|
||||
Donnerstag ist der 4. Tag der Woche.
|
||||
\end{lstlisting}
|
||||
|
||||
Die zur Formatierung bereitstehenden Platzhalter stehen in der Man-Page.
|
||||
Eigentlich sollte \texttt{\%s} zur Ausgabe der Unix-Systemzeit
|
||||
\footnote{Sekunden seit dem 01.01.1970, 0:00 Uhr} ein naheliegender Parameter
|
||||
sein, leider steht er nur in der GNU-Version von \texttt{date} zur Verf<72>gung.
|
||||
|
||||
\index{date=\texttt{date}|)}
|
||||
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
\subsection{diff}\label{diff}\index{diff=\texttt{diff}|(textbf}
|
||||
|
||||
@ -638,10 +672,12 @@ ist noch einmal aus. So ist es m
|
||||
Variablen zu bilden.
|
||||
|
||||
Eine wichtige Anwendung f<>r dieses Kommando ist der Fall, wenn eigentlich ein
|
||||
Array\index{Array} gebraucht w<>rde. Der Inhalt eines Array-Elements kann
|
||||
beispielsweise mittels \lstinline|eval echo \$arr$index| ausgegeben
|
||||
werden, dabei ist \texttt{arr} der Name des Arrays und \texttt{index} der Name
|
||||
der Variablen, die den Index des auszugebenden Elementes enth<74>lt.
|
||||
Array\index{Array} gebraucht w<>rde. Wenn \texttt{arr} der Name des Arrays und
|
||||
\texttt{index} der Name der Variablen ist, die den Index des auszugebenden
|
||||
Elementes enth<74>lt, dann kann durch die folgende Zeile der Inhalt eines
|
||||
Array-Elementes ausgegeben werden:
|
||||
|
||||
\lstinline|eval echo \$arr$index|
|
||||
|
||||
\index{eval=\texttt{eval}|)}
|
||||
|
||||
@ -820,12 +856,12 @@ ein Skript auf Signale reagieren kann.
|
||||
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
\subsection{killall}\label{killall}\index{killall=\texttt{killall}|(textbf}\marginpar{GNU!}
|
||||
\subsection{killall}\label{killall}\index{killall=\texttt{killall}|(textbf}
|
||||
|
||||
Im Abschnitt <20>ber \texttt{kill} (\ref{kill}) wird beschrieben, wie man ein
|
||||
Signal an einen Proze<7A> schickt, dessen ID bekannt ist. Kennt man die ID nicht,
|
||||
oder will man das Signal an mehrere Prozesse schicken, kann dieses Kommando auf
|
||||
GNU-Systemen eine gro<72>e Hilfe darstellen.
|
||||
vielen Systemen eine gro<72>e Hilfe darstellen.
|
||||
|
||||
Mit dem Parameter \texttt{-i} wird vor jedem Signal interaktiv gefragt, ob es
|
||||
geschickt werden soll. Mit \texttt{-v} wird angegeben, ob die Signale
|
||||
@ -1626,7 +1662,7 @@ sich auch nochmal eine ausf
|
||||
Ein weiterer n<>tzlicher Einsatz f<>r \texttt{trap} ist es, Signale zu
|
||||
ignorieren. Das kann gew<65>nscht sein, wenn eine Folge von Kommandos in einem
|
||||
Skript auf keinen Fall unterbrochen werden darf. Um zu verhindern da<64> ein
|
||||
\Ovalbox{CTRL}-\Ovalbox{C} des Benutzers das Skript beendet wird folgendes
|
||||
\Ovalbox{CTRL}+\Ovalbox{C} des Benutzers das Skript beendet wird folgendes
|
||||
Konstrukt eingesetzt:
|
||||
|
||||
\begin{lstlisting}
|
||||
@ -1737,14 +1773,18 @@ unterscheidet sich von System zu System}.
|
||||
|
||||
Ein weiterer und in der Praxis mindestens ebenso sinnvoller Einsatzzweck ist
|
||||
das Vermeiden von Schleifen. Das obige Problem lie<69>e sich auch mit einer Zeile
|
||||
in der Form \lstinline|find / -name \*.txt -exec grep 'text' {} \;| l<>sen.
|
||||
Allerdings h<>tte das den Nachteil, da<64> f<>r jede gefundene Datei ein neuer
|
||||
\texttt{grep} gestartet werden mu<6D>. Das kostet Resourcen.
|
||||
in der folgende Form l<>sen:
|
||||
|
||||
Beide Probleme werden durch eine Zeile in der Form
|
||||
\lstinline+find / -name \*.txt | xargs grep 'text'+ umgangen. Dabei liest
|
||||
\texttt{xargs} aus der Standardeingabe die Parameter, die dann an den
|
||||
\texttt{grep}-Aufruf angeh<65>ngt werden. Sollten zu viele Dateien gefunden
|
||||
\lstinline|find / -name \*.txt -exec grep 'text' {} \;|
|
||||
|
||||
Allerdings h<>tte das den Nachteil, da<64> f<>r jede gefundene Datei ein neuer
|
||||
\texttt{grep} gestartet werden mu<6D>. Das kostet Resourcen. Beide Probleme werden
|
||||
durch eine Zeile in der folgenden Form umgangen:
|
||||
|
||||
\lstinline+find / -name \*.txt | xargs grep 'text'+
|
||||
|
||||
Dabei liest \texttt{xargs} aus der Standardeingabe die Parameter, die dann an
|
||||
den \texttt{grep}-Aufruf angeh<65>ngt werden. Sollten zu viele Dateien gefunden
|
||||
werden, wird \texttt{grep} mehrfach aufgerufen, allerdings im Gegensatz zum
|
||||
obigen Beispiel nicht einmal pro Fundstelle.
|
||||
|
||||
|
Reference in New Issue
Block a user