Arbeiten in der Shell

Mit einem Programm verknüpfte Dateien

Immer, wenn Sie ein Programm starten, sind damit drei Dateien verknüpft,
stdin für den Standardinput,
stdout für den Standardoutput,
stderr für den Standardfehler.
Sie finden diese Dateien in /dev

stdin, stdout, stderr umleiten

Standardinput und Standardouput sind mit Tastatur und Bildschirmanzeige verbunden, können aber mit Hilfe der unten erklärten Zeichen in eine andere Dateien oder Programme umgeleitet werden.

> Leitet den Output des Befehls in eine Datei oder ein Gerät um
>> Wie >, aber hängt neue Daten an dass Ende einer bereits existierenden Datei an,
bzw. erzeugt, diese falls diese noch nicht existiert.
2> Sendet den Fehleroutput eines Befehls an eine Datei oder ein Gerät
< Nimmt den Input eines Befehls aus einer Datei oder von einem Gerät. | Pipe-Symbol (s. unten) Beispiel : find / -name de 2> /dev0
Der Befehl find durchsucht den ganzen Verzeichnisbaum nach Dateien mit einem "de" im Namen und wirft mögliche Fehlermeldungen weg, also nach /dev0.

Befehle verbinden

Befehle, die den Standardinput lesen und in den Standartoutput schreiben können, nennt man unter Linux Filter. Solche Befehle lassen sich durch Pipes (|) mit anderen Befehlen zu einer Pipeline verbinden. Pipes nutzen den Output der ersten Befehls als Input für den nächsten.

Beispiel :
ls -l | grep root
Die Ausgabe von ls wird durch grep gefiltert. Es erscheinen nur Zeilen die "root" enthalten.

Basis-Befehle

Die hier aufgeführten Befehle können in der Regel mit vielen Optionen genutzt werden. Bitte nutzen Sie bei Bedarf und Interesse: man befehl

Fangen wir mit einem Befehl an, der bei Benutzung der manpages sehr hilfreich ist ...

apropos - sucht die Manualkurzbeschreibung in der Indexdatenbank
Syntax : apropos [Optionen] Schlüsselwort

cat - eine oder mehrere Dateien hintereinander anzeigen
Syntax : cat [-optionen] dateien
Mit dem cat-Befehl ist es möglich eine oder mehrere Dateien hintereinander anzuzeigen. Falls die Datei(en) größer als eine Bildschirmseite sind, ist der Befehl less vermutlich besser geeignet.
Eine Anwendung ist z.B.
cat datei1 datei2 > datei3

less - durchblättern einer Datei
Syntax : less [-p muster] dateien
Der less - Befehl zeigt eine Datei bildschirmweise an. Mit der Option [-p muster] zeigt less die Dateien beginnend mit der ersten Zeile an, die muster enthält.

mv -verschiebt eine Datei oder benennt sie um
Syntax : mv [Optionen] Quelle Ziel
Der Befehl mv verschiebt eine oder mehrere Datei(en) bzw. Verzeichnis(se) oder benennt sie um.
Beispiel :
mv datei1 datei2 ; benennt datei1 um in datei2
mv datei1 /home/joerg/ ; verschiebt die datei1 in das Verzeichnis /home/joerg/

cp - kopiert eine oder mehrere Dateien
Syntax : cp [Optionen] Quelle Ziel
Beispiel :
cp datei1 /home/user/tmp/ ; kopiert die datei1 in das Verzeichnis /home/user/tmp/

find - sucht nach bestimmten Dateien
Der Befehl find kann mit sehr vielen Optionen und Aktionen gekoppelt werden, die wir hier nicht beschreiben wollen.
Die häufigste Verwendung ist wohl :
find /verzeichnis -name "muster"
Damit wird verzeichnis und seine Unterverzeichnisse nach einer Datei durchsucht die muster enthält.

