

	\documentclass[a4paper,11pt]{article}
	\usepackage{ngerman}
	\usepackage[latin1]{inputenc}
	\setlength\parskip{\medskipamount}
	\setlength\parindent{0pt}
	\begin{document}

	
 % was_ist_shell
 % Copyright Joel Garske
 % Lizenz: GFDL
 % 
 % $Name$
 % $Revision$
 % $Source$
 % SelfLinux-0.7.2
 %
 % Diese Datei ist Teil von SelfLinux http://www.selflinux.de
 %
 %%% $Id$

	\title{Was ist Shell?}


	
	    \author{Joel Garske}
	    %\url{mailto:jg-soft@web.de}
    

	\maketitle

	
	
	%\ref{../index.tex}
	
		%\ref{ueberblick.tex}
		Überblick über Linux
	\ref{was_ist_shell}

    \par{Layout}
    Alexander Fischer
	    %\url{mailto:Selflinux@tbanus.org}
    
    	\par{Lizenz}
	GFDL
 
	\tableofcontents{}

        
	\section{Allgemeines zum Thema Shell} \label{d14e54}
        
  

   \subsection{Was ist eine Shell?} \label{d14e59}
        
    

     
  \par
  
Eine Shell (engl. Muschel) ist ein Kommandozeileninterpreter. Sie
stellt einen elementaren Bestandteil eines Betriebssystems dar. Das,
was man von einer Shell sieht, ist das Prompt. In Linux sieht es
meist folgendermaßen aus (je nach System und Shell kann es
verschiedene Formen des Layouts geben):
     

     
{\bf benutzername@rechner:pfad\$}
     


     
  \par
  
