.: linux - shell :.
 
abyter.de \\ workshops

Einführung
Auch wenn manche die textbasierende Kommunikation mit dem Betriebssystem für veraltet halten, sie hat doch einen riesigen Vorteil: Sie ist sehr schnell. Unter Linux kann man mit der bash (der Kommandozeile unter Linux) Befehle sehr viel schneller geben, als wenn man due Programm erst suchen müsste. Außerdem stehen einem mehr und detaillierte Möglichkeiten mit der bash zur Verfügung. bash steht übrigens für bourne again shell
Und so sieht die bash aus:

bash

Was ist eine Shell?
Vielleicht können sich jetzt nicht alle etwas unter einer Shell vorstellen. Die Shell ist eine Benutzerschnittstelle zwischen dem Anwender und den Linuxsystem - eigentlich genauso wie ein Fenster in der KDE. Der einzige Unterschied zu dem Fenster in der KDE ist, dass die Kommunikation vollkommen textbasierend stattfindet. Die Shell ist hierbei genau genommen ein Interpreter für Anweisungen die der Benutzer eingibt und die dann von der Shell ausgeführt werden sollen.
Daneben steht einem mit der Shell auch noch eine Art Programmiersprache zur Verfügung, mit der man Aktionen unter Linux automatisieren kann. Diese sogenannten Shellscripts ermöglichen differenzierte Einscheidungsstrukturen wie Bedingungsabfragen. Diese Shell-Scripts sind die batch-files unter Linux.

Einsatzbeispiel
Kleines Beispiel gefällt? Sie wollen ein Inhaltsverzeichnis für die selbsterstellte CD-ROM ausdrucken. Nun könnten Sie in den Konqueror gehen und dort den Verzeichnisbaum in OpenOffice kopieren. Oder aber sie gehen in die bash und geben ls -R | lpr ein, nun wird die Ausgabe des ls-Befehls (Liste alle Dateien auf der CD-ROM) an den Drucker weitergeleitet. Wollen Sie etwas mehr Komfort beim Drucken, so setzten Sie hinter die Pipe (|) statt der Warteschlange lpr den kprinter. Mit dem kprinter erhalten Sie vollen Zugriff auf den Drucken-Dialog von KDE.