ls - zeigt den Inhalt eines Verzeichnisses
Wichtige Optionen sind -l und -a .
-a zeigt alle Dateien im Verzeichnis, auch die deren Name mit . beginnt
-l außer dem Namen werden der Typ, die Rechte, die Gruppe, die Größe und die Zeitmarke angezeigt

du - zeigt die Verteilung des belegten Plattenplatzes auf die Verzeichnisse
Syntax : du [Optionen] [Verzeichnis...]
Der Befehl du zeigt den belegten Plattenplatz für das Verzeichnis und für alle Unterverzeichnisse (in Kilobyte).

ps - zeigt die Prozesse mit ihrem Status an
Syntax : ps [Optionen]
Mit ps lassen sich Daten über die Prozesse in der Prozeßtabelle anzeigen. Die Prozeßtabelle wird mit einer Titelzeile ausgegeben.
Wichtige Optionen sind
-a zeigt die Prozesse aller User
-m zeigt Speichernutzung

kill - beendet einen Prozess
Syntax : kill [-Signr] Prozeßnummer
Der Befehl kill wird benutzt, um außer Kontrolle geratene (,,aufgehängte'') Prozesse, die sich nicht mehr auf normale Art beenden lassen, zu beenden. kill sendet dazu das Signal Signr an den Prozeß Prozeßnr. Standardwert ist SIGTERM (15) zum beenden des Prozesses. Es können aber auch beliebige andere Signale gesendet werden. Weil das Signal SIGTERM nicht von allen Programmen bearbeitet wird, wird ein Prozeß manchmal erst mit dem Signal SIGKILL(9) vom Kernel beendet. Der ,,normalen'' Terminierung mit SIGTERM ist aber der Vorzug zu geben, weil dadurch dem Prozeß noch die Möglichkeit gegeben wird, sich "geordnet" zu beenden. Es können nur die eigenen Prozesse beendet werden (Rechte!).
In der bash ist ein kill Kommando eingebaut, daß dieses externe Programm verdeckt, wenn nicht ausdrücklich mit dem command Shellkommando das externe Programm aufgerufen wird.

pwd - gibt den Namen des aktuellen Verzeichnisses aus

mkdir - erzeugt ein neues Verzeichnis
Syntax : mkdir [Optionen] Verzeichnis

rmdir - löscht Verzeichnisse
Syntax : rmdir [Optionen] Verzeichnis

rm - löscht Dateien
Syntax : rm [Optionen] dateien
Eine wichtige Option ist
-r der Inhalt aller Unterverzeichnisse und die Verzeichnisse werden mitgelöscht
! Vorsicht bei der Verwendung als User root !

grep - durchsucht Dateien nach Ausdrücken
Syntax : grep [Optionen] muster dateien
Der grep-Befehl zeigt Zeilen einer Datei an, die ein bestimmtes Muster (z.B. ein Wort) enthalten.
Eine häufige Anwendung von grep ist innerhalb von Pipes als Filter, z.B.
ls -l | grep joerg
Diese Pipe liefert als Ausgabe alle Zeilen der Ausgabe von ls die das Muster joerg enthalten, also u.a. auch Dateien die mir gehören.

passwd - ändert das Paßwort zum System
Syntax : passwd [Username]

lpq - die Druckerwarteschlange überprüfen
Syntax : lpq [-l] [-P drucker] [benutzer]
Mit dem lpq-Befehl können Sie sich den Status eines bestimmten Auftrages in der Druckerschlange ansehen.
- l liefert genaue Informationen über jede Datei eines Druckauftrages

lpr -Druckaufträge an die Warteschlange senden
Syntax : lpr [Optionen] [-P drucker] dateien
Der lpr-Befehl legt Druckaufträge in der Warteschlange ab.

lprm - Druckaufträge aus der Schlange entfernen
Syntax : lprm [-P drucker ] [jobs] [benutzer]
lprm entfernt Druckaufträge wieder aus der Warteschlange. jobs ist eine Liste von Jobnummern (mit lpq erhältlich), die entfernt werden sollen.

Effektiv die bash nutzen (Schleifen)

