Einleitung

Hinweis: Diese Einführung orientiert sich an http://www.ee.surrey.ac.uk/Teaching/Unix/index.html. Viele Stellen sind ziemlich wörtlich übernommen und sind nicht noch einmal gekennzeichnet.

Linux ist eines von mehreren “Unix-artigen” Betriebssystemen. Ein anderes ist z.B. Mac OS X.

Es gibt verschiedene Linux-“Distributionen”, in denen das eigentliche Betriebssystem (“Kernel”) zusammen mit Programmen, Treibern, etc. zur Verfügung gestellt wird.

Zum Beispiel:

Im CIP-Pool ist Debian installiert.

Linux ist ein “Multi-User”-Betriebssystem, z.B. im CIP-Pool: Das Betriebssystem läuft auf einem Server, und mehrere Benutzer können sich gleichzeitig anmelden und es benutzen.

Begriffserklärung: Shell, Terminal, etc.

Eine “Shell” ist ein Programm, das Befehle vom Benutzer entgegennimmt, das Betriebssystem veranlasst, den Befehl auszuführen, und das Ergebnis an den Benutzer zurückgibt.

(Ein ausgeführter Befehl ist ebenfalls ein Programm.)

Im CIP-Pool wird standardmäßig die Shell “Bash” verwendet (es gibt auch andere).

Ein “Terminal” ist ein Gerät, mit dem man Befehle eingeben und die Ergebnisse betrachten kann.

(Weiterführende Informationen z. B. hier und hier.)

Ein echtes Terminal.
(Bild: Wikipedia)

Heutzutage ist mit “Terminal” meistens auch ein Programm mit grafischer Benutzeroberfläche gemeint (genaugenommen handelt es sich um einen “Terminal-Emulator”).

Beispiele für Terminals:

  • GNOME-Terminal (unter der Gnome-Oberfläche im Menü: Anwendungen → Systemwerkzeuge → Terminal)

  • Konsole (Anwendungen → Systemwerkzeuge → Konsole)

Befehle in einem Terminal ausführen

Es wird eine Eingabeaufforderung angezeigt (“Prompt”), z.B.:

me119@physik5:~$

Hinter dem $ kann man einen Befehl eingeben und mit der Eingabetaste ausführen. Nachdem der Befehl zu Ende ausgeführt ist, wird wieder ein neuer Prompt angezeigt.

Vor dem $ werden bestimmte Informationen angezeigt, z.B.:

Für Experten: Wie der Prompt genau aussieht, kann man konfigurieren (Anleitung).

Durch Eingabe von exit oder Strg-D beendet man das Terminalfenster.

Hinweis:

Wenn später in einem Beispiel etwas vorkommt, wie:

$ ls

Heißt das:

  • Im Terminal wird ls (ohne $) eingegeben.
  • Der Teil des Prompts vor dem $ ist weggelassen.

Hilfestellungen beim Eingeben von Befehlen:

  • Pfeiltaste hoch/runter: durch zuletzt ausgeführte Befehle blättern
  • Tab-Taste (links von Q): teilweise eingebene Begriffe automatisch vervollständigen

Dateisystem

Alle Daten werden in Linux durch Dateien repräsentiert.

Dateien können verschiedene Arten von Daten enthalten:

Dateien sind in Verzeichnissen enthalten. Neben normalen Dateien, können Verzeichnisse auch wiederum andere Verzeichnisse enthalten.

Alle Verzeichnisse und Dateien sind so in einer Hierarchie angeordnet und bilden eine Baumstruktur.

Das Wurzelverzeichnis (in dem schließlich direkt oder indirekt alles enthalten ist), heißt / (gesprochen: “Root”).

Pfade

Wo sich Dateien oder Verzeichnisse befinden, wird durch Pfade angegeben.

Im Bild oben ist der absolute Pfad zur Datei “bomber”: /usr/games/bomber

(“sys”, “tmp” und “usr” sind in / enthalten, also in der höchsten Hierarchieebene.)

Es gibt relative Pfade, die von einem anderen als dem Wurzelverzeichnis ausgehen.

z.B. ist der relative Pfad von “usr” aus betrachtet zu “bomber”: games/bomber (ohne / am Anfang!)

Analogie

  • Relativer Pfad: “von hier aus 100 m und dann rechts abbiegen”
  • Absoluter Pfad: “Bahnhofsstraße 23, Heidelberg”

→ Bei einem relativen Pfad hängt das Ergebnis davon ab, wo man sich gerade befindet.

Inhalt von Verzeichnissen betrachten

Jeder Benutzer hat ein eigenes “Home”-Verzeichnis. In diesem “startet” man, wenn man ein Terminal öffnet.

