Shell-Programmierung/werkzeugkasten.tex

944 lines
40 KiB
TeX
Raw Normal View History

2003-04-11 15:05:25 +00:00
% $Id$
\chapter{N<EFBFBD>tzliche Shell-Kommandos}\label{nuetzliche_shell-kommandos}
2001-07-02 12:52:18 +00:00
Durch die gezeigten Steuerungsm<73>glichkeiten stehen dem Shell-Pro\-grammie\-rer
2004-11-19 12:09:34 +00:00
M<EFBFBD>g\-lich\-kei\-ten offen, fast alle g<>ngigen Algorithmen zu implementieren. Es
ist tats<74>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.
2001-07-02 12:52:18 +00:00
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
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++.
Es stehen jedoch an der Shell viele sehr n<>tzliche externe Kommandos zur
2004-11-19 12:09:34 +00:00
Ver\-f<EFBFBD>\-gung, die einem die Entwicklung entsprechender eigener Routinen
ersparen. Diese externen Kommandos sind zudem in anderen Sprachen geschrieben
worden, so da<64> sie schneller ablaufen als jedes Shell-Skript. Man kommt als
2001-07-02 12:52:18 +00:00
Shell-Programmierer nicht sinnvoll um den Einsatz dieser Programme herum.
In diesem Abschnitt sollen einige dieser Programme mit typischen
Einsatzm<EFBFBD>glichkeiten vorgestellt werden. Eine vollst<73>ndige Beschreibung w<>re
(wenn <20>berhaupt m<>glich) viel zu lang, um an dieser Stelle untergebracht zu
2004-11-12 12:07:32 +00:00
werden. \textbf{Dies ist also nur ein grober <20>berblick, nicht mal ann<6E>hernd
eine vollst<73>ndige Referenz!} F<>r ausf<73>hrlichere Beschreibungen empfiehlt sich
das Studium der Man-Pages oder der Kauf eines entsprechenden Buches (Siehe
Anhang \ref{quellen}, `Quellen'). Am besten macht man nat<61>rlich beides. ;-)
2001-07-02 12:52:18 +00:00
2004-10-28 15:44:41 +00:00
Eine globale Beschreibung aller g<>ngigen Kommandos w<>rde den Rahmen dieses
Textes sprengen. Au<41>erdem w<>re es nicht leicht, das zu einer Aufgabe passende
Werkzeug zu finden. Die Werkzeuge nach Aufgaben zu sortieren f<>llt allerdings
auch nicht leicht. Die Entwickler der Kommandos versuchen, ihre Tools m<>glichst
universell einsetzbar zu halten, also gibt es keine 1:1-Beziehung zwischen
Problem und L<>sung.
Um sowohl das Finden eines Werkzeugs zu einem gegebenen Problem als auch das
Finden einer Beschreibung zu einem gegebenen Werkzeug zu vereinfachen, und um
die oben beschriebene n:m-Beziehung abzubilden, werden hier also zun<75>chst
2004-11-05 16:20:53 +00:00
typische Aufgaben beschrieben. Diese enthalten `Links' zu den in Frage
2004-10-28 15:44:41 +00:00
kommenden Werkzeugen. Danach gibt es eine alphabetische Aufz<66>hlung der
wichtigsten Kommandos.
\section{N<EFBFBD>gel...}\label{naegel}
\subsection{Ein- und Ausgabe}\label{ein_und_ausgabe}
2001-07-02 12:52:18 +00:00
2004-11-05 16:20:53 +00:00
Praktisch jedes Skript verwendet in irgendeiner Form die Ein- oder Ausgabe. Sei
es in interaktiver Art auf dem Terminal, oder im Hintergrund auf Dateien.
2001-07-02 12:52:18 +00:00
2004-11-05 16:20:53 +00:00
An dieser Stelle sei darauf hingewiesen, da<64> es auf unixoiden Systemen nicht
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<6C>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
Dateien auf der Festplatte.
\begin{itemize}
\item \texttt{cat} (\ref{cat}): Dateien einlesen und ausgeben
\item \texttt{echo} (\ref{echo}): Daten ausgeben
\item \texttt{grep} (\ref{grep}): In Dateien suchen
\item \texttt{head} (\ref{head}): Dateianfang ausgeben
2004-11-19 12:09:34 +00:00
\item \texttt{printf} (\ref{printf}): Formatierte Datenausgabe
2004-11-05 16:20:53 +00:00
\item \texttt{read} (\ref{read}): Zeilen einlesen
\item \texttt{sort} (\ref{sort}): Zeilenweises Sortieren
\item \texttt{tail} (\ref{tail}): Dateiende ausgeben
\end{itemize}
2001-07-02 12:52:18 +00:00
2004-10-28 15:44:41 +00:00
\subsection{Pfade und Dateien}\label{pfade_und_dateien}
2004-11-05 16:20:53 +00:00
Eine der Hauptaufgaben von Shell-Skripten ist nat<61>rlich das Hantieren mit
2004-10-28 15:44:41 +00:00
Dateien. In diesem Abschnitt geht es allerdings nicht um den Umgang mit
Dateiinhalten, sondern vielmehr werden einige n<>tzliche Tools im Umgang mit
Dateien an sich vorgestellt.
2004-11-05 16:20:53 +00:00
Auch hier gilt nat<61>rlich der Hinweis aus Abschnitt \ref{ein_und_ausgabe}: Eine
Datei kann viel mehr sein als nur ein paar Daten im Filesystem.
\begin{itemize}
\item \texttt{basename} (\ref{basename}): Den Namen einer Datei (ohne Pfad) ausgeben
\item \texttt{cp} (\ref{cp}): Dateien kopieren
2004-11-12 12:07:32 +00:00
\item \texttt{chgrp} (\ref{chgrp}): Gruppen-ID einer Datei <20>ndern
\item \texttt{chmod} (\ref{chmod}): Zugriffsrechte einer Datei <20>ndern
\item \texttt{chown} (\ref{chown}): Eigent<6E>mer einer Datei <20>ndern
2004-11-05 16:20:53 +00:00
\item \texttt{dirname} (\ref{dirname}): Den Pfad zu einer Datei (ohne den Namen) ausgeben
\item \texttt{find} (\ref{find}): Dateien suchen
2004-11-12 12:07:32 +00:00
\item \texttt{mkdir} (\ref{mkdir}): Verzeichnisse anlegen
2004-11-05 16:20:53 +00:00
\item \texttt{mv} (\ref{mv}): Dateien verschieben
\item \texttt{rm} (\ref{rm}): Dateien l<>schen
2004-11-12 12:07:32 +00:00
\item \texttt{rmdir} (\ref{rmdir}): Verzeichnisse l<>schen
2004-11-05 16:20:53 +00:00
\item \texttt{touch} (\ref{touch}): Eine leere Datei anlegen, bzw. das Zugriffsdatum einer Datei <20>ndern
\item \texttt{xargs} (\ref{xargs}): Ausgaben eines Kommandos als Parameter eines anderen Kommandos benutzen
\end{itemize}
2004-10-28 15:44:41 +00:00
\subsection{Pipes manipulieren}\label{pipes_manipulieren}\index{Pipe|(textbf}
2002-04-09 09:44:58 +00:00
2004-10-28 15:44:41 +00:00
Das Konzept der Pipes (R<>hren) wird bereits in dem Kapitel <20>ber Befehlsformen
(\ref{befehlsformen}) vorgestellt. Im wesentlichen besteht es darin, da<64> Daten
von einem Programm an ein anderes weitergeleitet werden. Auf diese Weise
entsteht eine sogenannte \textit{Pipeline}\index{Pipeline} aus mehreren
2004-11-05 16:20:53 +00:00
Kommandos. Einige Kommandos sind f<>r den Einsatz in einem solchen Konstrukt
pr<EFBFBD>destiniert, obwohl die meisten auch alleine eingesetzt werden k<>nnen.
<EFBFBD>brigens gibt es einen goldenen Merksatz f<>r die Auswahl einiger dieser Tools:
Benutze nicht \texttt{awk}, wenn Du \texttt{sed} benutzen kannst. Benutze
nicht \texttt{sed}, wenn Du \texttt{grep} benutzen kannst. Benutze nicht
\texttt{grep}, wenn Du \texttt{cut} benutzen kannst.
Der Grund daf<61>r liegt darin, da<64> diese Programme bei jedem Einsatz gestartet
und ausgef<65>hrt werden m<>ssen. Und man sollte sich um der Performance willen den
kleinsten geeigneten Hammer nehmen.
\begin{itemize}
\item \texttt{cut} (\ref{cut}): Teile einer Zeile ausschneiden
\item \texttt{grep} (\ref{grep}): In einer Pipe suchen
\item \texttt{sed} (\ref{sed}): In einer Pipe editieren
\item \texttt{awk} (\ref{awk}): In einer Pipe editieren
\item \texttt{sort} (\ref{sort}): Zeilenweises Sortieren
\item \texttt{tee} (\ref{tee}): Datenstrom in einer Datei protokollieren
\item \texttt{wc} (\ref{wc}): Zeilen, W<>rter oder Zeichen z<>hlen
\end{itemize}
2004-10-28 15:44:41 +00:00
\index{Pipe|)}
2001-07-02 12:52:18 +00:00
2004-10-28 15:44:41 +00:00
\subsection{Proze<EFBFBD>management}\label{prozessmanagement}
2004-11-05 16:20:53 +00:00
Oft werden Shell-Skripte benutzt um Prozesse zu steuern oder zu <20>berwachen. So
werden Systemdienste <20>blicherweise <20>ber die Init-Skripte hoch- oder
heruntergefahren. Es ist auch nicht sonderlich schwer, mit einem Skript einen
`Wachhund' zu implementieren, der regelm<6C><6D>ig kontrolliert ob ein Proze<7A> noch
l<EFBFBD>uft und ihn bei bedarf nachstartet.
F<EFBFBD>r Aufgaben in diesem Bereich stehen unter anderem die folgenden Kommandos zur
Verf<EFBFBD>gung.
2004-11-05 16:20:53 +00:00
\begin{itemize}
\item \texttt{kill} (\ref{kill}): Signal an einen Proze<7A> schicken
\item \texttt{killall} (\ref{killall}): Signal an mehrere Prozesse schicken
\item \texttt{ps} (\ref{ps}): Proze<7A>liste ausgeben
\item \texttt{pgrep} (\ref{pgrep}): Bestimmte Prozesse suchen
\item \texttt{pkill} (\ref{pkill}): Bestimmte Prozesse t<>ten
\end{itemize}
2001-07-02 12:52:18 +00:00
2004-10-28 15:44:41 +00:00
\section{... und H<>mmer}\label{haemmer}
2001-09-24 16:58:06 +00:00
2004-11-12 12:07:32 +00:00
Um es noch einmal zu betonen: \textbf{Dies ist keine vollst<73>ndige
Kommandoreferenz!} Es werden nur die wichtigsten Kommandos vorgestellt, und
deren Funktion wird in den meisten F<>llen auch nur kurz angerissen. F<>r
ausgiebigere Informationen empfehle ich entsprechende B<>cher (siehe Anhang
\ref{quellen}, `Quellen') und vor allem die Man-Pages.
2004-11-05 16:20:53 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{awk}\label{awk}\index{awk=\texttt{awk}|(textbf}
2001-09-24 16:58:06 +00:00
2004-11-05 16:20:53 +00:00
TODO!!! awk
2004-11-05 16:20:53 +00:00
\index{awk=\texttt{awk}|)}
2001-09-24 16:58:06 +00:00
2004-11-05 16:20:53 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2004-10-28 15:44:41 +00:00
\subsection{basename}\label{basename}\index{basename=\texttt{basename}|(textbf}
2001-07-02 12:52:18 +00:00
2004-10-28 15:44:41 +00:00
Dem Tool \texttt{basename} wird als Parameter ein Pfad zu einer Datei
<EFBFBD>bergeben. Der in der Angabe enthaltene Pfad wird abgeschnitten, nur der Name
2004-11-05 16:20:53 +00:00
der eigentlichen Datei wird zur<75>ckgegeben. Siehe auch \texttt{dirname}
(\ref{dirname}).
2004-10-28 15:44:41 +00:00
\index{basename=\texttt{basename}|)}
2001-07-02 12:52:18 +00:00
2001-10-09 07:50:02 +00:00
2004-11-05 16:20:53 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{bc}\label{bc}\index{bc=\texttt{bc}|(textbf}
2004-11-12 12:07:32 +00:00
Bei \texttt{bc} handelt es sich, <20>hnlich wie bei \texttt{expr} um einen
Taschenrechner. Allerdings verf<72>gt dieses Kommando um eine vergleichsweise
komplexe Syntax, die auch Berechnungen mit hoher Genauigkeit zulassen.
2004-11-05 16:20:53 +00:00
2004-11-12 12:07:32 +00:00
F<EFBFBD>r einfache Grundrechenaufgaben wie das Inkrementieren von Variablen sollte
man entweder die eingebaute Arithmetik-Expansion der Shell (Siehe
\ref{arithmetikexpansion}) oder das wesentlich ressourcenfreundlichere
\texttt{expr} (Siehe \ref{expr}) benutzen.
2001-10-09 07:50:02 +00:00
2004-11-05 16:20:53 +00:00
\index{bc=\texttt{bc}|)}
2001-10-09 07:50:02 +00:00
2004-11-05 16:20:53 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2004-10-28 15:44:41 +00:00
\subsection{cat}\label{cat}\index{cat=\texttt{cat}|(textbf}
2001-10-09 07:50:02 +00:00
2004-10-28 15:44:41 +00:00
Auch \texttt{cat} ist ein oft unterbewertetes Tool. Seine Aufgabe besteht zwar
lediglich darin, etwas von der Standardeingabe oder aus einer Datei zu lesen,
und das dann auf der Standardausgabe wieder auszugeben. Allerdings leistet es
an vielen, teilweise sehr unterschiedlich gelagerten Aufgaben wertvolle
Dienste.
2001-10-09 07:50:02 +00:00
2004-10-28 15:44:41 +00:00
Durch Umlenklung der Ausgabe k<>nnen Dateien erzeugt und erweitert werden. So
k<EFBFBD>nnen mehrere Dateien per \texttt{cat datei1.txt datei2.txt > datei.txt}
verkettet werden.
2001-10-09 07:50:02 +00:00
2004-10-28 15:44:41 +00:00
Au<EFBFBD>erdem kann man mit einem Aufruf in der Art \texttt{cat datei.txt | kommando}
Daten an ein Programm <20>bergeben, das nur von der Standardeingabe lesen kann
(Filter).
2001-10-09 07:50:02 +00:00
2004-11-05 16:20:53 +00:00
\texttt{cat} verf<72>gt <20>ber eine Reihe von Parametern, um die Ausgabe zu
formatieren, so k<>nnen mit \texttt{-n} bzw. \texttt{-b} die Zeilen numeriert
2004-10-28 15:44:41 +00:00
werden, oder mit \texttt{-s} mehrere Zeilen zu einer einzigen zusammengefa<66>t
werden.
2001-10-09 07:50:02 +00:00
2004-10-28 15:44:41 +00:00
\index{cat=\texttt{cat}|)}
2001-07-02 12:52:18 +00:00
2004-11-12 12:07:32 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{chgrp}\label{chgrp}\index{chgrp=\texttt{chgrp}|(textbf}
Jede Datei geh<65>rt einem Benutzer und einer Gruppe. Letzteres l<><6C>t sich mit
\texttt{chgrp} einstellen. Als Parameter wird der Name oder die ID der Gruppe,
sowie ein oder mehrere Dateinamen <20>bergeben. Verzeichnisse k<>nnen rekursiv mit
dem Parameter \texttt{-R} bearbeitet werden.
Der Eingent<6E>mer der Datei wird mit \texttt{chown} (Abschnitt \ref{chown})
festgelegt.
\index{chgrp=\texttt{chgrp}|)}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{chmod}\label{chmod}\index{chmod=\texttt{chmod}|(textbf}
In unixoiden Systemen verf<72>gt jede Datei <20>ber eine Reihe von Attributen. Damit
kann eine Menge gemacht werden, f<>r den vollen Funktionsumfang empfiehlt sich
das Studium der Man-Page oder einer umfangreicheren Kommandoreferenz. Hier nur
das wichtigste in K<>rze:
Die Syntax lautet \texttt{chmod [options] mode file...}.
Die einzig wichtige Option ist, analog zu \texttt{chgrp} und \texttt{chown} der
Parameter \texttt{-R} f<>r die rekursive Bearbeitung von Verzeichnissen.
In der Syntax steht `file' f<>r einen oder mehrere Dateinamen.
Den Modus einer Datei sieht man, indem man \texttt{ls -l} darauf ansetzt, die
Ausgabe wird im entsprechenden Abschnitt (\ref{ls}) beschrieben.
Dort ist von den drei `rwx-Bl<42>cken' die Rede, die die Berechtigungen f<>r User
(u), Group (g) und Other (o) angeben. Genau die k<>nnen mittels \texttt{chmod}
gesteuert werden. Zus<75>tzlich gibt es hier noch die Angabe All (a), mit denen
die Rechte f<>r alle Benutzer ver<65>ndert werden k<>nnen.
Hier wird der Modus gesteuert, indem direkt angegeben wird f<>r wen welche
Rechte gelten sollen. Mit `+' werden die Rechte erweitert, `-' nimmt Rechte
und mit `=' werden die Rechte hart gesetzt.
2004-11-19 12:09:34 +00:00
\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
2004-11-12 12:07:32 +00:00
Besitzer kann lesen und schreiben, alle anderen nur lesen.
Neben dieser Art der Notation gibt es noch eine~--~wesentlich
g<EFBFBD>ngigere~--~numerische Schreibweise. Dabei werden die Berechtigungen in Form
von Zahlen angegeben. Dabei werden drei Zahlen von eins bis sieben benutzt.
Deren Bedeutung ergibt sich, wenn man sich die drei Stellen `rwx' als Bin<69>rzahl
vorstellt. Das x steht an der niederwertigsten Stelle, erh<72>lt also den Wert 1.
Das w steht f<>r die 2 und r f<>r 4. In Summe ergeben diese Zahlen die
Berechtigung. Also ist `rwx' gleichbedeutend mit 4+2+1=7. `rw' entspricht
4+2=6. Die reine Leseberechtigung `r' bleibt als 4 stehen.
Zur Verdeutlichung ein paar Beispiele, wo es m<>glich ist in beiden Notationen:
\LTXtable{\textwidth}{tab_kommandos_chmod_beispiele.tex}
Am wichtigsten sind also die Aufrufe \texttt{chmod 644 datei} und \texttt{chmod
755 datei}, je nachdem ob die Datei ausf<73>hrbar sein soll oder nicht.
\index{chmod=\texttt{chmod}|)}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{chown}\label{chown}\index{chown=\texttt{chown}|(textbf}
Mit \texttt{chown} lassen sich Benutzer- und Gruppen-ID von Dateien und
Verzeichnissen festlegen. Mit dem Parameter \texttt{-R} sogar rekursiv f<>r
Verzeichnisse.
Ein einzelner Parameter gibt die User-ID oder den Namen des zuk<75>nfigen
Benutzers an, in der Form name:gruppe k<>nnen sowohl User- als auch Gruppen-ID
gleichzeitig ge<67>ndert werden.
Will man lediglich die Gruppen-ID <20>ndern, benutzt man das Kommando
\texttt{chgrp} (Abschnitt \ref{chgrp}).
\index{chown=\texttt{chown}|)}
2004-11-05 16:20:53 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2004-11-19 12:09:34 +00:00
\subsection{chpasswd}\index{chpasswd=\texttt{chpasswd}|(textbf}
2001-07-02 12:52:18 +00:00
2004-11-05 16:20:53 +00:00
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.
Manuell <20>ndert man ein Pa<50>wort mit dem Kommando
\texttt{passwd}\index{passwd=\texttt{passwd}}, allerdings l<>scht (flusht)
dieses Programm die Standard-Eingabe, bevor es das neue Pa<50>wort erwartet. Somit
lassen sich Pa<50>w<EFBFBD>rter mit \texttt{passwd} nur interaktiv <20>ndern\footnote{Es
gibt auch einen anderen Weg: Man kann \texttt{passwd} auch mittels
\texttt{expect} fernsteuern. Allerdings ist diese Methode weniger elegant.}.
2001-07-02 12:52:18 +00:00
2004-10-28 15:44:41 +00:00
Das Kommando wird in der Form
2001-07-02 12:52:18 +00:00
2004-10-28 15:44:41 +00:00
\texttt{echo }\textit{name}\texttt{:}\textit{pass}\texttt{ | chpasswd}
2001-07-02 12:52:18 +00:00
2004-10-28 15:44:41 +00:00
aufgerufen. Es ist auch m<>glich, dem Programm eine Datei mit vielen Name /
Pa<EFBFBD>wort-Kombinationen an die Standard-Eingabe zu <20>bergeben:
2004-10-28 15:44:41 +00:00
\texttt{cat }\textit{passwoerter.txt}\texttt{ | chpasswd}
2004-10-28 15:44:41 +00:00
Allerdings sollte dabei aus Sicherheitsgr<67>nden darauf geachtet werden, da<64>
diese Datei nicht allgemein lesbar ist.
2004-10-28 15:44:41 +00:00
\index{chpasswd=\texttt{chpasswd}|)}
2004-11-05 16:20:53 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{cp}\label{cp}\index{cp=\texttt{cp}|(textbf}
Mit \texttt{cp} werden Dateien kopiert. Die wichtigsten Optionen im
Zusammenhang mit Skripten sind \texttt{-f} und \texttt{-R}. Ersteres erzwingt
(force) das Kopieren, falls an der Zielstelle schon Dateien existieren werden
sie <20>berschrieben. Letzteres erm<72>glicht ein rekursives Kopieren.
2004-11-12 12:07:32 +00:00
Verzeichnisse~--~auch leere~--~k<>nnen nur mit \texttt{-R} kopiert werden.
2004-11-05 16:20:53 +00:00
\index{cp=\texttt{cp}|)}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{cut}\label{cut}\index{cut=\texttt{cut}|(textbf}
Wie der Name (fast) schon sagt, kann man mit diesem Kommando Zeilen
zerschneiden. Mit den Parametern \texttt{-c} (Character) oder \texttt{-f}
(Field) wird bestimmt, in welcher Einheit die Schnittstellen abgesteckt werden
sollen. Falls die Zeilen in Felder zerteilt werden sollen, kann zus<75>tzlich
mittels \texttt{-d} der Delimiter, also das Trennzeichen bestimmt werden. Wird
das nicht explizit getan, wird der Tabulator benutzt.
Dieser Definition folgt die Angabe des zu behaltenden Bereichs. Daf<61>r kann eins
der Formate N, N-, N-M oder -M benutzt werden.
\LTXtable{\textwidth}{tab_kommandos_cut_beispiele.tex}
\index{cut=\texttt{cut}|)}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{dirname}\label{dirname}\index{dirname=\texttt{dirname}|(textbf}
2004-11-05 16:20:53 +00:00
Analog zu \texttt{basename} (\ref{basename}) gibt \texttt{dirname} nur die
Pfad-Komponente einer angegebenen Datei zur<75>ck.
\index{dirname=\texttt{dirname}|)}
2004-11-05 16:20:53 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2004-10-28 15:44:41 +00:00
\subsection{echo}\label{echo}\index{echo=\texttt{echo}|(textbf}
2004-10-28 15:44:41 +00:00
Dies ist wohl der grundlegendste Befehl, der in einem Skript verwendet werden
kann. Er ist die Voraussetzung, um eines der wichtigsten Werkzeuge der
Kybernetik auch mittels eines Shell-Skriptes effizient umzusetzen: Hello World.
:-)
2004-10-28 15:44:41 +00:00
Die eigentliche Aufgabe dieses Befehls d<>rfte jedem bekannt sein, der sich bis
zu dieser Stelle durchgearbeitet hat. Allerdings wissen viele nicht, da<64> auch
der echo-Befehl <20>ber Parameter verf<72>gt. Zumindest zwei davon erweisen sich in
der Praxis oft als sehr hilfreich:
2004-10-28 15:44:41 +00:00
\LTXtable{\textwidth}{tab_kommandos_echo_parameter.tex}
2004-10-28 15:44:41 +00:00
\index{echo=\texttt{echo}|)}
2001-07-02 12:52:18 +00:00
2004-11-12 12:07:32 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{eval}\label{eval}\index{eval=\texttt{eval}|(textbf}
2004-11-19 12:09:34 +00:00
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.
2004-11-12 12:07:32 +00:00
\index{eval=\texttt{eval}|)}
2004-11-05 16:20:53 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{expr}\label{expr}\index{expr=\texttt{expr}|(textbf}
2001-07-02 12:52:18 +00:00
2004-11-12 12:07:32 +00:00
Mit dem Kommando \texttt{expr} verf<72>gt die Shell praktisch <20>ber einen
Taschenrechner f<>r einfache Berechnungen. F<>r komplexe Aufgaben bietet sich das
Tool \texttt{bc} an, n<>heres dazu steht in Abschnitt \ref{bc}.
Genau genommen kann man mit \texttt{expr} nicht nur Berechnungen
durch\-f<EFBFBD>h\-ren, sondern ganz allgemein `Ausdr<64>cke evaluieren'. Damit ist
gemeint, da<64> es zum Beispiel auch Operatoren f<>r Pattern-Matching gibt. Die
wichtigsten Operatoren lauten wie folgt:
\LTXtable{\textwidth}{tab_kommandos_expr_parameter.tex}
Bei einigen Sonderzeichen ist deren Bedeutung in der Shell zu ber<65>cksichtigen,
sie sind also durch Anf<6E>hrungszeichen oder Backslashes zu quoten:
\texttt{i=`expr \$i \textbackslash{}* 3`}.
Eine andere M<>glichkeit f<>r einfache Rechnungen besteht in der sogenannten
2004-11-19 12:09:34 +00:00
Arith\-me\-tik-Ex\-pan\-sion (Siehe \ref{arithmetikexpansion}).
2002-02-25 16:17:18 +00:00
2004-11-05 16:20:53 +00:00
\index{expr=\texttt{expr}|)}
2002-02-25 16:17:18 +00:00
2001-07-02 12:52:18 +00:00
2004-11-05 16:20:53 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{find}\label{find}\index{find=\texttt{find}|(textbf}
2001-07-02 12:52:18 +00:00
2004-11-05 16:20:53 +00:00
TODO!!! find
2001-07-02 12:52:18 +00:00
2004-11-05 16:20:53 +00:00
Siehe auch: Abschnitt \ref{beispiele_suchen_dateien}.
2002-02-25 16:17:18 +00:00
2004-11-05 16:20:53 +00:00
\index{find=\texttt{find}|)}
2002-02-25 16:17:18 +00:00
2002-04-10 09:50:30 +00:00
2004-11-05 16:20:53 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{grep}\label{grep}\index{grep=\texttt{grep}|(textbf}
2002-04-10 09:50:30 +00:00
2004-11-05 16:20:53 +00:00
Das Tool \texttt{grep} stammt aus dem Standard-Repertoire eines jeden
2004-11-12 12:07:32 +00:00
Sys\-tem\-ad\-mi\-ni\-stra\-tors. Mit seiner Hilfe kann in einer oder mehreren
Dateien, oder eben auch in einem Datenstrom nach dem Auftreten bestimmter
regul<EFBFBD>rer Ausdr<64>cke (siehe \ref{mustererkennung}) gesucht werden.
2002-04-10 09:50:30 +00:00
2004-11-05 16:20:53 +00:00
Die folgende Tabelle stellt einige der vielen Parameter vor:
2002-04-10 09:50:30 +00:00
2004-11-05 16:20:53 +00:00
\LTXtable{\textwidth}{tab_kommandos_grep_parameter.tex}
2002-04-10 09:50:30 +00:00
2004-11-05 16:20:53 +00:00
Siehe auch: Abschnitt \ref{beispiele_suchen}.
2002-04-10 09:50:30 +00:00
2002-02-25 16:17:18 +00:00
\index{grep=\texttt{grep}|)}
2001-07-02 12:52:18 +00:00
2004-11-05 16:20:53 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2004-10-28 15:44:41 +00:00
\subsection{head}\label{head}\index{head=\texttt{head}|(textbf}
2001-07-02 12:52:18 +00:00
2004-10-28 15:44:41 +00:00
\texttt{head} ist das Gegenst<73>ck zu \texttt{tail} (Siehe \ref{tail}). Hier
werden allerdings nicht die letzten Zeilen angezeigt, sondern die ersten.
2001-07-02 12:52:18 +00:00
2004-10-28 15:44:41 +00:00
\index{head=\texttt{head}|)}
2001-07-02 12:52:18 +00:00
2004-11-05 16:20:53 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{kill}\label{kill}\index{kill=\texttt{kill}|(textbf}
TODO!!! kill
<EFBFBD>brigens: Die landl<64>ufige Annahme ist, da<64> man mit dem
\texttt{kill}-Kom\-man\-do Prozesse `umbringt'. Das ist zwar wahr, aber nicht
die ganze Wahrheit.
\index{kill=\texttt{kill}|)}
2001-07-02 12:52:18 +00:00
2004-11-05 16:20:53 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{killall}\label{killall}\index{killall=\texttt{killall}|(textbf}
2004-10-28 15:44:41 +00:00
2004-11-12 12:07:32 +00:00
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
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
erfolgreich versandt wurden, \texttt{-q} hingegen unterdr<64>ckt die Ausgaben.
Da ein Proze<7A> nach einem Signal nicht notwendigerweise sofort stirbt, gibt es
eine Option \texttt{-w}. Diese Veranla<6C>t \texttt{killall} zu warten, bis alle
Empf<EFBFBD>nger tot sind. Dieser Parameter ist allerdings mit Vorsicht zu genie<69>en:
Wenn der Proze<7A> sich weigert zu sterben, wartet \texttt{killall} ewig.
Eine <20>hnliche Funktionalit<69>t bietet auch das Kommando \texttt{pkill} (Abschnitt
\ref{pkill}), \texttt{killall} hat aber den Vorteil da<64> es auf mehr Systemen
zur Verf<72>gung steht.
2001-07-02 12:52:18 +00:00
2004-11-05 16:20:53 +00:00
\index{killall=\texttt{killall}|)}
2001-07-02 12:52:18 +00:00
2004-11-12 12:07:32 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{ls}\label{ls}\index{ls=\texttt{ls}|(textbf}
Die linke Spalte der Ausgabe zeigt die bestehenden Berechtigungen. Es ist ein
Block in der Form `drwxrwxrwx'. An Stelle des d k<>nnen auch andere Buchstaben
stehen, hier wird der Dateityp angegeben, also ob es sich um eine einfache
Datei (-), ein Verzeichnis (d), einen Link (l) oder <20>hnliches\footnote{Siehe
Man-Page} handelt. An Stelle der rwx-Bl<42>cke k<>nnen auch Striche stehen, die
stehen f<>r nicht gesetzte Attribute.
TODO!!! ls
\index{ls=\texttt{ls}|)}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{mkdir}\label{mkdir}\index{mkdir=\texttt{mkdir}|(textbf}
Mit diesem Kommando werden Verzeichnisse angelegt. Dabei kann mit \texttt{-m}
angegeben werden, welche Berechtigungen das Verzeichnis bekommen soll. Mit
\texttt{-p} werden bei Bedarf auch Parent-Verzeichnisse angelegt, es entsteht
also ein kompletter Pfad.
Entfernen lassen sich Verzeichnisse mit \texttt{rmdir} (Abschnitt \ref{rmdir}).
\index{mkdir=\texttt{mkdir}|)}
2004-11-05 16:20:53 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{mv}\label{mv}\index{mv=\texttt{mv}|(textbf}
2004-11-12 12:07:32 +00:00
Dateien und Verzeichnisse k<>nnen mit dem Kommando \texttt{mv} verschoben
werden. Falls am Ziel schon Dateien existieren erzwingt der Parameter
\texttt{-f} die Aktion, die alten Dateien werden <20>berschrieben. Mit \texttt{-i}
wird der Vorgang interaktiv, vor jeder Dateibewegung wird nachgefragt.
2004-11-05 16:20:53 +00:00
\index{mv=\texttt{mv}|)}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{pgrep}\label{pgrep}\index{pgrep=\texttt{pgrep}|(textbf}
2004-11-12 12:07:32 +00:00
Eine h<>ufig wiederkehrende Aufgabe ist es, zu sehen ob ein bestimmter Proze<7A>
existiert oder nicht. Falls das Kommando \texttt{pgrep} zur Verf<72>gung steht,
kannn man auf das Konstrukt mit \texttt{ps} und \texttt{grep} verzichten. Der
folgende Aufruf liefert alle Proze<7A>-IDs, deren Name httpd enth<74>lt, inclusive
des vollen Kommandos:
\texttt{pgrep -lf httpd}
<EFBFBD>ber weitere Parameter l<><6C>t sich genauer spezifizieren, wonach gesucht werden
soll, hier die wichtigsten:
\LTXtable{\textwidth}{tab_kommandos_pgrep_parameter.tex}
Die Ausgabe enth<74>lt per Default nur die Proze<7A>-IDs der Fundstellen. Diese l<><6C>t
sich als Parameter f<>r andere Programme benutzen. Das folgende Beispiel liefert
detaillierte Informationen <20>ber alle xterm-Prozesse:
\texttt{ps -fp \$(pgrep -d, -x xterm)}
2004-11-05 16:20:53 +00:00
Siehe auch: Abschnitt \ref{beispiele_suchen_prozesse}.
\index{pgrep=\texttt{pgrep}|)}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{pkill}\label{pkill}\index{pkill=\texttt{pkill}|(textbf}
2004-11-12 12:07:32 +00:00
Dieses Kommando ist eng verwandt mit \texttt{pgrep} (Siehe Abschnitt
\ref{pgrep}), es versteht im Wesentlichen die gleichen Parameter. Allerdings
werden die Fundstellen hier nicht ausgegeben. Wie der Name schon andeutet,
werden hiermit Prozesse umgebracht. Da man hier mit einem Kommando unter
Umst<EFBFBD>nden viele Prozesse beendet, sollten \textbf{die verwendeten Parameter
genau unter die Lupe} genommen werden, um `Kollateralsch<63>den' zu vermeiden. :-)
Es besteht auch die M<>glichkeit, den Prozessen andere Signale zuzuschicken,
diese Funktion wird im Abschnitt zu \texttt{kill} (\ref{kill}) n<>her
beschrieben. Das folgende Kommando veranla<6C>t beispielsweise den Syslog-Daemon,
seine Konfiguration neu einzulesen:
\texttt{pkill -HUP syslogd}
Das Kommando \texttt{killall} (Abschnitt \ref{killall}) bietet eine <20>hnliche
Funktionalit<EFBFBD>t, allerdings fehlen ihm einige Parameter. Trotzdem sollte im
Zweifel \texttt{killall} benutzt werden, da es auf mehr Systemen zur Verf<72>gung
steht.
2004-11-05 16:20:53 +00:00
\index{pkill=\texttt{pkill}|)}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{printf}\label{printf}\index{printf=\texttt{printf}|(textbf}
2004-11-19 12:09:34 +00:00
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}).
2004-11-05 16:20:53 +00:00
\index{printf=\texttt{printf}|)}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{ps}\label{ps}\index{ps=\texttt{ps}|(textbf}
TODO!!! ps
Siehe auch: Abschnitt \ref{beispiele_suchen_prozesse}.
\index{ps=\texttt{ps}|)}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2004-10-28 15:44:41 +00:00
\subsection{read}\label{read}\index{read=\texttt{read}|(textbf}
2001-07-02 12:52:18 +00:00
2004-10-28 15:44:41 +00:00
Mit dem Kommando \texttt{read} kann man Eingaben von der
Standard-Eingabe\index{Standard-Eingabe} lesen. Dabei wird <20>blicherweise einer
oder mehrere Variablennamen <20>bergeben. Dem ersten Namen wird das erste
eingegebene Wort zugewiesen, dem zweiten das zweite Wort usw. Dem letzen
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
2004-11-19 12:09:34 +00:00
alle Zeichen, die in der vordefinierten Variable
\texttt{\$IFS}\index{\$IFS=\texttt{\$IFS}} enthalten sind (siehe Abschnitt
\ref{vordefinierte_variablen}).
2002-02-25 16:17:18 +00:00
2004-10-28 15:44:41 +00:00
Wenn keine Variablennamen angegeben werden, wird die Eingabe in der Variable
\texttt{REPLY} abgelegt.
2002-02-25 16:17:18 +00:00
2004-10-28 15:44:41 +00:00
Normalerweise wird eine Eingabezeile mit einem Newline abgeschlossen. Mit dem
Parameter \texttt{-d} ist es m<>glich, ein anderes Zeilenendezeichen anzugeben.
Beispielsweise liest \texttt{read -d \dq~\dq~var} alle Zeichen bis zum ersten
Leerzeichen in die Variable \texttt{var} ein.
Wenn nur eine bestimmte Zahl von Zeichen gelesen werden soll, kann diese durch
den Parameter \texttt{-n} angegeben werden. Der Befehl \texttt{read -n 5 var}
2004-11-05 16:20:53 +00:00
liest die ersten f<>nf Zeichen in die Variable \texttt{var} ein. Demzufolge kann
ein Skript durch ein \texttt{read -n 1} dazu gebracht werden, auf einen
2004-11-12 12:07:32 +00:00
einzelnen Tastendruck~--~nicht zwingend ein Return~--~zu warten.
2004-10-28 15:44:41 +00:00
Mit dem Parameter \texttt{-p} kann man einen Prompt, also eine
Eingabeaufforderung ausgeben lassen. \texttt{read -p \dq{}Gib was ein:\dq~var}
schreibt also erst den Text \textit{Gib was ein:} auf das Terminal, bevor die
Eingaben in die Variable \texttt{var} <20>bernommen werden. Dieser Prompt wird nur
an einem interaktiven Terminal ausgegeben, also nicht in einem Skript das seine
Eingaben aus einer Datei oder aus einem Stream erh<72>lt.
Sonderzeichen k<>nnen w<>hrend der Eingabe normalerweise mittels eines Backslash
vor der Interpretation gesch<63>tzt werden. Ein Backslash vor einem Newline
bewirkt also eine mehrzeilige Eingabe. Dieses Verhalten kann mit dem Parameter
\texttt{-r} abgeschaltet werden.
Wenn die Eingabe von einem Terminal kommt und nicht auf dem Bildschirm
erscheinen soll, zum Beispiel bei Pa<50>wortabfragen, kann die Ausgabe mit dem
Parameter \texttt{-s} (Silent) unterdr<64>ckt werden.
Mit \texttt{-t} kann ein Time-Out definiert werden, nach dessen Ablauf das
Kommando mit einem Fehler abbricht. Dieser Parameter ist nur bei interaktiver
Eingabe oder beim Lesen aus einer Pipe aktiv.
Der R<>ckgabewert des \texttt{read}-Kommandos ist 0, es sei denn es trat ein
Timeout oder ein EOF auf.
\index{read=\texttt{read}|)}
2001-07-02 12:52:18 +00:00
2004-11-05 16:20:53 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{rm}\label{rm}\index{rm=\texttt{rm}|(textbf}
2004-11-12 12:07:32 +00:00
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
2004-11-19 12:09:34 +00:00
L<EFBFBD>schvorgang be\-st<EFBFBD>\-tigt werden mu<6D>. Oder rabiat, indem man mit \texttt{-f}
das L<>schen erzwingt.
2004-11-12 12:07:32 +00:00
Verzeichnisse k<>nnen mit dem Parameter \texttt{-R} entfernt werden, im
Gegensatz zu \texttt{rmdir} werden dann auch s<>mtliche enthaltenen Dateien und
Unterverzeichnisse gel<65>scht.
Die GNU-Version von \texttt{rm} unterst<73>tzt zus<75>tzlich den Parameter
\texttt{-v}, mit dem jeder L<>schvorgang ausgegeben wird.
2004-11-05 16:20:53 +00:00
\index{rm=\texttt{rm}|)}
2004-11-12 12:07:32 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{rmdir}\label{rmdir}\index{rmdir=\texttt{rmdir}|(textbf}
Mit \texttt{rmdir} werden Verzeichnisse gel<65>scht. Das funktioniert nur, wenn
sie leer sind. Mit \texttt{-p} kann ein kompletter Verzeichnispfad gel<65>scht
werden, will sagen: Alle h<>her liegenden Verzeichnisse im angegebenen Pfad
werden gel<65>scht. Voraussetzung ist hier nat<61>rlich auch, da<64> die Verzeichnisse
nichts au<61>er dem angegebenen Unterverzeichnis enthalten.
Angelegt werden Verzeichnisse mit \texttt{mkdir} (Abschnitt \ref{mkdir}),
nicht-leere Verzeichnisse k<>nnen rekursiv mit \texttt{rm -r} (Abschnitt
\ref{rm}) gel<65>scht werden.
\index{rmdir=\texttt{rmdir}|)}
2004-11-05 16:20:53 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2001-07-02 15:32:33 +00:00
\subsection{script}\label{script}\index{script=\texttt{script}|(textbf}
2001-07-02 12:52:18 +00:00
2001-07-02 15:32:33 +00:00
Dieses Kommando eignet sich vorz<72>glich f<>r das Debuggen fertiger Skripte. Man
ruft es in Verbindung mit einem Dateinamen auf. Dieser Aufruf startet eine neue
Shell, in der man beliebige Kommandos ausf<73>hren kann. Wenn man fertig ist,
beendet man den script-Befehl durch die Eingabe von \texttt{exit},
\texttt{logout} oder Druck der Tastenkombination \Ovalbox{CTRL}+\Ovalbox{d}
(EOF).
2001-07-02 15:32:33 +00:00
Script schreibt alle Ein- und Ausgaben die an dem Terminal vorgenommen werden
in die angegebene Datei. So kann man auch interaktive Skripte relativ leicht
debuggen, da sowohl Ein- als auch Ausgaben in dem Logfile sichtbar sind.
2002-03-22 15:21:32 +00:00
\index{script=\texttt{script}|)}
2001-07-02 12:52:18 +00:00
2004-10-28 15:44:41 +00:00
2004-11-05 16:20:53 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{sed}\label{sed}\index{sed=\texttt{sed}|(textbf}
TODO!!! sed
\index{sed=\texttt{sed}|)}
2001-07-02 12:52:18 +00:00
2004-11-05 16:20:53 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{seq}\label{seq}\index{seq=\texttt{seq}|(textbf}
2004-10-28 15:44:41 +00:00
2004-11-12 12:07:32 +00:00
Oft wird eine auf- oder absteigende Sequenz aufeinanderfolgender Zahlen
ben<EFBFBD>tigt, beispielsweise um eine Schleife 100 mal zu durchlaufen. Es ist nicht
sehr performant bei jedem Schleifendurchlauf hochzuz<75>hlen und dann die
entstandene Zahl mit dem Limit zu vergleichen. Daher nimmt man an der Stelle
\texttt{seq} zur Hilfe.
Die zu z<>hlenden Werte werden durch drei unterschiedliche Arten der
Parametrisierung definiert: Ein Aufruf in der Form \texttt{seq 10} gibt die
Zahlen von 1 bis 10 aus. Mit \texttt{seq 10 20} wird von 10 bis 20 gez<65>hlt, und
\texttt{seq 20 -2 10} z<>hlt in zweierschritten r<>ckw<6B>rts von 20 nach 10.
Per default kommen die Werte zeilenweise, mit dem Parameter \texttt{-s} kann
aber auch ein anderes Trennzeichen definiert werden. Will man etwas numerieren
und sp<73>ter nach den Zahlen sortieren, ist es sinnvoll wenn `schmalere' Zahlen
mit f<>hrenden Nullen aufgef<65>llt werden. Das erreicht man mit dem Parameter
\texttt{-w}.
2001-07-02 12:52:18 +00:00
2004-11-05 16:20:53 +00:00
\index{seq=\texttt{seq}|)}
2001-07-02 12:52:18 +00:00
2004-10-28 15:44:41 +00:00
2004-11-05 16:20:53 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{sleep}\label{sleep}\index{sleep=\texttt{sleep}|(textbf}
2001-07-02 12:52:18 +00:00
2004-11-12 12:07:32 +00:00
Das Kommando \texttt{sleep} veranla<6C>t die Shell, f<>r eine angegebene Zeit zu
warten. Die Zeit wird dabei in Sekunden angegeben.
In der GNU-Variante von \texttt{sleep} kann die Einheit der angegebenen
Zeitspanne durch Suffixe definiert werden: \texttt{sleep 10s} schl<68>ft zehn
Sekunden, \texttt{sleep 10m} zehn Minuten. Genauso werden Stunden (h) und Tage
(d) definiert.
Au<EFBFBD>erdem kann die GNU-Variante auch mit nicht-Integer Zeiten arbeiten:
\texttt{sleep 0.5} schl<68>ft eine halbe Sekunde.
2001-07-02 12:52:18 +00:00
2004-11-05 16:20:53 +00:00
\index{sleep=\texttt{sleep}|)}
2004-10-28 15:44:41 +00:00
2001-07-02 12:52:18 +00:00
2004-11-05 16:20:53 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{sort}\label{sort}\index{sort=\texttt{sort}|(textbf}
2001-07-02 12:52:18 +00:00
2004-11-12 12:07:32 +00:00
Mit diesem Befehl wird wie der Name schon andeutet sortiert. Wenn kein
Dateiname als Parameter angegeben wird, liest \texttt{sort} von der
Standard-Eingabe. Geschrieben wird immer auf der Standard-Ausgabe.
Man kann sich vorstellen, da<64> ein solches Kommando recht flexibel sein mu<6D>,
daher stehen eine Menge Parameter zur Verf<72>gung:
\LTXtable{\textwidth}{tab_kommandos_sort_parameter.tex}
Die Sortierung nach der Spalte (mit \texttt{-k}) ist etwas tricky. Die genaue
Syntax wird in der Man-Page mit \texttt{-k POS1[,POS2]} angegeben, das bedeutet
man mu<6D> einen Parameter angeben, man kann bei Bedarf einen zweiten angeben.
Bei der Sortierung wird dann der Bereich ab POS1, bzw. der Bereich zwischen
POS1 und POS2 ber<65>cksichtigt.
Dabei lautet die Syntax f<>r POS \texttt{F[.C][OPTS]}. Dabei gibt F die
Feldnummer an (siehe Parameter \texttt{-t}). Wenn nicht nach dem Feld an sich
sortiert werden soll, kann C die Position des Zeichens innerhalb des Feldes
angeben. Und als ob das noch nicht kompliziert genug w<>re, kann man dem ganzen
Konstrukt noch einen einbuchstabigen Parameter f<>r die Sortier-Option mitgeben.
Wenn das angegebene Feld nicht existiert wird nach der ganzen Zeile sortiert.
OK, Beispiele:
\LTXtable{\textwidth}{tab_kommandos_sort_beispiele.tex}
Weitere Parameter verr<72>t wie immer die Man-Page.
2001-07-02 12:52:18 +00:00
2004-11-05 16:20:53 +00:00
\index{sort=\texttt{sort}|)}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2004-10-28 15:44:41 +00:00
\subsection{tail}\label{tail}\index{tail=\texttt{tail}|(textbf}
2001-07-02 12:52:18 +00:00
2004-10-28 15:44:41 +00:00
Der Befehl \texttt{tail} gibt die letzten zehn Zeilen einer Datei aus. Wenn
kein Dateiname (oder ein \texttt{-}) angegeben wird, liest \texttt{tail} von
der Standard-Eingabe. Man kann die Anzahl der ausgegebenen Zeilen mit dem
2004-11-05 16:20:53 +00:00
Parameter \texttt{-n} steuern.
2004-10-28 15:44:41 +00:00
Mit dem Parameter \texttt{-f} (follow) gibt \texttt{tail} neue Zeilen aus,
sobald sie an die Datei angeh<65>ngt werden.
\index{tail=\texttt{tail}|)}
2004-11-05 16:20:53 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{tee}\label{tee}\index{tee=\texttt{tee}|(textbf}
2004-11-12 12:07:32 +00:00
Dies ist praktisch ein T-St<53>ck f<>r Pipes. \texttt{tee} liest von seiner
Standard-Eingabe, und gibt alle Eingaben direkt auf der Standard-Ausgabe wieder
aus. Nebenbei werden die Ausgaben in eine oder mehrere Dateien geschrieben.
Wenn die Ausgabedateien schon existieren, werden sie <20>berschrieben. Dieses
Verhalten kann mit dem Parameter \texttt{-a} ge<67>ndert werden.
2001-07-02 12:52:18 +00:00
2004-11-05 16:20:53 +00:00
\index{tee=\texttt{tee}|)}
2002-03-22 15:21:32 +00:00
2004-11-05 16:20:53 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2004-10-28 15:44:41 +00:00
\subsection{touch}\label{touch}\index{touch=\texttt{touch}|(textbf}
2002-03-22 15:21:32 +00:00
2004-10-28 15:44:41 +00:00
Mit diesem Kommando kann man einerseits Dateien anlegen wenn sie nicht
existieren, und andererseits die <20>nderungs- und Zugriffszeiten einer Datei
<EFBFBD>ndern. Ohne die Angabe weiterer Parameter wird die Datei erzeugt wenn sie
nicht existierte, bzw. in ihrer <20>nderungs- und Zugriffszeit auf die aktuelle
Zeit gesetzt.
2002-03-22 16:33:28 +00:00
2004-10-28 15:44:41 +00:00
Mit dem Parameter \texttt{-a} wird nur die Zugriffs-, mit \texttt{-m} nur die
<EFBFBD>nderungszeit gesetzt. Mit \texttt{-c} kann die Erstellung einer neuen Datei
unterdr<EFBFBD>ckt werden.
2002-03-22 16:33:28 +00:00
2004-10-28 15:44:41 +00:00
Die eingesetzte Zeit kann auch durch die Parameter \texttt{-t} bzw. \texttt{-d}
angegeben werden. Mit \texttt{-r} kann die Zeit der einer angegebenen
Referenzdatei angepa<70>t werden.
2002-03-22 16:33:28 +00:00
2004-10-28 15:44:41 +00:00
\index{touch=\texttt{touch}|)}
2002-03-22 16:33:28 +00:00
2002-03-22 15:21:32 +00:00
2004-11-05 16:20:53 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{wc}\label{wc}\index{wc=\texttt{wc}|(textbf}
2004-11-12 12:07:32 +00:00
Wie der Name schon suggeriert\footnote{Oder etwa nicht?!? ;-)} kann man mit
diesem Kommando W<>rter z<>hlen (word count). Gez<65>hlt wird entweder in einer
Datei, oder~--~wenn kein Dateiname angegeben wurde~--~in der Standardeingabe.
Weitaus h<>ufiger wird aber der Parameter \texttt{-l} benutzt, mit dem sich die
Zeilen z<>hlen lassen. Weiterhin kann man Bytes (\texttt{-c}) oder Zeichen
(\texttt{-m}) z<>hlen lassen.
Der Parameter \texttt{-L} gibt die L<>nge der l<>ngsten enthaltenen Zeile aus.
2004-11-05 16:20:53 +00:00
\index{wc=\texttt{wc}|)}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{who}\label{who}\index{who=\texttt{who}|(textbf}
2004-11-19 12:09:34 +00:00
Das Kommando \texttt{who} gibt eine Liste aller angemeldeten Benutzer, zusammen
mit deren aktueller Konsole und der Anmeldezeit aus.
2004-11-05 16:20:53 +00:00
\index{who=\texttt{who}|)}
2004-10-28 15:44:41 +00:00
2004-11-05 16:20:53 +00:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{xargs}\label{xargs}\index{xargs=\texttt{xargs}|(textbf}
2004-10-28 15:44:41 +00:00
2004-11-19 12:09:34 +00:00
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.
2004-10-28 15:44:41 +00:00
2004-11-05 16:20:53 +00:00
\index{xargs=\texttt{xargs}|)}