Warnung : Wenn Sie die folgenden Befehle auf Ihrem Rechner ausprobieren machen Sie zuvor eine Sicherungskopie. Erstens übernimmt der Autor keine Haftung für mögliche Tippfehler und zweitens können bei einer Variation der Befehle ein Fehler auftreten, der Ihre Daten vernichtet!

Beginnen wir mit einem sehr einfachen Beispiel. Wir wollen mit Hilfe eines geeigneten Programms einige wav-Dateien in eine neues Format konvertieren. Um ein und den selben Befehl nicht x-Mal zu tippen benutzen wir eine einfache Schleife.

for i in *.wav; do lame $i; done

Wie funktioniert das?
Der Variablen i nimmt nacheinander als Wert den Namen jeder Datei an auf die reguläre Ausdruck *.wav passt. Dieser Wert lässt sich mir $i ausgeben. done beendet dann schließlich die Schleife.
Jetzt wollen wir nicht mehr den ganzen Ausdruck/Namen verwenden, sondern nur einen Teil davon. Dieses Problem tritt recht häufig auf, z.B. sollen alle *.htm Dateien in *.html Dateien umbenannt werden. Würde man das mit Hilfe z.B. des KDE-Dateimanagers erledigen wollen, müsste man ein und den selben Arbeitsschritt für jede Datei wiederholen. Mit der Bash und einer einfachen for-Schleife geht dies effektiver.

for i in *.htm; do mv $i ${i%.*}.html; done

Wie funktioniert das?
Der neue Teil ist ja eigentlich nur ${i%.*}.html, sehen wir uns diesen also einmal genauer an. Wird ${var%ausdruck} benutzt sucht die bash die Variable i von hinter nach vorne nach diesen Ausdruck ab. Wird die fündig, trennt sie den rechten Teil vom Wert der Variablen i ab.
Beispiel :
i=/home/joerg/Entwicklung/anleitung.tex
Dann ist ${i%.*}=/home/joerg/Entwicklung/anleitung oder ${i%/*}=/home/joerg/Entwicklung usw.

Der Ausdruck ${var#ausdruck} tut das selbe von der anderen Seite aus,also vom Anfang zum Ende von i.

Jetzt kommt die letzte Steigerung in Sachen bash-Schleifen. Als Beispiel benutze ich hier ein Problem, dass sich bei der Arbeit mit an diesen Internet-Seiten Verhältnismäßig oft einstellt. Die Seiten sind bestehen aus Tabellen, das bedeutet man wenn man einen Text in einer Navigationsleiste ändern möchte muss man das in über 50 html-Dokumenten tun.
Die Lösung sieht wie folgt aus :

Verzeichnis sichern, falls ich Mist baue:

cp -r www www_sicherung
cd www/

Das ganze Verzeichnis abwärts durchsuchen und mit Hilfe von sed und einer bash-Schleifen den gewünschten String ersetzen
for i in $(find -type f -name "*.html"); do sed s/"Linux"/"Linux, *BSD und OpenSource "/g < $i > ${i-default}_ ;done

und schließlich die temporären Dateien umbenennen.

for i in *.html_; do mv $i ${i%.*}.html; done
Wie funktioniert das?
Erstens haben wir hier *.tex gegen $(find -type f -name "*.html") ausgetauscht. Dadurch sind wir nun nicht mehr auf ein Verzeichnis beschränkt, sondern können flexibler arbeiten.
sed ist ein schöner flexibler, "nicht-interaktiver" Editor, der hier einen "Suchen-und-Ersetzen"-Job erledigt. sed ist sehr flexibel und nicht so schnell zu erklären. Wenn Sie mehr über sed lernen wollen, versuchen Sie doch einfach einmal man sed. Es existiert sogar eine deutsche Manpage zu sed. < $i bedeutet, dass die Datei $i vom stdin nach sed umgeleitet wird und > ${i-default}_ das die Ausgabe in die entsprechende Temporär-Datei umgeleitet wird.