Donnerstag, 19. September 2013

 

Linux, Bash (POS1: 2BHIF)

Das Betriebssystem, in unserem Falle Linux, stellt eine Schnittstelle zwischen Anwendungsprogrammen und der Hardware (Tastatur, Bildschirm, Maus, Festplatten, Netzwerk,...) dar. Das Betriebssystem ist also eine virtuelle Maschine mit einfachen Aufrufen zur Bedienung der Hardware.
Eine Shell ist nun ein Anwendungsprogramm, welches Eingaben vom Benutzer in geeignete Betriebssystemaufrufe umsetzt und ggf. andere Programme aufruft (d.h. das Betriebssystem mit einem bestimmten Aufruf das Programm starten lässt).
Darstellung Shell - schalenförmig über Betriebssystem über Hardware
Auch andere Betriebssysteme haben zur Bedienung Shells: Unter Windows gibt es CMD.EXE.
Die bash ist ein Interpreter mit einer vollständigen Programmiersprache. Es können damit on-the-fly kleine Programme mit Schleifen, Abfragen etc. erstellt werden, ohne dass man einen Editor dazu bemühen muss.
Da die Eingabe über die Tastatur speziell bei langen Pfadnamen (255 Zeichen für einen Dateinamen!) sehr mühsam und fehleranfällig ist, bietet die bash einige nützliche Features:

Ergänzung der Kommandozeile

Kommandos oder Pfade brauchen nicht vollständig eingetippt werden. Meist genügen wenige Buchstaben, die dann durch Drücken der Taste TAB (Tabulator) auf den richtigen Pfad (das richtige Kommando) ergänzt werden. Falls der Pfad nicht eindeutig ergänzt werden kann, werden alle Möglichkeiten durch neuerliches Drücken von TAB angezeigt. Pfade werden immer zum nächsten Directory ergänzt oder zumindest soweit sie eindeutig sind.

History