Der Befehl ls gibt den Inhalt des aktuellen Verzeichnisses aus:

$ ls
Arbeitsfläche  Bilder  Dokumente  Downloads  Mail  Musik

Dateien und Verzeichnisse, deren Namen mit . beginnen, werden nicht angezeigt. Sie sind “versteckt” (meistens enthalten sie Einstellungen für verschiedene Programme).

Um auch die versteckten Dateien und Verzeichnisse zu sehen, gibt es den Befehl ls -a:

$ ls -a
.              Bilder
..             .cache
.allread       .config
.aptitude      .dbus
Arbeitsfläche  Dokumente
.bash_history  Downloads
.bashrc                     (etc.)

-a ist eine der vielen Optionen für den Befehl ls. Eine weitere Option ist -l. Sie können auch kombiniert werden, z.B.: ls -la

Hinweis: Es ist wichtig, an welcher Stelle ein Leerzeichen steht, und an welcher Stelle nicht!

Zum Beispiel wäre ls - a falsch, genauso wie ls-a oder ls- a!

Erklärung: Der eingegebene Befehl wird durch Leerzeichen von der Shell in den eigentlichen Namen des Befehls und die sogenannten Argumente aufgeteilt.

z.B. wäre ls -ltr Downloads ein Aufruf des Befehls ls mit den zwei Argumenten

Das Argument -ltr wird wiederum vom Befehl ls als Kombination der drei Optionen l, t und r aufgefasst.

Einschub: Hilfe bekommen

Wie ls haben meisten anderen Befehle auch Optionen.

Mit man Befehl bekommt man die “Bedienungsanleitung” für den Befehl.

(Für manche Befehle funktioniert man nicht. Stattdessen gibt es dann evtl. help)

Im Dateisystem navigieren

Mit pwd bekommt man den absoluten Pfad zum aktuellen Verzeichnis (“Arbeitsverzeichnis” → print working directory).

$ pwd
/u/ziti/me119

Mit cd wechselt man das Verzeichnis:

Wie man mit ls -a sieht, gibt es zwei spezielle Einträge in jedem Verzeichnis: . und ..

Sie bezeichnen jeweils das aktuelle und das übergeordnete Verzeichnis (in dem das aktuelle enthalten ist).

Also:

Das eigene Homeverzeichnis hat auch den Namen ~. Mit cd ~/Downloads wechselt man also in das eigene “Downloads”-Verzeichnis, egal wo man sich gerade befindet.

Tipp: cd - wechselt in das Verzeichnis, in dem man vorher war.

Verzeichnisse anlegen

mkdir (sprich “makedir”)

mkdir Name erzeugt man ein neues Verzeichnis mit dem angegebenen Namen im aktuellen Verzeichnis.

Im Allgemeinen:

mkdir Pfad erzeugt Verzeichnis am angegeben Pfad, alle übergeordneten Verzeichnisse müssen bereits vorhanden sein.

Beispiel: Die Befehle

$ mkdir tools_linux
$ mkdir tools_linux/backups

legen zunächst das Verzeichnis tools_linux and und danach darin das Verzeichnis backups. Würde man den zweiten Befehl ausführen, solange es tools_linux noch nicht gibt, wäre das ein Fehler.

Für Experten: Mit der Option -p werden auch alle übergeordneten Verzeichnise bei Bedarf erzeugt.

Hinweis: Am besten vermeidet man Datei- und Verzeichnisnamen mit Leerzeichen oder Sonderzeichen wie / * % & und verwendet nur a-z, A-Z, 0-9, . und _.

touch

touch Name legt eine leere Datei mit dem angegebenen Namen an, falls sie noch nicht existiert.

Falls eine Datei oder ein Verzeichnis mit dem Namen schon existiert, wird das Änderungsdatum aktualisiert (mit ls -l betrachten).

Dateien kopieren und verschieben

cp (sprich “copy”)

cp Datei1 Datei2 erzeugt eine Kopie von Datei1 unter dem Namen Datei2.

cp Datei Verzeichnis erzeugt eine Kopie von Datei unter dem gleichen Namen im angegebenen Verzeichnis.

cp -r Verzeichnis1 Verzeichnis2 erzeugt eine Kopie von Verzeichnis1 inkl. aller Unterverzeichnisse und Dateien

  • unter dem Namen Verzeichnis2, wenn es noch nicht existiert
  • innerhalb von Verzeichnis2, wenn es schon existiert

mv (sprich “move”)

mv Datei Verzeichnis verschiebt die Datei in das angegebene Verzeichnis.