Hierbei steht benutzername für den gerade angemeldeten Benutzer.
rechner ist der Name des Rechners (meist der Domain Name des
Rechners). pfad ist der Pfad, in dem sich der Benutzer gerade
befindet. \linebreak 
Steht anstelle von pfad ein {\bf \~{}}, so befindet sich der Benutzer in
seinem Heimatverzeichnis. In dieses kann übrigens auch mit {\bf cd}
gewechselt werden. \linebreak 
Meist identifiziert das {\bf \$} Zeichen den gerade angemeldeten
Benutzer als normalen Benutzer, ohne Administratorrechte. Ist der
Administrator angemeldet (Benutzer root), so wird standardmäßig
anstelle des {\bf \$} ein {\bf \#} angezeigt. 
Diese Einstellung der Zeichen wird
in den meisten Fällen bei der Installation der Shell automatisch
gemacht. Es ist aber ohne Probleme möglich, das in der
Konfigurationdatei der Shell zu verändern und es
kann auch vorkommen, das eine Distribution andere Zeichen einsetzt.
     

     
  \par
  
Das Prompt nimmt die Befehle des Benutzers entgegen und führt sie
aus (z.B. einen Verzeichniswechsel oder die Ausführung eines
Programmes) und erscheint nach Beendigung des Befehls wieder, um
Befehle entgegen zu nehmen.
     

     
  \par
  
Unter Linux gibt es mehrere Shells. Die gängigste und meist
verwendete Shell ist die bash. Des Weiteren existieren 
bsh, ash, zsh
und andere...
     

     
  \par
  
Die Shell nimmt Befehle des Benutzers entgegen, um deren
Ausführung zu veranlassen. Obwohl sie nicht direkt zum
Betriebssystem gehört, sind beide eng verknüpft.
Die Shell und die Arbeit mit der Shell 
spielt unter Linux eine
große Rolle, da es durch sie ermöglicht wird, praktisch alle
Systemvorgänge mit ihr kontrollieren und verwalten zu können.
     

     
  \par
  
Notiz für Windows-Umsteiger: Die Shell ist das, was
Windows- oder DOS-Benutzer als {\bf command.com} kennen (bspw. mit {\bf C:$\backslash$\verb+>+}
als Prompt).
     
   
 \section{Praxistips} \label{d14e154}
        
  
   \subsection{Kleine Praxis-FAQ} \label{d14e159}
        
    

     
  \par
  
Q: Wie finde ich heraus, welche Shell ich gerade benutze? \linebreak 
A: Das zeigt die Eingabe von ''{\bf echo \$0}'' (ohne die '')
     

     
  \par
  
Q: Kann ich meinen Prompt auch ändern? \linebreak 
A: Ja, durch die Eingabe von {\bf export PS1=''Mein Prompt: ''}
     
   

   \subsection{Die Befehlshistory} \label{d14e184}
        
    

     
  \par
  
Oftmals ist es nötig, bestimmte Systemvorgänge zu vereinfachen,
beziehungsweise Vorgänge zu automatisieren, um die Arbeit mit dem
System zu vereinfachen. Welcher DOS-User war z.B. nicht mit den
Nerven am Ende, als es beim Kopieren eines weit entfernten
Ordners um die Eingabe des endlos langen Pfades ging... Hier griff
man schnell zu Programmen, die einem diese Arbeit abnehmen sollten.
Das Programm, das die DOS-Benutzer unter dem Namen doskey kennen,
erleichterte auch nur geringfügig die Arbeit, denn es speicherte nur
bereits eingegebene Befehle (und auch nur bis zum Neustart). Diese
Befehlshistory ist in den meisten Linux-Shells bereits integriert.
Man kann auf sie sogar nach einem Neustart noch zugreifen.
     
   

   \subsection{Der Completer} \label{d14e199}
        
    

     
  \par
  
Die History hilft einem allerdings auch nicht bei der Eingabe eines
Pfades... Nehmen wir an, der Administrator des Systems ''Mond'' möchte
gerne die Datei
     

     
  \par
  
{\bf /home/milchstrasse/Dhc412/PldE/text.dat} nach
     

     
  \par
  
{\bf /usr/share/planetare\_datenbank/} kopieren.
     

     
  \par
  
Gibt er die Pfade manuell ein, dauert dies ggf. sehr lange.
Hier greift die Completer-Funktion der meisten (modernen)
Linux-Shells. Diese vervollständigt durch Druck auf die
TAB- (Tabulator-) Taste den Pfad nach bestem Wissen.
So reicht die Eingabe von
     

     
  \par
  
      
       \begin{tt} \begin{scriptsize} user@linux / \$ 
cp /ho TAB mil TAB Dh TAB Pl TAB te TAB /usr/sh TAB pl
TAB ENTER
        \end{scriptsize} \end{tt} \linebreak 
      
     

     
  \par
  
im Normalfall aus, um die o. g. Aktion auszuführen. TAB
steht hier für das Drücken der Tabulator-Taste. Die Leerzeichen
müssen (und dürfen) nicht eingegeben werden. Was hier im Beispiel
kompliziert aussieht, ist meist von sehr hohem Nutzen in der
täglichen Arbeit des Linux-Anwenders.
     

     
  \par
  
Machen wir das Beispiel etwas komplizierter... Nehmen wir an,
im Ordner
     

     
  \par
  
{\bf /usr/share/}
     

     
  \par
  
existiert zusätzlich zum Verzeichnis {\bf planetare\_datenbank/} noch eine
Datei mit Namen {\bf planeten.dat}.
     

     
  \par
  
Woher soll der Completer nun wissen, dass wir den Ordner
{\bf planetare\_datenbank} meinen? Ebensogut könnten wir die Datei
{\bf planeten.dat} überschreiben wollen. Um sich beim Benutzer
rückzuversichern, gibt der Completer einen Beep aus (Piepton) und
vervollständigt nur so weit, wie beide Datei/Ordnernamen
übereinstimmen (in diesem Fall bis ''{\bf planet}''). Ein zweimaliges
Drücken der TAB-Taste gibt als Hilfestellung alle Möglichkeiten auf
dem Bildschirm aus, ohne die Eingabe in der Kommandozeile
abzubrechen. Nun kann man durch die Eingabe des Buchstabens {\bf a} und
drücken der TAB-Taste sagen, dass man den Ordner
{\bf planetare\_datenbank} meint. (Ordnernamen werden generell mit
abschliessendem / vervollständigt).
     

     
  \par
  
Mit dieser Funktion lassen sich jedoch nicht nur Pfade
vervollständigen, sondern es lässt sich auch feststellen, ob ein
bestimmter Befehl existiert. Als Beispiel soll der Befehl {\bf cdrecord}
dienen... Je nach installierten Programmen kann die Ausgabe etwas
variieren.
     

     
  \par
  
Vergass man unter DOS einen Befehl, so war nur durch eine Suche oder
''blindes'' Testen die Feststellung des Befehlsnamens möglich. Unser
Beispielbenutzer hat vergessen, wie dieses verflixte Brennprogramm
heisst... Mutige Benutzer könnten ohne vorherige Eingabe am Prompt
TABTAB drücken. Dadurch werden (nach kurzer Arbeit und meist
auch nach Nachfrage) alle in den für den Nutzer sichtbaren Pfade
vorhandenen Befehle ausgegeben (alphabetisch sortiert). Wem das zu
viel war, der gebe den Anfang des Befehls ein.
     

     
  \par
  
Unser Beispielbenutzer konnte in den Unmengen Befehlen (unter
Umständen über 1000) seinen gewünschten Befehl nicht finden. Er
erinnert sich jedoch schwach an das Programm cd.... cd.... wie war
es doch gleich? Die Eingabe von {\bf cd} und anschliessendes TAB TAB
bringen wieder einige Befehle zum Vorschein, die mit {\bf cd} beginnen...
     

     
  \par
  
Noch immer nicht? Gut. er findet das Programm wider Erwarten
immernoch nicht und versucht es mit {\bf cdr} TAB TAB. In den wenigen
Befehlen hat er schnell das Programm {\bf cdrecord} gefunden.
     
   

   \subsection{Konsolenpuffer / Output History} \label{d14e354}
        
    

     
  \par
  
Sicherlich war man auch unter DOS genervt, wenn mal ein Programm
mehr Ausgabe erzeugte, als auf einem Bildschirm zu fassen war. Hier
löste man das Problem mit einer pipe ( | - engl. für Rohr) zu einem
Befehl, der die Ausgabe anpasste. Auch das ist unter Linux
möglich (dazu später mehr), jedoch nicht immer nötig. Die Arbeit
erledigt der sog. Konsolenpuffer, der einige Bildschirme der letzten
Ausgabe zwischenspeichert. ACHTUNG! Dieser Puffer wird jedoch
gelöscht, sobald man die Konsole wechselt!!! (Dies gilt nicht für
X-Terminals). Der Speicher lässt sich durch drücken der
Tastenkombinationen
SHIFT+BILD-AUF
und
SHIFT+BILD-AB
durchscrollen.
     
   

   \subsection{Ausgabeumleitung} \label{d14e382}
        
    

     
  \par
  
Wie oben schon angedeutet, kann es mitunter sinnvoll sein, die
Ausgabe eines Programms umzuleiten. Dies kann z. B. zu einem
anderen Befehl, der diese weiterverarbeitet, oder in eine Datei
(oder ein Gerät) erfolgen. Diese zwei verschiedenen Formen der
Umleitung sollen in diesem Kapitel erklärt werden.
     

      \subsubsection{Umleiten in eine Datei} \label{d14e390}
        
       

        
  \par
  
Ein typisches Problem: Wir haben ein Verzeichnis, dessen Inhalt
katalogisiert werden soll. Um Rechte und Grösse der einzelnen
Dateien festzuhalten, eignet sich das Tool {\bf ls} (welches den Befehl {\bf dir}
aus DOS ersetzt) gut, wenn man es mit dem Parameter {\bf -l} kombiniert.
(Mitunter ist dieser Schritt nicht notwendig, weil je nach
Distribution dieser Parameter als Standard eingestellt ist). Leider
(oder in den meisten Fällen glücklicherweise) gibt {\bf ls -l} seine
Ausgabe auf dem Bildschirm aus. Wie bekommen wir die Ausgabe in eine
Datei? Der Operator {\bf \verb+>+} hilft uns weiter. Er sorgt dafür, dass die
Ausgabe des Programms nicht auf den Bildschirm, sondern auf die
angegebene Datei erfolgt.
        

	
  \par
  
Ein Beispiel:
        

	
  \par
  
	 
	  \begin{tt} \begin{scriptsize} user@linux / \$ 
ls -l \verb+>+ \~{}/listing.txt
           \end{scriptsize} \end{tt} \linebreak 
	 
	

	
  \par
  
gibt den Verzeichnisinhalt des aktuellen Verzeichnisses in die Datei
{\bf listing.txt} im Heimatverzeichnis des Benutzers.
        

	
  \par
  
Die Umleitung kann auch auf Geräte erfolgen, was jedoch nur bedingt
Sinn macht. Soll z. B. die Ausgabe eines Programms direkt (nicht als
Datei) auf Diskette geschrieben werden (jeglicher bisheriger Inhalt
der Diskette geht verloren!), so wird die Ausgabe an das
Diskettenlaufwerk (im Regelfall {\bf /dev/fd0}) weitergeleitet.
        

	
  \par
  
Ein sinnloses Beispiel:
        

	
  \par
  
	 
	  \begin{tt} \begin{scriptsize} user@linux / \$ 
ls -l \verb+>+ /dev/fd0
           \end{scriptsize} \end{tt} \linebreak 
	 
	

	
  \par
  
gibt die Liste der Dateien im aktuellen Verzeichnis an das
Diskettenlaufwerk... Dieses Beispiel mach wenig Sinn, da diese Liste
praktisch nicht mehr auslesbar ist und den Inhalt der Diskette
zerstört.
        
      

      \subsubsection{Umleitung an Befehle (via Pipe)} \label{d14e453}
        
       

        
  \par
  
Wie bereits oben beschrieben kann es nötig sein, die Ausgabe einer
Datei umzuleiten, um sie besser verarbeiten zu können. Die häufigste
Anwendung ist die Weiterleitung an die Programme {\bf less} oder {\bf more}.
Diese beiden Programme sorgen dafür, dass die Ausgabe eines
Programms auch dann vollständig zu lesen ist, wenn sie sowohl
grösser als der Bildschirm, als auch grösser als der Ausgabepuffer
ist. Dies kommt besonders häufig beim Listing langer Verzeichnisse
oder ähnlichen Vorgängen vor. Ein ausführliches Listing des
Geräteordners {\bf /dev} zeigt dies anschaulich, da dieser Ordner
mitunter weit über 1500 ''Dateien'' enthält.
        

	
  \par
  
Folgendes Beispiel soll die Funktionsweise der Pipe verdeutlichen,
macht jedoch wiederum wenig Sinn:
        

	
  \par
  
	 
	  \begin{tt} \begin{scriptsize} user@linux / \$ 
ls -l /dev | less
	   \end{scriptsize} \end{tt} \linebreak 
         
	

	
  \par
  
Dieser Befehl gibt eine Liste der Geräte aus, die sich mit den
Bildlauf-Tasten BILD-AUF und BILD-AB beliebig scrollen lässt.
Die Ausgabe lässt sich mit der Taste q beenden.
        

	
  \par
  
Ein weiteres Anwendungsgebiet der Pipe ist die Suche. So lässt sich
z. B. über den Befehl {\bf grep} mit einem Befehl eine Reihe von Dateien
in einem Verzeichnis durchsuchen:
        

	
  \par
  
	 
	  \begin{tt} \begin{scriptsize} user@linux / \$ 
cat * | grep Blubberbläschen
	   \end{scriptsize} \end{tt} \linebreak 
	 
	

	
  \par
  
Diese Befehlsreihe durchsucht alle Dateien im Verzeichnis nach dem
Begriff Blubberbläschen. Anzumerken ist hier, dass {\bf grep} die Suche
unter Beachtung von Gross- und Kleinschreibung durchführt (was mit
mit dem Schalter {\bf -i} verhindern kann). Der Befehl {\bf cat} gibt in
diesem Fall den Inhalt aller Dateien nacheinander an die Pipe weiter
(normalerweise auf den Bildschirm) die zum Befehl {\bf grep} führt. Dieser
durchsucht jede einzelne Zeile nach dem Wort Blubberbläschen und
gibt die Zeilen aus, in denen das Wort vorkommt.
        
      
   

   \subsection{Der Ersetzer sed} \label{d14e535}
        
    

     
  \par
  
Eins der nützlichsten Programme in einem Linux System ist der
Ersetzer sed. Er stellt ein flexibles Tool zum Ersetzen von
Ausdrücken in Dateien dar. Ein Praktisches Beispiel: Die Firma XY
hat ihre Homepage vom Server server1.xy.de auf server2.xy.de
verlegt. In den HTML-Dateien müssen nun die vielen Links geändert
werden. Eine Möglichkeit wäre, die Dateien auf einer grafischen
Oberfläche in den Lieblingseditoren und dessen
''Ersetzen''-Funktion zu verwenden. Diese durchaus zweckdienliche
Methode für ''Mausverliebte'' hat jedoch eine schlagkräftige
Alternative. Ihr Name ist sed. Dieses einfach zu bedienende Programm
erledigt die Arbeit fast von alleine. In unserem Beispiel müssen
also alle Ausdrücke server1 in server2 umgeschrieben werden.
Dies erledigt folgender Befehl:
     

     
  \par
  
      
       \begin{tt} \begin{scriptsize} user@linux / \$ 
sed 's/server1/server2/g' dateiname.html
        \end{scriptsize} \end{tt} \linebreak 
      
     

     
  \par
  
Eine kurze Erklärung: {\bf sed} ist der Befehlsaufruf. Auf ihn folgt ein
Text, der in {\bf ''} gefasst ist. Das ist das Ersetzungsscript. Dieses
Script enthält die Informationen, was wie ersetzt werden soll...
Entschlüsseln wir es einmal:
     

     
  \par
  
{\bf s/server1/server2/g}
     

     
  \par
  
Das erste {\bf s} leitet die Ersetzung ein. Der darauffolgende {\bf /} deutet
auf den Beginn des zu ersetzenden Wortes hin. Nun kommt das zu
ersetzende Wort, gefolgt von einem weiteren {\bf /}, der das Wort angibt,
durch das ersetzt werden soll (hier server2). Der
dritte {\bf /} beendet das zu einzufügende Wort. Im allgemeinen ersetzt
sed immer nur den ersten Ausdruck, den es in einer Zeile findet. Das
{\bf g} am Ende sorgt dafür, dass auch folgende Ausdrücke, die dem
Suchmuster entsprechen ersetzt werden. Es steht für global.
     

     
  \par
  
Wer diesen Befehl einmal getestet hat, wird enttäuscht feststellen,
dass die Ausgabe der geänderten Datei auf der Konsole erfolgt. Leider
können wir nicht die Ausgabe von sed nach dateiname.html umleiten,
da die Datei ansonsten durch den Aufruf einer Endlosschleife
vernichtet würde. Wir können jedoch, wie in ''Umleiten in eine
Datei'' gelernt, die Ausgabe in eine andere Datei umleiten. Dann sieht
der Befehl so aus:
     

     
  \par
  
      
       \begin{tt} \begin{scriptsize} user@linux / \$ 
sed 's/server1/server2/g' dateiname.html \verb+>+ dateiname2.html
        \end{scriptsize} \end{tt} \linebreak 
      
     

     
  \par
  
Nun liegt die aktualisierte Fassung von dateiname.html in
dateiname2.html. Nach einer Überprüfung des Ergebnisses kann die
neue Version mittels
     

     
  \par
  
      
       \begin{tt} \begin{scriptsize} user@linux / \$ 
mv dateiname2.html dateiname.html
        \end{scriptsize} \end{tt} \linebreak 
      
     

     
  \par
  
die alte Version ersetzten. Die alte Version geht hierbei jedoch
verloren. Vorsicht ist angesagt.  Besondere Vorsicht sollte geboten
sein, wenn sich Sonderzeichen oder Operatoren in Quelle oder Ziel
der Ersetzung befinden. Beispiele hierfür sind folgende Zeichen:
     

     
  \par
  

 ! '' \$ % \& / ( ) = ? $\backslash$ . ;

     

     
  \par
  
Diese müssen im sed-Script mit vorangestelltem {\bf $\backslash$} verwendet werden,
also zum Beispiel {\bf $\backslash$$\backslash$} für einen Backslash oder {\bf $\backslash$/} für einen Slash.
Man sollte hier das Endergebnis besonders sorgfältig prüfen! \linebreak 
Ratsam ist auf jeden Fall das Lesen der Manual-Page zu sed
({\bf man sed}).
     
   
 
	\ref{inhalt.tex}


	\end{document}
	
