Viele grosse Aenderungen
This commit is contained in:
@ -1,10 +1,10 @@
|
||||
% $Id$
|
||||
\chapter{N<EFBFBD>tzliche Shell-Kommandos}\label{nuetzliche_shell-kommandos}
|
||||
Durch die gezeigten Steuerungsm<73>glichkeiten stehen dem Shell-Pro\-grammie\-rer
|
||||
M<EFBFBD>glichkeiten offen, fast alle g<>ngigen Algorithmen zu implementieren. Es ist
|
||||
tats<EFBFBD>chlich in der Shell m<>glich, Sortier- oder Suchfunktionen zu schreiben.
|
||||
Leider kommt aber an dieser Stelle einer der bedeutendsten Nachteile der Shell
|
||||
zum tragen: Die Geschwindigkeit.
|
||||
M<EFBFBD>g\-lich\-kei\-ten offen, fast alle g<>ngigen Algorithmen zu implementieren. Es
|
||||
ist tats<EFBFBD>chlich in der Shell m<>glich, Sortier- oder Suchfunktionen zu
|
||||
schreiben. Leider kommt aber an dieser Stelle einer der bedeutendsten
|
||||
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
|
||||
@ -16,9 +16,9 @@ schreibt man besser in Perl, oder noch besser in einer `compilierten' Sprache
|
||||
wie C oder C++.
|
||||
|
||||
Es stehen jedoch an der Shell viele sehr n<>tzliche externe Kommandos zur
|
||||
Verf<EFBFBD>gung, die einem die Entwicklung entsprechender eigener Routinen ersparen.
|
||||
Diese externen Kommandos sind zudem in anderen Sprachen geschrieben worden, so
|
||||
da<EFBFBD> sie schneller ablaufen als jedes Shell-Skript. Man kommt als
|
||||
Ver\-f<EFBFBD>\-gung, die einem die Entwicklung entsprechender eigener Routinen
|
||||
ersparen. Diese externen Kommandos sind zudem in anderen Sprachen geschrieben
|
||||
worden, so da<EFBFBD> sie schneller ablaufen als jedes Shell-Skript. Man kommt als
|
||||
Shell-Programmierer nicht sinnvoll um den Einsatz dieser Programme herum.
|
||||
|
||||
In diesem Abschnitt sollen einige dieser Programme mit typischen
|
||||
@ -66,7 +66,7 @@ Dateien auf der Festplatte.
|
||||
\item \texttt{echo} (\ref{echo}): Daten ausgeben
|
||||
\item \texttt{grep} (\ref{grep}): In Dateien suchen
|
||||
\item \texttt{head} (\ref{head}): Dateianfang ausgeben
|
||||
\item \texttt{printf} (\ref{printf}): formatierte Datenausgabe
|
||||
\item \texttt{printf} (\ref{printf}): Formatierte Datenausgabe
|
||||
\item \texttt{read} (\ref{read}): Zeilen einlesen
|
||||
\item \texttt{sort} (\ref{sort}): Zeilenweises Sortieren
|
||||
\item \texttt{tail} (\ref{tail}): Dateiende ausgeben
|
||||
@ -261,8 +261,8 @@ Hier wird der Modus gesteuert, indem direkt angegeben wird f
|
||||
Rechte gelten sollen. Mit `+' werden die Rechte erweitert, `-' nimmt Rechte
|
||||
und mit `=' werden die Rechte hart gesetzt.
|
||||
|
||||
\texttt{chmod u+x datei} macht die Datei f<>r den Besitzer ausf<73>hrbar. Mit
|
||||
\texttt{chmod u=rw,go=r datei} werden die Rechte auf `rw-r--r--' gesetzt, der
|
||||
\texttt{chmod u+x datei} macht die Datei f<>r den Besitzer ausf<73>hrbar. Mit dem
|
||||
Parameter \texttt{u=rw,go=r} werden die Rechte auf `rw-r--r--' gesetzt, der
|
||||
Besitzer kann lesen und schreiben, alle anderen nur lesen.
|
||||
|
||||
Neben dieser Art der Notation gibt es noch eine~--~wesentlich
|
||||
@ -302,7 +302,7 @@ Will man lediglich die Gruppen-ID
|
||||
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
\subsection{chpasswd}\label{script}\index{chpasswd=\texttt{chpasswd}|(textbf}
|
||||
\subsection{chpasswd}\index{chpasswd=\texttt{chpasswd}|(textbf}
|
||||
|
||||
Mit diesem Kommando bietet sich dem Administrator des Systems die
|
||||
M<EFBFBD>g\-lich\-keit, scriptgesteuert die Pa<50>w<EFBFBD>rter f<>r neue Benutzer zu vergeben.
|
||||
@ -388,7 +388,24 @@ der Praxis oft als sehr hilfreich:
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
\subsection{eval}\label{eval}\index{eval=\texttt{eval}|(textbf}
|
||||
|
||||
TODO!!! eval
|
||||
Die Wirkungsweise von \texttt{eval} l<><6C>t sich wohl am ehesten durch ein kleines
|
||||
Beispiel erkl<6B>ren:
|
||||
|
||||
\LTXtable{\textwidth}{tab_kommandos_eval_beispiel.tex}
|
||||
|
||||
Bevor eine Zeile in der Shell tats<74>chlich ausgef<65>hrt wird, wird sie von der
|
||||
Shell expandiert, bzw. evaluiert. Der letzte Begriff deutet schon an was damit
|
||||
gemeint ist: Enthaltene Variablennamen werden durch ihre Werte ersetzt.
|
||||
|
||||
Das Kommando \texttt{eval} f<>hrt die Zeile die durch die Expansion entstanden
|
||||
ist noch einmal aus. So ist es m<>glich, Variablennamen aus den Inhalten anderer
|
||||
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 \texttt{eval echo \textbackslash\$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.
|
||||
|
||||
\index{eval=\texttt{eval}|)}
|
||||
|
||||
@ -412,7 +429,7 @@ sie sind also durch Anf
|
||||
\texttt{i=`expr \$i \textbackslash{}* 3`}.
|
||||
|
||||
Eine andere M<>glichkeit f<>r einfache Rechnungen besteht in der sogenannten
|
||||
Arithmetik-Expansion (Siehe \ref{arithmetikexpansion}).
|
||||
Arith\-me\-tik-Ex\-pan\-sion (Siehe \ref{arithmetikexpansion}).
|
||||
|
||||
\index{expr=\texttt{expr}|)}
|
||||
|
||||
@ -583,7 +600,39 @@ steht.
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
\subsection{printf}\label{printf}\index{printf=\texttt{printf}|(textbf}
|
||||
|
||||
TODO!!! printf
|
||||
Analog zum gleichnamigen Befehl in Programmiersprachen wie Perl oder C dient
|
||||
\texttt{printf} der formatierten Ausgabe von Daten. Als Parameter wird ein
|
||||
sogenannter Format-String und eine Liste von auszugebenden Daten mitgegeben.
|
||||
Dabei enth<74>lt der Format-String eine Reihe von Platzhaltern, die nach
|
||||
bestimmten Regeln durch die Daten ersetzt werden.
|
||||
|
||||
Der Format-String folgt im Wesentlichen den gleichen Regeln wie in der
|
||||
C-Version. N<>heres dazu erf<72>hrt man mit \texttt{man 3 printf}.
|
||||
|
||||
Hier die wichtigsten Parameter f<>r den Format-String:
|
||||
|
||||
\LTXtable{\textwidth}{tab_kommandos_printf_parameter.tex}
|
||||
|
||||
Besonders n<>tzlich ist dieses Kommando bei der tabellarischen Ausgabe von
|
||||
Daten. Im folgenden Beispiel werden alle Benutzernamen, deren
|
||||
Home-Verzeichnisse und Default-Shells aus der Datei \texttt{/etc/passwd}
|
||||
extrahiert und <20>bersichtlich ausgegeben:
|
||||
|
||||
\footnotesize
|
||||
\begin{listing}[2]{1}
|
||||
#!/bin/sh
|
||||
IFS=:
|
||||
while read user pass uid gid name home shell; do
|
||||
printf "%-15s %-25s %s\n" $user $home $shell
|
||||
done < /etc/passwd
|
||||
\end{listing}
|
||||
\normalsize
|
||||
|
||||
Zur Erinnerung: Die vordefinierte Variable
|
||||
\texttt{\$IFS}\index{\$IFS=\texttt{\$IFS}} ist der Feld-Separator, die
|
||||
Eingabezeilen werden also als Doppelpunkt-separierte Liste gesehen. N<>heres
|
||||
dazu steht im Abschnitt <20>ber vordefinierte Variablen
|
||||
(\ref{vordefinierte_variablen}).
|
||||
|
||||
\index{printf=\texttt{printf}|)}
|
||||
|
||||
@ -609,8 +658,9 @@ Variablennamen wird der verbleibende Rest der Eingabezeile zugewiesen. Wenn
|
||||
also nur ein Variablenname angegeben wird, erh<72>lt dieser die komplette
|
||||
Eingabezeile. Wenn weniger Worte gelesen werden als Variablen angegeben sind,
|
||||
enthalten die verbleibenden Variablen leere Werte. Als Wort-Trennzeichen dienen
|
||||
alle Zeichen, die in der vordefinierten Variable \texttt{\$IFS} enthalten sind
|
||||
(siehe Seite \pageref{IFS}).
|
||||
alle Zeichen, die in der vordefinierten Variable
|
||||
\texttt{\$IFS}\index{\$IFS=\texttt{\$IFS}} enthalten sind (siehe Abschnitt
|
||||
\ref{vordefinierte_variablen}).
|
||||
|
||||
Wenn keine Variablennamen angegeben werden, wird die Eingabe in der Variable
|
||||
\texttt{REPLY} abgelegt.
|
||||
@ -657,8 +707,8 @@ Timeout oder ein EOF auf.
|
||||
|
||||
Mit diesem Kommando k<>nnen Dateien und Verzeichnisse gel<65>scht werden. Dabei
|
||||
kann man vorsichtig vorgehen, indem man mit \texttt{-i} daf<61>r sorgt, da<64> jeder
|
||||
L<EFBFBD>schvorgang best<EFBFBD>tigt werden mu<6D>. Oder rabiat, indem man mit \texttt{-f} das
|
||||
L<EFBFBD>schen erzwingt.
|
||||
L<EFBFBD>schvorgang be\-st<EFBFBD>\-tigt werden mu<6D>. Oder rabiat, indem man mit \texttt{-f}
|
||||
das L<EFBFBD>schen erzwingt.
|
||||
|
||||
Verzeichnisse k<>nnen mit dem Parameter \texttt{-R} entfernt werden, im
|
||||
Gegensatz zu \texttt{rmdir} werden dann auch s<>mtliche enthaltenen Dateien und
|
||||
@ -851,7 +901,8 @@ Der Parameter \texttt{-L} gibt die L
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
\subsection{who}\label{who}\index{who=\texttt{who}|(textbf}
|
||||
|
||||
TODO!!! who
|
||||
Das Kommando \texttt{who} gibt eine Liste aller angemeldeten Benutzer, zusammen
|
||||
mit deren aktueller Konsole und der Anmeldezeit aus.
|
||||
|
||||
\index{who=\texttt{who}|)}
|
||||
|
||||
@ -859,6 +910,34 @@ TODO!!! who
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
\subsection{xargs}\label{xargs}\index{xargs=\texttt{xargs}|(textbf}
|
||||
|
||||
TODO!!! xargs
|
||||
Bisweilen kommt man in die Verlegenheit, versehentlich zu lange Einzeiler
|
||||
geschrieben zu haben. Neben den F<>llen, in denen der Tipp-Eifer <20>berhand
|
||||
genommen hat handelt es sich in aller Regel um Zeilen in der Art `\texttt{grep
|
||||
'text' \$(find / -name \textbackslash*.txt)}'. Dieses Kommando sucht alle
|
||||
Dateien mit der Endung txt, die im System vorhanden sind. Diese werden `in die
|
||||
Kommandozeile eingebaut'. Wenn sehr viele Dateien gefunden werden, wird die
|
||||
Zeile zu lang f<>r die Shell\footnote{Die maximale L<>nge der Kommandozeile
|
||||
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 `\texttt{find / -name \textbackslash*.txt -exec grep 'text' \{\}
|
||||
\textbackslash;}'. 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 Form `\texttt{find / -name
|
||||
\textbackslash*.txt | xargs grep 'text'}' umgangen. Dabei liest \texttt{xargs}
|
||||
aus der Standardeingabe die Parameter, die dann an den \texttt{grep}-Aufruf
|
||||
angeh<EFBFBD>ngt werden. Sollten zu viele Dateien gefunden werden, wird \texttt{grep}
|
||||
mehrfach aufgerufen, allerdings im Gegensatz zum obigen Beispiel nicht einmal
|
||||
pro Fundstelle.
|
||||
|
||||
Neben einigen anderen Parametern informiert die Manpage <20>ber die Option
|
||||
\texttt{-r}. Damit kann vermieden werden, da<64> \texttt{xargs} das Kommando
|
||||
startet wenn keine Eingabe vorhanden ist. Bezogen auf das angegebene Beispiel
|
||||
w<EFBFBD>rde \texttt{grep} ohne Dateinamen gestartet, wenn \texttt{find} nichts
|
||||
findet. Es w<>rde auf Input von der Standardeingabe warten, der aber
|
||||
wahrscheinlich nicht kommt. Das Skript w<>rde h<>ngen, wenn der Parameter
|
||||
\texttt{-r} nicht angewandt w<>rde.
|
||||
|
||||
\index{xargs=\texttt{xargs}|)}
|
||||
|
Reference in New Issue
Block a user