mv Datei1 Datei2 nennt die Datei um.

Achtung: Wenn die Zieldatei von cp oder mv bereits existiert, wird sie möglicherweise überschrieben!

Achtung: Oft ist es entscheidend, ob an einen Verzeichnisnamen noch ein / angehängt wird (siehe hier, hier und hier).

Tipp

Wenn man ganze Verzeichnisse samt Inhalt verschieben, kopieren, oder löschen will und sich nicht sicher ist, was der richtige Befehl ist, ist es sicherer, den grafischen Dateimanager zu benutzen!

Dateien und Verzeichnisse löschen

Logischerweise gilt hier immer Vorsicht.

rm Name löscht eine Datei mit dem angegebenen Namen.

rmdir Verzeichnis löscht das angegebene Verzeichnis. Es muss leer sein.

Für Experten: rm -r löscht Verzeichnisse samt Inhalt.

Übung

Test: ls -R ~/tools_linux muss jetzt folgende Ausgabe erzeugen (abgesehen von unterschiedlichen Namen des Homeverzeichnisses):

$ ls -R ~/tools_linux
/u/ziti/me119/tools_linux:
backups  science.txt

/u/ziti/me119/tools_linux/backups:
science.bak

Inhalt von Dateien

Der Sinn von Dateien ist es, dass sie Daten enthalten.

Die Menge der Daten in einer Datei ist die Dateigröße und wird in der Einheit Byte gemessen.

Vereinfacht ausgedrückt: ein Byte entspricht ungefähr einem Zeichen in einer einfachen Textdatei (nicht Word, etc.).

ls -l zeigt u.A. auch die Dateigrößen an.

Inhalt von Dateien betrachten

cat

cat Datei gibt den Inhalt der Datei auf dem Terminal aus.

Es können auch mehrere Dateinamen angegeben werden, dann werden deren Inhalte aneinandergehängt ausgegeben (concatenate).

Beispiel:

  • Gib science.txt mit cat auf dem Terminal aus.

less

Der Inhalt passt nicht auf einen Bildschirm.

Mit less kann man den Inhalt komfortabler betrachten.

Bedienung wie man: u/d zum Blättern, q zum Beenden, h für Hilfe.

head und tail

Diese beiden Befehle geben jeweils die ersten bzw. letzten Zeilen der Datei aus.

Standardmäßig 10 Zeilen, andere Anzahl mit -Anzahl.

Beispiel:

  • Gib die ersten 5 und die letzten 5 Zeilen von science.txt aus.

Tipp: Falls der Inhalt des Terminalfensters zu unübersichtlich wird, kann es mit clear wieder geleert werden.

wc

Der Befehl wc Datei (word count) gibt die Anzahl der Zeilen, Wörter und Zeichen in der Datei aus, z.B. mit der Option -l nur die Anzahl Zeilen.

Hinweis: Durch Eingabe der Befehle cat, head, tail, wc ohne einen Dateinamen als Argument “hängt” das Terminal. Mit Strg-D kommt man wieder heraus. (Erklärung später)

In Dateien suchen

Mit less

Innerhalb von less kann man durch Eingabe von / nach einer Zeichenkette suchen.

n springt zum nächsten Treffer, N zum vorherigen.

g springt zurück zum Anfang, G ans Ende.

Beispiel:

  • Durchsuche science.txt nach dem Begriff “science”.

Mit grep

(Herkunft des Namens “grep”)

grep Begriff Datei gibt alle Zeilen der Datei aus, in denen die angegebene Zeichenkette vorkommt.

Um nach Begriffen zu suchen, die Leerzeichen enthalten, muss der Suchbegriff mit Anführungszeichen angegeben werden. Enthält der Suchbegriff bestimmte Zeichen (z.B. $) spielt es eine Rolle, ob man " oder ' verwendet.

Mit ' wird der Suchbegriff exakt so verwendet, wie man ihn eingegeben hat.

