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.
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.)
(Bild: Wikipedia)
Heutzutage ist mit “Terminal” meistens auch ein Programm mit grafischer Benutzeroberfläche gemeint (genaugenommen handelt es sich um einen “Terminal-Emulator”).
GNOME-Terminal (unter der Gnome-Oberfläche im Menü: Anwendungen → Systemwerkzeuge → Terminal)
Konsole (Anwendungen → Systemwerkzeuge → Konsole)
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.
Wenn später in einem Beispiel etwas vorkommt, wie:
$ ls
Heißt das:
ls
(ohne $
) eingegeben.$
ist weggelassen.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”).
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!)
→ Bei einem relativen Pfad hängt das Ergebnis davon ab, wo man sich gerade befindet.
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
-ltr
undDownloads
.Das Argument -ltr
wird wiederum vom Befehl ls
als Kombination der drei Optionen l
, t
und r
aufgefasst.
Wie ls
haben meisten anderen Befehle auch Optionen.
Mit man Befehl
bekommt man die “Bedienungsanleitung” für den Befehl.
u
/d
(oder Pfeiltasten)q
/
eingeben, den Begriff eingeben, Eingabetaste(Für manche Befehle funktioniert man
nicht. Stattdessen gibt es dann evtl. help
)
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).
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
Verzeichnis2
, wenn es noch nicht existiertVerzeichnis2
, wenn es schon existiertmv
(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).
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!
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.
Lade die Datei science.txt
ins eigene “Downloads”-Verzeichnis herunter (Rechtsklick → speichern unter…).
Lege im Homeverzeichnis ein neues Verzeichnis tools_linux
an, und darin ein Verzeichnis backups
.
Kopiere die Datei science.txt
aus dem Downloads-Verzeichnis nach tools_linux
.
Erzeuge eine Sicherungskopie der Datei in backups
, mit dem Namen science.bak
.
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
Lösche die Datei science.txt
in tools_linux
.
Nutze die Sicherheitskopie unter backups
, um die ursprüngliche Datei wieder herzustellen.
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.
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:
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:
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)
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:
science.txt
nach dem Begriff “science”.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:
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 Programm, während es vom Betriebssystem ausgeführt wird (z.B. durch Eingabe eines Befehls in der Shell), heißt Prozess.
Prozesse haben
eine Standard-Eingabe (stdin), über das sie Daten entgegennehmen können (normalerweise über das Terminal mit der Tastatur verbunden),
eine Standard-Ausgabe (stdout), über die sie Daten ausgeben (normalerweise mit der Textausgabe des Terminals verbunden)
und eine weitere Ausgabe (stderr) für Fehlermeldungen (ebenso)
(Bild: Wikipedia)
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:
cat
aus. Beobachte, wie Eingaben von der Tastatur wieder von cat
auf dem Bildschirm ausgegeben werden. Schließe mit Strg-D ab (signalisiert dem Prozess: Ende der Eingabe).Die Standardausgabe eines Prozesses kann man mit >
in eine Datei umleiten.
Führe den Befehl cat >fruechte1.txt
aus. Gib nacheinander folgende Zeilen ein (Eingabetaste nach jeder Frucht) und schließe mit Strg-D ab:
Birne
Banane
Apfel
Jetzt wird die Ausgabe von cat
nicht mehr auf dem Bildschirm angezeigt, sondern landet in der Datei fruechte1.txt
.
(Vorsicht: Hätte die Datei schon existiert, würde sie so überschrieben)
Erzeuge auf diese Weise eine Datei fruechte2.txt
mit einer Frucht pro Zeile: Orange
, Pflaume
, Mango
, Grapefruit
.
Anstatt die Zieldatei zu überschreiben, kann man die Ausgabe des Programms auch mit >>
ans Ende der Datei anhängen.
Füge auf diese Weise folgende Zeilen zu fruechte1.txt
hinzu: Pfirsich
, Traube
, Orange
.
Schreibe den Inhalt von von fruechte1.txt
und fruechte2.txt
gemeinsam in eine Datei fruechte.txt
(mit einem einzelnen Befehl).
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
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
Benutze eine Pipeline mit wc -l
um herauszufinden, wieviele Benutzer gerade eingeloggt sind. (Hinweis: wenn ein Benutzer mehrfach eingeloggt ist, wird er auch mehrfach mitgezählt. Es geht aber nur darum, die Verkettung mehrerer Prozesse zu verdeutlichen.)
sort -u
eliminiert doppelt vorkommende Zeilen. Benutze eine Pipeline, um herauszufinden, wieviele verschiedene Früchte in fruechte.txt
stehen.
Wieviele verschiedene Früchte mit einem “p” im Namen stehen in fruechte.txt
?
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
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.
Ö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.
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
.
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.
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:
r
heißt: der Inhalt der Datei darf gelesen werdenw
heißt: der Inhalt der Datei darf geschrieben (verändert) werdenx
heißt: die Datei darf als Programm ausgeführt werden (falls ihr Inhalt irgendwie als ein Programm zu interpretieren ist)Für Verzeichnisse:
r
heißt: die Liste der im Verzeichnis enthaltenen Dateien darf gelesen werdenw
heißt: Dateien dürfen aus dem Verzeichnis entfernt oder hinzugefügt werdenx
heißt: Das Verzeichnis darf “betreten” werden und die Inhalte der Dateien darin gelesen (falls auch das Leserecht für die jeweilige Datei gilt)Mit dem Befehl chmod
kann der Eigentümer der Datei die Zugriffsrechte ändern.
Beispiele:
$ chmod go-rwx Datei
go
: Gruppe (group) und andere (others)-
: Entferne Berechtigungrwx
: alle drei Berechtigungen$ chmod u+rw Datei
u
: Eigentümer (user)+
: Erteile Berechtigungrw
: Lesen und SchreibenDie “Ausführen”-Berechtigung des Eigentümers (user) bliebe unverändert.
chmod
die Zugriffsrechte auf die Datei science.txt
und prüfe mit ls -l science.txt
das Ergebnis.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
).
du -h
mit sort
ohne -h
kombiniert?tail
um die 5 größten Verzeichnisse im Homeverzeichnis zu finden.find
Kann Dateien und Verzeichnisse anhand verschiedener Kriterien innerhalb des angegebenen Verzeichnisses finden.
Alle Dateien mit der Endung .txt
:
$ find ~ -name '*.txt'
Alle Dateien größer als 1 MB:
$ find ~ -size +1M
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 .
).