Einführung in die Arbeit mit der bash
Nach dem kleinen Beispiel, das einem die Vorteile des Einsatzes der Kommandozeile verdeutlichen sollte, wollen wir uns nun mal erst mit dem Aufbau der bash befassen.
Wenn man die bash gestartet hat, bekommt man eine Zeile präsentiert, die auf Eingaben wartet. Doch was bedeutet eigentlich das komische Schlangenzeichen (~) am Anfang der Promptzeile? Nun, da Linux ein Betriebssystem ist, dass streng nach Benutzer und root trennt, gibt es auch in der bash einen Unterschied: das Schlangenzeichen bedeutet, dass alle Kommandos als normaler User ausgeführt werden.
Wenn das Rautenzeichen (#) dort steht, werden die Kommandos als root ausgeführt. Auf die zahllosen Kommandos, die man mit Linux ausführen kann werde ich später nochmals genauer eingehen.

Tricks für die Arbeit mit der bash
Reicht der Platz in der Zeile nicht aus, werden die Kommandozeilen mit dem Zeichen \ getrennt. Soll das Programm im Hintergrund ausgeführt werden und sofort in der Shell weitergearbeitet werden, so ist an das Ende der Zeile folgendes Zeichen anzuhängen: &
Mit den Tasten [Pfeil-auf] und [Pfeil-ab] können die eingegebenen Kommandos nach der Eingabe nochmals bearbeitet werden. Was noch besser ist: Die Kommandos werden beim Verlassen der Shell gespeichert und sind somit beim nächsten Mal noch verfügbar.
Die sogenannte automatische Expansion von Kommando- und Dateinamen hilft einem als Benutzer ungemein weiter! Man gibt einfach den Anfang des gesuchten Befehls oder des Dateinamens ein und druckt dann [Tab]; nun versucht die Shell die Eingabe zu vervollständigen, ist die Eingabe eindeutig ergänzbar, so wird der Befehls- oder Dateiname ergänzt. Ansonsten fördert ein nochmaliger Druck auf [Tab] eine Liste aller möglichen Befehle und Dateinamen zu Tage.
Zur Vervollständigung des eingegebenen Kommandos durchsucht die bash alle Verzeichnisse nach ausführbaren Programmen; bei Dateien wird nur das aktuelle Verzeichnis durchsucht. Wenn man natürlich den Pfad mit angibt, können auch Dateien innerhalb des Pfades gefunden werden. Damit Programme aus dem aktuellen Verzeichnis ausgeführt werden können, muss "./" vor den Befehl geschrieben werden.
Das Homeverzeichnis wird mit der Tilde (~ ([Alt]+[+])) abgekürzt, mit cd wird auch automatisch ins Home-Verzeichnis zurückgewechselt.

Tastenkürzel
Mit [Alt]+[B] bzw. [Alt]+[F] kann man den Cursor um ein Wort rück- bzw. vorwärts bewegen. Mit [Alt]+[D] wird das aktuelle Wort gelöscht; mit [Strg]+[K] wird alles bis zum Ende der Zeile gelöscht. Mit [Strg]+[T] kann man die beiden vorangehenden Zeichen vertauschen; mit [Alt]+[T] kann man das gleiche für Wörter machen lassen. Mit [Strg]+[L] kann man den Bildschirm löschen lassen.
Mit [Strg]+[R] kann man nach einem früher eingegeben Kommando suchen lassen. Das funktioniert so: Sie drücken am Beginn der Zeile [Strg]+[R] und geben dann die Anfangsbuchstaben des gesuchten Kommandos ein, daraufhin wird das letzt-genutzte passende Kommandos angezeigt (es wird also mit den jüngsten Kommandos begonnen). Mit [Strg]+[S] kann man das Gleiche für die entgegengesetzte Richtung durchführen lassen (es wird also mit den ältesten Kommandos begonnen). [Enter], [Tab] oder die Cursortasten brechen die Suche wieder ab und führen das gefundene Kommando aus, bzw. ermöglichen das Editieren der Selbigen.
Wenn man sehr oft auf ein besonderes Verzeichnis zugreifen muss, dass aber sehr lange ist, lohnt es sich mittels alias eine Abkürzung für den Zugriff das Verzeichnis zu definieren. Wenn Sie also einmalig alias verz='cd ~martin/home/working' eingeben, können Sie zukünftig mit dem Befehl verz auf das definierte Verzeichnis zugreifen ohne jedes Mal den langen Befehl eingeben zu müssen.

Ein- und Ausgabeumleitung
Die bash bietet ein Feature, das sie sehr mächtig macht! Mit der Ein- oder Ausgabeumleitung kann man die Eingabe- bzw. die Ausgabeströme eines Programme umleiten, so dass z.B. die Ausgaben des Programms nicht wie gewöhlich auf dem Bildschirm erscheinen, sondern an ein anderes Programm weitergeleitet werden, dass diese dann z.B. in einer Datei speichert, bzw. ausdruckt. So etwas haben wir beim Eingangsbeispiel gemacht.
Für die Umleitung der Ein- und Ausgabeströme existieren mehrere Operatoren, die man für den jeweiligen Einsatzzweck nutzen kann.

Befehl Wirkung
befehl > datei leitet Ausgaben zur angegeben Datei
befehl < datei liest Eingaben aus der angegebenen Datei
befehl 2> datei leitet Fehlermeldungen in die angegebene Datei
befehl >& datei leitet Ausgaben und Fehler in eine Datei um
befehl >> datei hängt die Ausgaben an die vorhandene Datei an

Will man die Ausgabe nicht in eine Datei umleiten, sondern an ein Programm weiterreichen, so ist der Pipe-Operator (|) den Sie schon aus dem Eingangsbeispiel kennen erforderlich. Mit dem Pipe-Operator wird die Ausgabe des ersten Kommandos als Eingabe für das zweite Kommando verwendet.
Auch wenn man die Eingaben nicht an ein anderes Programm weiterleiten möchte, dass die Dateien als Parameter nutzt um zu einem Ergebnis zu kommen, lohnt sich der Einsatz von Pipes. Leitet man die Ausgabe an less (kommando | less) weiter so werden die Ergebnisse übersichtlich angeordnet, so dass man mit den Pfeiltasten durch die Ausgabe navigieren kann. Wenn man die Ausgabe an sort (kommando | sort) weiterleitet, so wird das Ergebnis alphabetisch sortiert.
Der Einsatz der Pipe ist jedoch beschränkt: Man kann nur die Ausgaben an ein anderes Programm weiterleiten, wenn es Eingaben über die Standardeingabe erwartet, d.h. wenn man die Ausgabe des anderen Programm genauso gut von Hand in das andere Programm eingeben könnte (wenn man also bei der Laufzeit etwas eingeben müsste). Was man tut, wenn das Programm auf das man umleitet möchte keine Standardeingaben erwartet, das erfahren Sie weiter unten bei Kommandosubstitution.
Möchte man die Ausgaben zwar in einer Datei gespeichert haben, aber trotzdem auf dem Bildschirm angezeigt bekommen, so ist das Kommando tee nötigt, das folgendermaßen eingesetzt wird: kommando | tee datei
Das Ergebnis wird wie gewohnt am Bildschirm angezeigt, jedoch zusätzlich in der Datei datei gespeichert. Faktisch findet eine Vervielfachung der Ausgabe statt, weshalb man statt in eine Datei auf auf einen Befehl umleiten kann, also z.B. so:
kommando1 | tee datei1 | kommando2

Hier werden die Ausgaben des ersten Kommandos in Datei1 gespeichert und gleichzeitig auch an kommando2 weitergeleitet.

Kommandoausführung
Normalerweise startet man Programme ganz einfach durch Eingabe des vollständigen Kommandos. Es gibt jedoch noch einige Sonderzeichen mit denen man Einfluss auf die Ausführung nehmen kann.
Da wäre das Sonderzeichen & das man hinter den Befehl schreibt (also so: befehl &), dies bewirkt, dass das Programm im Hintergrund ausgeführt wird und man während der Laufzeit des Programms noch weiterhin mit der Shell arbeiten kann. Dies ist besonders bei zeitaufwendigen Programmen wie z.B. find sehr nützlich. Die Shell gibt auch noch die PID-Nummer des Prozesses aus, so dass man im Falle dass es doch sehr lange dauert den Prozess mit kill PID abschießen kann. Wenn man das & vergessen hat, kann man mit [Strg]+[Z] das Programm unterbrechen und durch Eingabe von bg als Hintergrundprozess fortsetzen.
Nach dem &-Zeichen kann auch ein weiteres Kommando eingegeben werden. In diesem Fall wird das erste Kommando wie schon erwähnt im Hintergrund, das zweite dagegen im Vordergrund ausgeführt.
Wenn man statt des &-Zeichens ein Semikolon (;) angibt (also so kommando1; kommando2), dann werden die Kommandos beide nacheinander im Vordergrund ausgeführt. Möchte man nun die beiden Kommandos wie eben beschrieben nacheinander ausführen und das Ergebnis in eine Datei schreiben lassen, so ist der Befehl folgendermaßen zu schreiben:
(kommando1; kommando2) > datei

Mit den Zeichenkombinationen && und || können Kommandos bedingt ausgeführt werden, also in Abhängigkeit des Ergebnisses eines anderen Kommandos.
So führt kommando1 && kommando2 nur dann kommando2 aus, wenn kommando1 erfolgreich ausgeführt werden konnte, d.h. keine Fehler aufgetreten sind.
Die Befehlskombination kommando1 || kommando2 bewirkt genau das Gegenteil. Hier wird nur dann kommando2 ausgeführt, wenn bei kommando1 ein Fehler aufgetreten ist, die Ausführung also nicht erfolgreich war.

Substitutionsmechanismen
Ein Substitutionsmechanismus hilft dem Anwender, in dem durch Sonderzeichen gebildete Kommandos durch ihre Ergebnisse ersetzt werden. Das soll heißen, dass z.B. bei dem Kommando ls *.gif alle GIF-Bilder aufgelistet werden, also *.gif durch die Liste der passenden Dateien ersetzt wird. Das Kommando ls bekommt also eine Liste mit realen Dateinamen übergeben und nicht etwa *.gif.
Ich möchte im Folgenden einige Möglichkeiten vorstellen, die auf ähnliche Art und Weise funktionieren und einem die Arbeit ungemein vereinfachen.
Die wichtigsten Substitutionsmaßnahmen sind: Jokerzeichen zur Bildung von Dateinamen, geschweifte Klammern zum Zusammensetzen von Zeichenketten, eckige Klammern zur Berechnung arithmetischer Klammern und umgekehrte Apostrophe zur Kommandosubstitution.

Jokerzeichen / eckige Klammern
Bei der Dateinamenbildung mittels Jokerzeichen ist die bash das magische Tool das dafür sorgt, dass eine Liste der Dateien an das Programm übergeben wird, wenn Jokerzeichen eingesetzt werden. Die Shell durchsucht das aktuelle Verzeichnis nach passenden Dateien und ersetzt den Ausdruck mit den Jokerzeichen durch die entsprechenden Dateinamen.
Als Jokerzeichen sind ? (genau ein beliebiges Zeichen) und * (beliebig viele (auch null) beliebige Zeichen) erlaubt. ~ kann als Abkürzung für das Home-Verzeichnis verwendet werden.
Man sollte mit den Jokerzeichen jedoch vorsichtig umgehen: Das Kommando ls * liefert eine schier endlose Liste an Dateinamen, auch wenn das aktuelle Verzeichnis eigentlich nur sehr wenige Dateien enthält. Der Grund ist die Tatsache, dass die bash an das Programm eine Liste aller Dateien und Verzeichnisse übergibt. ls zeigt aber bei Verzeichnissen nicht einfach nur deren Namen an, sondern löst diese auch noch auf und zeigt darum auch noch die Namen aller Dateien der Unterverzeichnisse an. Will man dies verhindern, so muss man bei dem ls Befehl noch den Parameter -d anhängen.
Die Zeichenkette m[ai, ey, ei, ay]er.eml steht für alle eml-Dateinamen, auf irgendeine Weise den berühmt-berücktigten Nachnamen bezeichnen (also maier, meyer, meier, mayer). Wenn als erstes Zeichen innerhalb der eckigen Klammern ^ oder ! angegeben wird, dann sind alle Zeichen außer den angegebenen Zeichen zulässig.

geschweifte Klammern
Die bash setzt aus Zeichenketten, die in geschweiften Klammern angegeben werden, alle denkbaren Zeichenkombinationen (Permutationen) zusammen. Die offizielle Bezeichnung für diesen Substitutionsmechanismus lautet "Klammererweiterung". Aus datei{1,2,3}_{1,2,3} wird datei1_1, datei1_2, datei1_3, datei2_1, datei2_2, datei2_3, datei3_1, datei3_2, datei3_3
Klammererweiterungen haben gegenüber den Jokerzeichen * und ? den Vorteil, dass auch noch nicht existierende Dateinamen gebildet werden können (z.B. für mkdir zur Erstellung von Verzeichnissen).

Berechnung arithmetischer Ausdrücke in eckigen Klammern
Die bash ist normalerweise nicht in der Lage Berechnungen durchzuführen. Wenn man 45-34 eingibt, dann weiß die bash nicht, was sie mit diesem Ausdruck anfangen soll. Wenn Sie also innerhalb der bash eine Berechnung durchführen möchten, so müssen Sie den Ausdruck in eckige Klammern setzen und ein $-Zeichen voranstellen.
Innerhalb der eckigen Klammern sind die meisten aus der Programmiersprache C bekannten Operatoren erlaubt: +, -, *, / und % für Modulo-Berechnung (Teilungsrest), ==, !=, <, >, <= und >= für Vergleiche, << und >> für Bitverschiebungen, !, && und || für logisches NOT, AND und OR. Dabei werden alle Berechnungen für 32-bit Integerzahlen durchgeführt.

Kommandosubstitution
Die Kommandosubstitution ermöglicht es, ein Kommando innerhalb der Kommandozeile durch dessen Ergebnis zu ersetzen. Dazu muss das Kommando folgendermaßen geschrieben werden: $(kommando)
Das so gekennzeichnete Kommando wird also durch sein Ergebnis ersetzt. Diese Substitution ermöglicht den verschachtelten Aufruf mehrerer Kommandos, wobei ein Kommando sein Ergebnis an das andere Kommando übergibt.
Wenn man diese Beschreibung so hört, so kann man denken: "Hmm.. das kommt mir irgendwie bekannt vor! Kann dafür nicht genauso gut die Pipe nehmen?"
Naja, die Pipe hat ein Problem, dass ich schon bei dessen Beschreibung erwähnt habe: Sie funktioniert nur, wenn das Programm auf das umgeleitet werden soll Standardeingaben erwartet!
Ein solches Programm dass keine Standardeingaben erwartet ist ls! Folgendes Kommando wäre z.B. mit der Pipe nicht möglich:
ls -lgo $(find ~/hp/abyter -name 'index*')

Zuerst wird find ~/hp/abyter -name 'index*' ausgeführt, das Ergebnis - eine Liste aller Dateien im Verzeichnis ~/hp/abyter, in denen die Zeichenkette index vorkommt - wird in die Kommandozeile eingesetzt und von ls verarbeitet. Das Ergebnis ist eine detaillierte Anzeige aller Informationen über die index*-Dateien.

Alternativen zur Kommandosubstitution
Wem das eben zu kryptisch war und der lieber mit der Pipe arbeitet, der kann sich mit einem zusätzlichen Kommando behelfen. Durch die Zuhilfenahme des Kommandos xargs werden Dateien aus der Standardeingabe an das nach xargs angegebene Kommando weitergeleitet. Unser Kommando aus der Kommandosubstitution müsste also folgendermaßen aussehen:
find ~/hp/abyter -name 'index*' | xargs ls -lgo

Ein wesentlicher Vorteil von xargs ist außerdem, dass es kein Größenlimit für die zu verarbeitenden Daten gibt. Die Kommandosubstitution ist durch die maximale Größe der Kommandozeile - üblicherweise mehrere 1000 Zeichen - begrenzt.

Sonderzeichen in Zeichenketten
Wenn man die Möglichkeiten der bash bisher verfolgt hat, wird einem aufgefallen sein, dass nahezu jedes Sonderzeichen eine Funktion in der bash hat. Was aber ist zu tun, wenn man genau eines dieser Zeichen benötigt, jedoch nicht um damit Funktionen auszulösen, sondern um es in Zeichenketten einzusetzen?
Das Problem lässt sich auf zwei verschiedene Weisen lösen: Zum einen kann man dem Sonderzeichen einen Backslash \ voranstellen, oder die gesamte Zeichenkette in Anführungszeichen setzen. Nun wird man sich folgerichtig fragen: "Was mache ich, wenn ich jetzt den backslash verwenden will?" Für diesen Fall und für die Sonderzeichen $ und ´ ist die Zeichenkette in Apostrophe (') zu setzen.

Wichtige Shell-Variablen
Es gibt einige Shell-Variablen, die in der bash bereits belegt sind und auf die man immer zugreifen kann. Auf die Shellvariablen wird zugegriffen indem man dem Variablennamen ein Dollarzeichen voranstellen, also so: $PATH
An wichtigen Shellvariablen existieren: LOGNAME enthält den Login-Namen (user name), HOSTNAME enthält den Hostnamen (Rechnernamen), MAIL enthält den Pfad des Verzeichnisses, in dem ankommende Mails gespeichert werden, OLDPWD enthält den Pfad des zuletzt aktiven Verzeichnisses, PATH enthält eine Liste an Verzeichnissen, die die bash durchsucht, wenn ein Kommando eingegeben wird oder Substitutionsmaßnahmen eingesetzt werden, PROMPT_COMMAND kann ein Kommando enthalten, das jedes Mal ausgeführt wird, bevor die bash den Kommandoprompt anzeigt, PWD enthält den Pfad des aktuellen Verzeichnisses.
Wer noch weitere Shellvariablen wissen möchte, der sollte sich diese mal von der bash ausgeben lassen, in dem er printenv | sort eingibt; daraufhin werden die Shellvariablen alphabetisch ausgegeben.

Related Workshops: Linux - Einführung \\ Linux - Installation \\ Arbeiten mit Linux \\ Linux im Netzwerk \\ Brennen mit Linux \\ Emacs \\ Linux-Befehle
Related Files: SSH-Client für Win

<Zurück

© by www.abyter.de (Martin Monshausen)