(' ist auf der deutschen Tastatur auf der Taste mit dem #)

Beispiel:

  • Suche mit grep in science.txt nach dem Begriff “spinning top”.

Tipps: Optionen --color und -C ausprobieren (siehe man grep).

Tipp:

Mit grep science science.txt wird die allererste Zeile nicht mit ausgegeben, weil dort Science großgeschrieben ist.

Die Option -i macht den Suchbegriff unabhängig von der Groß-/Kleinschreibung (case insensitive).

Tipp:

Angenommen, man möchte nach dem Wort “in” suchen. Das ist garnicht so einfach! Die Zeichen “in” kommen in allen möglichen Wörtern vor.

Um nach einen genauen Wort zu suchen: mit \< und \> umschließen, das ganze in Anführungszeichen:

$ grep '\<in\>' science.txt

Für Experten: Dies war ein Beispiel für einen regulären Ausdruck (regular expression). Man kann so nach komplexeren Mustern als einfachen Zeichenketten suchen.

Ein- und Ausgabe von Prozessen

Ein Programm, während es vom Betriebssystem ausgeführt wird (z.B. durch Eingabe eines Befehls in der Shell), heißt Prozess.

Prozesse haben

Standard-Datenströme
(Bild: Wikipedia)

Beispiel

cat Datei gibt, wie anfangs gezeigt, den Inhalt der Datei auf stdout aus.

cat (ohne Argument) schien zu “hängen”. Die Erklärung: cat liest jetzt Daten von stdin anstatt einer Datei – also von der Tastatur!

Übung:

Ausgabe umleiten

Die Standardausgabe eines Prozesses kann man mit > in eine Datei umleiten.

Anstatt die Zieldatei zu überschreiben, kann man die Ausgabe des Programms auch mit >> ans Ende der Datei anhängen.

Eingabe umleiten

Die Standardeingabe eines Prozesses kann man mit < von einer Datei anstatt der Tastatur nehmen.

(Schwierig, ein gutes Beispiel zu finden, da die gezeigten Befehle sowieso aus einer angegebenen Datei lesen. Der Vollständigkeit halber ist es aber hier aufgeführt.)

Beispiel: sort gibt die Zeilen von stdin sortiert wieder auf stdout aus.

Um die Früchte aus fruechte.txt alphabetisch sortiert auszugeben:

$ sort <fruechte.txt

(sort fruechte.txt wäre in diesem Fall genauso gut)

Man kann auch beides kombinieren:

$ sort <fruechte.txt >fruechte_sortiert.txt

Prozesse verketten

Beispiel: Der Befehl who gibt eine Liste aller momentan eingeloggten Benutzer aus.

Um eine sortierte Liste davon zu bekommen, könnte man folgende Befehle benutzen:

$ who >benutzer.txt
$ sort <benutzer.txt

Aber die Datei benutzer.txt ist in diesem Fall eigentlich überflüssig. Mit einer “Pipeline” kann man das vereinfachen, indem man die Ausgabe von who direkt an die Eingabe von sort anschließt:

$ who | sort

(| bekommt man auf der deutschen Tastatur mit Alt Gr und der Taste links von y, auf der auch < und > sind.)

Tipp: Häufig gebrauchter Anwendungsfall: Die lange Ausgabe eines Programms in less “pipen”:

$ who | sort | less

Übung

Multitasking

Normalerweise zeigt die Shell den nächsten Prompt erst an, wenn der ausgeführte Prozess beendet ist. Der Prozess ist “im Vordergrund”.

Wenn ein Prozess sehr lange dauert, kann man ihn mit Strg-Z “unterbrechen”, um wieder zurück zur Shell zu kommen. Der Prozess ist aber noch nicht beendet, sondern kann mit fg (foreground) fortgesetzt werden.

Außerdem kann ein unterbrochener Prozess mit bg “im Hintergrund” fortgesetzt werden. Er läuft dann weiter (und produziert u.U. Ausgaben auf dem Terminal), aber man kann währenddessen gleichzeitig weitere Befehle ausführen.

Einen Prozess, der zu lange dauert, kann mit Strg-C abgebrochen werden: Probiere z.B. mit sleep 1000 aus.

Jobs

jobs zeigt eine Liste der aus der Shell gestarteten Programme an. Jedem ist eine Jobnummer zugewiesen, die man mit bg Jobnummer oder fg Jobnummer benutzen kann, wenn man einen bestimmten aus mehreren Prozessen auswählen will.

Beispiel/Übung

  • Öffne die Datei science.txt im Texteditor Gedit:

    $ gedit science.txt
  • Solange Gedit offen ist, kann man im Terminal keine weiteren Befehle eingeben.

  • Gib im Terminal Strg-Z ein. Gedit ist jetzt unterbrochen und reagiert nicht mehr. Mit fg kann man Gedit wieder aktivieren.

  • Unterbreche Gedit erneut, aber lasse ihn mit bg im Hintergrund weiterlaufen.

  • Starte eine Python-Sitzung mit python.

  • Wechsle mit zwischen den beiden Programmen und beobachte, wie sich jobs verhält.

Prozessliste

ps zeigt ebenfalls eine Liste der gestarteten Prozesse an, aber mit mehr Informationen. Jedem Prozess ist eine eindeutige Nummer (PID) zugewiesen. Die Shell selbst wird dort auch angezeigt (bash), sowie ps.

ps -A zeigt eine Liste aller gestarteten Prozesse auf dem System an, auch von anderen Benutzern.

Wenn ein Programm nicht mehr reagiert und sich nicht mit Ctrl-C abbrechen lässt, kann man es mit dem Befehl kill PID beenden.

Mit htop bekommt man eine übersichtlichere Darstellung aller Prozesse. Mit u kann man die Prozesse eines bestimmten Benutzers auswählen.

Alle Prozesse bilden auch eine Baumstruktur: Jeder Prozess wird von einem anderen Prozess gestartet (z.B. ein Befehl durch eine Shell, diese wiederum vom Terminal). Wenn ein Prozess abgebrochen wird, werden auch alle “Kinder” beendet.

Manchmal kann auch kill einen Prozess nicht beenden. Dann hilft meistens kill -9.

Beispiel/Übung Fortsetzung

  • Starte ein zweites Terminal und darin htop. Mit t schaltet man htop zwischen einer Listen- und einer Baumdarstellung um. Zeige nur die eigenen Prozesse an und suche die beiden Terminals (das erste mit Gedit und Python).

  • Finde die PID des ersten Terminals heraus. Beende es aus dem zweiten Terminal mit kill und beobachte, wie auch Gedit beendet wird.

Dateirechte

Mit ls -l bekommt man eine detaillierte Auflistung von Dateien und Verzeichnissen. Unter den angezeigten Informationen sind:

Beispiel:

drwxr-xr-x  2 krieger sus   4096 Okt 20 16:43 img
-rwxr-xr-x  1 krieger sus    894 Okt 20 15:30 include.py

Die erste Spalte ist eine Abfolge von 10 Zeichen. Das erste Zeichen kennzeichnet Verzeichnisse mit d, für Dateien ist es -.

Die folgenden 9 Zeichen sind die Berechtigungen, die für die Datei oder das Verzeichnis gelten, in drei Dreiergruppen:

In jeder Dreiergruppe kann es die Zeichen r, w, und x geben, die jeweils eine bestimmte Bedeutung haben (leicht verschieden für Dateien und Verzeichnisse).

Für Dateien:

Für Verzeichnisse:

Zugriffsrechte ändern

Mit dem Befehl chmod kann der Eigentümer der Datei die Zugriffsrechte ändern.

Beispiele:

$ chmod go-rwx Datei
$ chmod u+rw Datei

Die “Ausführen”-Berechtigung des Eigentümers (user) bliebe unverändert.

Übung

Verschiedenes

du (disk usage)

Falls man sein Speicherplatzkontingent im CIP-Pool erschöpft hat, ist es hilfreich, herauszufinden, wie man am einfachsten Platz schaffen kann.

du Verzeichnis gibt rekursiv die Größen aller im Verzeichnis enthaltenen Dateien an. Das ist meistens nicht sehr hilfreich.

du -s Verzeichnis gibt die Gesamtgröße des Verzeichnisses an.

Die Option -h (human readable) ändert die Größenangabe von “Anzahl Bytes” zu einer sinnvollen Einheit (Megabytes, etc.).

Als Kompromiss: Rekursionstiefe begrenzen mit --max-depth.

Beispiel:

$ du -h --max-depth=1 ~

Tipps: Ausgabe an sort weitergeben (sort hat auch eine Option -h).

Übung

  • Was passiert wenn man du -h mit sort ohne -h kombiniert?
  • Benutze tail um die 5 größten Verzeichnisse im Homeverzeichnis zu finden.

find

Kann Dateien und Verzeichnisse anhand verschiedener Kriterien innerhalb des angegebenen Verzeichnisses finden.

Beispiele:

Alle Dateien mit der Endung .txt:

$ find ~ -name '*.txt'

Alle Dateien größer als 1 MB:

$ find ~ -size +1M

SSH

Mit SSH (Befehl: ssh) kann man sich über ein Netzwerk (Internet) auf einem anderen Linux-Rechner einloggen. Zum Beispiel von zuhause im CIP-Pool:

$ ssh me119@physik5.kip.uni-heidelberg.de

Mit der Option -X kann auch die grafische Oberfläche vom Zielrechner auf den eigenen Rechner umgeleitet werden! (z.B.: firefox oder gedit von der Shell des Zielrechners aus starten) Allerdings ist das meistens ziemlich langsam.

Auch Dateien können mit scp zwischen Rechnern kopiert werden:

$ scp me119@physik.kip.uni-heidelberg.de:tools_linux/science.txt .

Kopiert die Datei science.txt auf den heimischen Rechner (ins aktuelle Verzeichnis .).