Die letzten Befehle können mit den Cursor-Tasten ausgewählt und editiert werden.
Mit !! wird der letzte Befehl ausgeführt, mit !-2 wird der vorletzte mit !-3 der vorvorletzte usw. ausgeführt. Mit !15 wird der 15. Befehl ausgeführt.
Mit !string wird der letzte Befehl, der mit string begonnen hat, ausgeführt.
Mit !?string? wird der letzte Befehl, der string enthält ausgeführt.
Mit string1^string2 wird das letzte Kommando ausgeführt, wobei string1 durch string2ersetzt wird.
Der Befehl history zeigt eine Liste der letzten Kommandos (mit deren Nummer) an.
Durch Drücken von ^r (Strg+R) kommt man in den Kommando-Suchmmodus, d.h. es wird das letzte Kommando angezeigt, welches die im folgenden getippten Buchstaben enthält. Mit weiteren ^r kommt man zum nächsten Befehl, der die Buchstaben enthält. Mit Enter wird der Befehl ausgeführt, mit den Links- und Rechts-Pfeiltasten kann der gewählte Befehl editiert werden.
Weiteres siehe unter man bash.
Beispiele ($ stellt den Prompt dar, alles hinter # gilt als Kommentar):
$ vim Telegramme.c                    # editieren
$ gcc -o telegramme Telegramme.c      # compilieren
$ telegramme                          # ausführen
$ !v                                  # Wiederholung von vim
$ !gc                                 # neuerliches compilieren
$ !t                                  # Aufruf von telegramme

Job-Control

Ein laufendes Programm kann mit ^z (Strg-Z) unterbrochen werden. Danach kann mit der bash weitergearbeitet werden. mit dem Befehl fg kann das letzte unterbrochene Programm wieder fortgesetzt werden.
Es können auch mehrere Programme unterbrochen werden (z.B. vim wird unterbrochen, man fprintf aufgerufen, dieses Kommando wird unterbrochen usw.). Die unterbrochenen Programme können mit jobs aufgelistet werden. Ein bestimmtes gestopptes (unterbrochenes) Programm mit der Job-Nummer 2 kann mit fg %2 wieder in den Vordergrund gebracht werden.
Mit diesen Möglichkeiten kann leicht zwischen mehreren Programmen hin- und hergeschaltet werden.
Programme, die vermutlich länger ohne Eingaben vom Benutzer laufen werden, können durch Anhängen von & als Hintergrundprozesse gestartet werden. Ein Hintergrundprozess kann ebenfalls mit fg wieder in den Vordergrund gebracht werden.
Beispiel: es sollen alle C-Files gesucht werden und die Namen (Pfade) in einer Liste gespeichert werden ($ ist der Prompt, wird also nicht eingegeben):
$ find / -name '*.c' -print > c-files.txt &
[1] 3751                                                   # Job-Nummer und Prozess-ID wird angezeigt
$ vim Telegramme.c
[1]+ Done find . -name '*.c' -print >c-files.txt           # Benachrichtigung, dass Kommando fertig
$ less c-files.txt                                         # Anzeigen des Files
Obiges Kommando könnte mittels kill %1 oder kill 3751 (kill und Prozess-ID) vorzeitig abgebrochen werden.
Programme im Vordergrund können mit ^c (Strg+C) abgebrochen werden.

Befehlssyntax

Generell sind Unix-Kommandos wie folgt aufgebaut:
$ cmd [optionen] [argument]...
Die eckigen Klammern [ ] zeigen an, dass dieser Teil optional ist. Die drei Punkte ...bedeuten, dass der Teil davor mehrfach vorhanden sein kann.
Prinzipiell können immer mehrere Parameter angegeben werden. Optionen beginnen immer mit einem Minus (-) und werden von einem Buchstaben gefolgt. Mehrere Optionen können zusammengefasst werden. z.B. ls -a -l kann auch als ls -al eingegeben werden.
Viele (neuere, GNU-) Programme erlauben auch lange Optionen, d.h. ganze Wörter zur Bezeichnung einer Option. Solche Optionen beginnen mit zwei Minus (). Das Kommando findist hier eine Ausnahme (s.o.).
Beispiel: ls -l und ls –format=long geben beide den Inhalt des Verzeichnisses im langen Format aus.
Generell sind Wildcards und reguläre Ausdrücke als Argumente möglich (die Shell erweitert reguläre Ausdrücke auf Listen von Parametern, d.h. das Kommando wird dann mit einer Liste aller passenden Files aufgerufen).

Wildcards

Wildcards sind Ersetzungsmuster, die von der Shell ersetzt werden. Wenn Sie z.B. alle Dateien auflisten wollen, die mit einem 'a' beginnen, dann geben Sie echo a* ein. Es werden dann Dateien der Art aa1abcalloc.c aufgelistet, falls sie existieren. Der '*' steht fürkeinein oder mehrere beliebige Zeichen. Wenn Sie Dateien suchen, die ein 'z' enthalten, dann geben Sie echo *z* ein. Tatsächlich ändert aber die Shell die Parameterliste für den Befehl echo, d.h. die Shell erzeugt eine Liste von Dateinamen, auf die das Muster zutrifft und ruft dann erst echo auf.
Nehmen Sie an, das aktuelle Verzeichnis enthielte folgende Dateien:
a.c zahlen.c anz.c anz.h anz hello.c a.out
Wenn Sie nun
echo *z*
eingeben, erzeugt die Shell folgenden Aufruf
echo zahlen.c anz.c anz.h
und führt den Befehl aus. echo braucht sich nicht darum zu kümmern!
Die Shell versteht noch andere Musterangaben. Beispielsweise:
[aeiou]*alle Dateien, die mit einem Selbstlaut beginnen
[0-9a-h]*alle Dateien, die mit 0 bis 9 oder a bis h beginnen
??alle Dateien, die aus genau 2 Zeichen bestehen (? steht für ein Zeichen)
*.[^ch]alle Dateien, die nicht mit .c oder .h enden
\*alle Dateien, die einen Stern enthalten
Mehr dazu unter man bash.

Abkürzungen

Tilde ~
~/ ist eine Abkürzung für das Home-Verzeichnis des angemeldeten Benutzers (meist/home/user, wenn user der Loginname).
~user/ ist die Abkürzung für das Homeverzeichnis des Users user.
alias
Mit dem Befehl alias können selbst Abkürzungen zu längeren Befehlen gemacht werden:
alias md="mkdir"md ist nun eine Kurzversion von mkdir (MaKe DIRectory)
Sie können mehrere immer wieder verwendete Abkürzungen in der Datei .bashrc speichern..bashrc ist eine Datei, die automatisch beim Starten einer bash interpretiert (ausgeführt) wird.
Der Befehl alias ohne Argumente gibt die Liste der derzeit aktiven Abkürzungen aus.

Shell-Variable

Da die bash eine vollständige Programmiersprache ist, gibt es natürlich auch Variable. Diese Variable werden nicht nur für die Programmierung eingesetzt sondern auch für die Konfiguration.
Shell-Variable werden üblicherweise in Großbuchstaben geschrieben (Groß-/Kleinschreibung ist entscheidend).
Für die interaktive Verwendung wird normalerweise das Kommando export verwendet:
export PATH=~/bin:$PATH
Mit obigem Befehl wird der Suchpfad, das sind diejenigen Verzeichnisse, in denen ein Programm oder ein Kommando gespeichert ist, geändert. Es wird der Pfad ~/bin vorne angefügt. $PATH liefert den Inhalt der Variable PATH (es erfolgt reine Textersetzung).
Einige Variable sind schon vordefiniert:
$HOMEHomeverzeichnis
$SHELLdie verwendete Shell

Ein-/Ausgabeumlenkung

Die Ausgabe von Kommandos kann mit dem Größerzeichen (>) in eine Datei umgelenkt werden. Z.B.:
ls -l /usr/bin > ls.txt
Die Datei ls.txt wird erzeugt und die Ausgabe von ls darin gespeichert.
Verwendet man zwei Größerzeichen (>>), so wird die Ausgabe an die angegebene Datei angehängt.
Umgekehrt kann auch die Eingabe für ein Programm aus einer Datei erfolgen, indem man das Kleinerzeichen verwendet:
grep ^d <eingabedatei
Diese Varianten können kombiniert werden.
kommando parameter… <eingabedatei>ausgabedatei
Oft werden Kommandos direkt kombiniert, indem die Ausgabe eines Programms direkt in die Eingabe des nächsten Programms gepumpt wird. Die Programme werden mit einer pipe(pipeline) verbunden. Das dafür nötige Zeichen ist der senkrechte Strich (|):
ls -l | grep ^d
Obiger Befehl gibt alle Verzeichnisse aus, da grep mit dem Parameter ^d alle Zeilen, die mit einem 'd' beginnen, ausgibt.
Es können beliebig viele Programme mit pipes verbunden werden, es entsteht dadurch eine richtige Verarbeitungskette. Ist die Ausgabe sehr lange, so könnte im obigen Beispiel nochless verwendet werden, um in der Ausgabe blättern zu können.
ls -l | grep ^d | less
Auf diese Weise lassen sich komplexe Aufgaben einfach und effizient erledigen.
Dabei ist zu beachten, dass die Shell hier einige Arbeit übernimmt: bei der Eingabeumlenkung öffnet die Shell die Datei zum Lesen und tippt die Zeilen ein. Bei der Ausgabeumlenkung öffnet die Shell die Datei zum Schreiben und verschiebt die Ausgabe in diese Datei. Die pipe kann man sich als temporäre Datei vorstellen, in die das eine Programm schreibt und aus der das nächste Programm liest, wenngleich der Mechanismus natürlich effizienter gelöst ist.

Wichtige Kommandos

Fast alle Befehle oder Programme erlauben die Option -h-help (ein Minus) oder –help (zwei Minus) und geben dann eine Kurzhilfe aus.
ls [optionen] [path]...
Anzeigen des Inhalts von Verzeichnissen. Die wichtigsten Optionen sind: -l um alle Informationen (langes Format) anzuzeigen, -a um alle Dateien anzuzeigen (auch die versteckten)
cp src... dest
Kopieren von Dateien. Hat cp mehr als zwei Parameter, so muss der letzte Parameter ein Verzeichnis sein.
Mit der Option -r können rekursiv ganze Verzeichnisbäume kopiert werden.
mv src... dest
Umbenennen/Verschieben von Dateien (move). Hat mv mehr als zwei Parameter, so muss der letzte Parameter ein Verzeichnis sein.
rm list...
Löschen von Dateien (remove).
Mit der Option -r können rekursiv ganze Verzeichnisbäume gelöscht werden (VORSICHTrm -rf * löscht alles innerhalb und unterhalb des aktuellen Verzeichnises).
mkdir list...
Erstellen von Verzeichnissen.
cd [path]
Wechsel in das angegebene Verzeichnis. Wird kein Parameter angegeben, so wird ins Home-Verzeichnis gewechselt.
rmdir list...
Löschen von Verzeichnissen (nur leere Verzeichnisse).
cat [list...]
Ausgeben der angegebenen Dateien (die angegebenen Dateien werden auf diese Weise verkettet, da sie unmittelbar hintereinander ausgegeben werden)
less [list...]
Seitenweise Ausgabe der angegebenen Dateien
tar czf archiv.tgz list...
Ein komprimiertes Archiv mit dem Namen archiv.tgz aus den Dateien/Verzeichnissen list… erzeugen
tar xzf archiv.tgz
Das Archiv wieder auspacken
tar tzf archiv.tgz
Den Inhalt des Archivs ausgeben. tar bietet noch viel mehr Optionen und Möglichkeiten und war ursprünglich ein Programm zur Datensicherung auf Bänder (tape archiver).
file list...
gibt die Dateitypen aus. Unter UNIX haben die Datei-Endungen nicht die Bedeutung wie unter Windows, oft kann die Endung beliebig gewählt werden. Das Programm file öffnet nun die angegebenen Dateien und versucht aufgrund des Inhalts den Typ zu ermitteln.
touch list...
ändert die Zugriffszeit der angegebenen Dateien oder erzeugt diese, wenn sie nicht existieren (Dateien mit der Länge 0).
grep suchbegriff [list...]
Sucht den Suchbegriff in den gegebenen Dateien oder Standardeingabe (Eintippen oder Eingabeumlenkung). Wenn nur der Dateiname gesucht ist, der den Suchbegriff enthält, dann ist die Option -l anzugeben. Der Suchbegriff kann aus regulären Ausdrücken bestehen, wodurch man komplexe Suchmuster angeben kann. Zu beachten ist allerdings, dass viele Sonderzeichen für reguläre Ausdrücke, eine spezielle Bedeutung in der Shell haben. Sie müssen daher maskiert werden, z.B. mit vorangestelltem \ oder unter einfache Hochkomma ('). Mehr dazu unter man grep bzw. man bash.
ps
Prozessstatus, listet alle Prozesse auf, die in dieser Shell gestartet wurden.
ps axu
listet alle Prozesse, aller User plus Zusatzinformationen auf. Die erste Spalte enthält den Usernamen, die zweite Spalte die Prozess-ID (PID) und die letzte Spalte den genauen Befehl.
kill [signal] pid...
Schickt den angegebenen Prozessen das TERM-Signal (Terminieren). Die wichtigen Signale sind:
-TERM-KILL (tötet den Prozess auf alle Fälle)
killall [signal] name...
Schickt den angegebenen Prozessen das TERM-Signal (Terminieren). Die Prozesse werden durch den Befehlsnamen name (aufgerufenes Kommando) ausgewählt.
Will man z.B. alle mozilla-Prozesse killen, gibt man killall mozilla ein.
sort [list...]
gibt die Zeilen der angegebenen Dateien sortiert aus (bzw. die Zeilen der Standardeingabe).
uniq [eingabedatei] [ausgabedatei]
löscht doppelte Zeilen aus einer sortierten Eingabe.

Fortgeschrittenes

Es gibt mehrere Möglichkeiten, aus der Ausgabe eines Programms Argumente für die Kommandozeile zu machen.
  1. Backticks:
    $ ls `echo $HOME`
    Hier wird zunächst der Befehl echo $HOME ausgeführt und dessen Ausgabe wird zum Argument des Befehls ls (das Home-Verzeichnis wird aufgelistet).
  2. xargs
    Das ist ein Programm, das von der Standardeingabe zeilenweise liest und jede Zeile als ein Kommandozeilenargument an das xargs übergebene Programm übergibt. Obiges Beispiel kann man also auch so schreiben:
    echo $HOME|xargs ls

Hilfe

UNIX-Systeme werden normalerweise mit ausführlicher Online-Dokumentation ausgeliefert. Die Standarddokumentation entspricht den gedruckten Handbüchern und ist in mehrere Abschnitte eingeteilt:
1 Ausführbare Programme oder Shellbefehle
2 Systemaufrufe (Kernelfunktionen)
3 Bibliotheksaufrufe (Funktionen in System-Bibliotheken)
4 Spezielle Dateien (gewöhnlich in /dev)
5 Dateiformate und Konventionen, z. B. /etc/passwd
6 Spiele
7 Makropakete und Konventionen, z. B. man(7), groff(7)
8 Systemadministrationsbefehle (in der Regel nur für root)
9 Kernelroutinen [Nicht Standard]
n neu [veraltet]
l lokal [veraltet]
p öffentlich [veraltet]
o alt [veraltet]
Zu jedem Befehl (Thema) gibt es eine Seite (können auch mehrere Seiten sein) mit dem Namen des Befehls (Themas). Will man eine bestimmte Seite des Manuals lesen, so verwendet man den Befehl man (manual):
man [abschnitt] seite
Wird abschnitt weggelassen, so zeigt man die passende Seite mit der niedrigsten Abschnittsnummer an. Oft gibt es zu einem Thema in mehreren Abschnitten eine Seite. Dann muss der gewünschte Abschnitt angegeben werden.
Beispiele:
man manHilfe zu man
man bashHilfe zur bash
man tarHilfe zu tar
man printfHilfe zu printf der Shell
man 3 printfMeist will man aber Hilfe zur C-Funktion printf
Oft weiß man nicht genau, welche Manualseite man braucht. Mit man -k schlüsselwort kann man nach Schlüsselworten suchen lassen. Die Ausgabe ist eine Liste der Befehle, auf die das Schlüsselwort zutrifft.
apropos schlüsselwort sucht nach Schlüsselworten in der Indexdatenbank der Manualseiten.
Für GNU-Programme hat sich die Dokumentation im info-Format eingebürgert:
info seite

Weitere Informationen

Fragen

1. Was ist eine Shell?
2. Geben Sie Beispiele verschiedener Shells!
3. Wie wird die Eingabe von langen Pfaden bei der bash erleichtert?
4. Welche Möglichkeiten gibt es frühere Befehle wieder zu verwenden? Nennen Sie 3 Arten!
5. Wie können in einer Shell mehrere Programme so gestartet werden, dass sie gleichzeitig laufen?
6. Wie funktioniert Job-Control? Was ist der Zweck?
7. Was sind Shell-Variable? Nennen Sie zwei Beispiele für die Verwendung!
8. Wie sieht die allgemeine Befehlssyntax aus?
9. Welche Bedeutung hat das Symbol ~ ?
10. Was können Sie tun, damit Sie statt ls das Kommandos dir verwenden können?
11. Was müssen Sie tun, damit dir auch beim nächsten Mal wieder funktioniert?
12. Was können Sie tun, wenn ein Programm keine Dateien lesen/schreiben kann, Sie aber mit diesem Programm dennoch Dateien bearbeiten wollen?
13. Sie haben 3 Dateien adr1adr2 und adr3, welche Zeilen mit Namen und e-Mail-Adressen enthalten. Eine Zeile hat die Form name vorname email. Die Einträge sind nicht sortiert. Manche Namen kommen nur in einer Datei vor, andere in mehreren Dateien. Geben Sie die Kommandozeile an, die alle 3 Dateien verknüpft, sortiert, die doppelten Namen löscht und in die Datei adr ausgibt. Welcher Mechanismus muss hier verwendet werden?
14. Sie haben ein Programm myprog gestartet, welches hängen geblieben ist. Welche Möglichkeiten haben Sie, das Programm zu beenden?
15. Sie wollen wissen, welche C- oder Java-Datei im aktuellen Verzeichnis die Funktionlongjmp enthält. Geben Sie das Kommando an! Was passiert hier genau?
16. Sie wissen nicht genau, wie Befehl zum Archivieren/Zippen von Dateien heißt. Wie finden Sie die Information?

Labels: ,


Kommentare:

Kommentar veröffentlichen

Abonnieren Kommentare zum Post [Atom]





<< Startseite

This page is powered by Blogger. Isn't yours?

Abonnieren Posts [Atom]