Kapitel 1. GNU/Linux-Lehrstunde

# Kapitel 1. GNU/Linux-Lehrstunde

Ich denke, ein Computersystem zu erlernen ist wie das Erlernen einer Fremdsprache. Obwohl Anleitungen und Dokumentation hilfreich sind, müssen Sie es selbst einüben. Um Ihnen einen sanften Start zu verschaffen, werde ich hier einige grundsätzliche Dinge ausführen.

Das kraftvolle Design von Debian GNU/Linux stammt von dem Unix-Betriebssystem, was einem Multiuser- und Multitasking-Betriebssystem ist. Sie müssen lernen, die Vorteile aus der Kraft dieser Funktionalitäten und den Ähnlichkeiten zwischen Unix und GNU/Linux zu ziehen.

Scheuen Sie sich nicht, Unix-orientierte Texte zu lesen und stützen Sie sich nicht ausschließlich auf GNU/Linux-orientierte Texte, da Sie dann viele nützliche Informationen verpassen würden.

| Anmerkung
Falls Sie bereits für eine Weile irgendein Unix-ähnliches System mit Befehlszeilenwerkzeugen genutzt haben, wissen Sie möglicherweise bereits alles, was ich hier beschreibe. Bitte nutzen Sie dies zum Realitäts-Check und zur Auffrischung.

## 1.1. Grundlagen für die Konsole

### 1.1.1. Die Shell-Eingabeaufforderung (Shell-Prompt)

Nach dem Starten des Systems sehen Sie einen textbasierten Anmeldebildschirm, wenn Sie keine grafische Oberfläche (GUI) wie GNOME oder KDE installiert haben. Wenn wir davon ausgehen, dass Ihr Rechnername `foo` lautet, dann sieht Ihr Anmeldebildschirm wie folgt aus:

Haben Sie eine GUI-Oberfläche installiert, können Sie trotzdem einen solchen textbasierten Anmeldebildschirm bekommen, indem Sie Strg-Alt-F3 drücken; mit Strg-Alt-F2 kehren Sie wieder zur GUI-Umgebung zurück (mehr dazu unter Abschnitt 1.1.6, „Virtuelle Konsolen“).

    foo login:

In dem Anmeldebildschirm geben Sie Ihren Benutzernamen ein, z.B. `penguin` und drücken die Enter-Taste, dann Ihr Passwort und nochmals Enter.

| Anmerkung
Gemäß der Unix-Tradition muss bei Benutzername und Passwort auf Groß- und Kleinschreibung geachtet werden. Im Benutzernamen werden für gewöhnlich nur Kleinbuchstaben verwendet. Das erste Benutzerkonto wird normalerweise während der Installation angelegt. Weitere Benutzerkonten können durch root mit dem Befehl `adduser`(8) erstellt werden.

Das System startet mit einer Grußnachricht, die in "`/etc/motd`" (Message Of The Day, Meldung des Tages) gespeichert ist, und zeigt einen Befehls-Prompt an.

    Debian GNU/Linux 12 foo tty3

    foo login: penguin
    Password:

    Linux foo 6.5.0-0.deb12.4-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.5.10-1~bpo12+1 (2023-11-23) x86_64

    The programs included with the Debian GNU/Linux system are free software;
    the exact distribution terms for each program are described in the
    individual files in /usr/share/doc/*/copyright.

    Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
    permitted by applicable law.

    Last login: Wed Dec 20 09:39:00 JST 2023 on tty3
    foo:~$

Jetzt sind Sie in der Shell. Die Shell interpretiert die Befehle, die Sie eingeben.

### 1.1.2. Die Shell-Eingabeaufforderung auf einem GUI-System

Falls Sie während der Installation eine grafische GUI-Oberfläche installiert haben, bekommen Sie nach dem Systemstart einen grafischen Anmeldebildschirm. Geben Sie zur Anmeldung Benutzername und Passwort des unprivilegierten Benutzerkontos ein. Verwenden Sie dabei die TAB-Taste, um zwischen Benutzername und Passwort zu wechseln, oder benutzen Sie dazu die primäre Maustaste.

In der GUI-Oberfläche bekommen Sie eine Shell-Eingabeaufforderung, indem Sie einen `X-Terminal-Emulator` wie `gnome-terminal`(1), `rxvt`(1) oder `xterm`(1) starten. In der GNOME-Arbeitsplatzumgebung erreichen Sie dies, indem Sie die SUPER-Taste (Windows-Taste) drücken und "terminal" in das Suchfeld eingeben.

Bei einigen anderen Arbeitsplatzumgebungen (wie `fluxbox`) gibt es möglicherweise keine offensichtliche Möglichkeit, ein Menü zu öffnen. Versuchen Sie in diesem Fall einfach einen Rechtsklick auf den Desktop-Hintergrund und hoffen, dass ein Menü erscheint.

### 1.1.3. Das root-Benutzerkonto

Das root-Benutzerkonto wird auch Superuser oder privilegierter Benutzer genannt. Mit diesem Benutzerkonto können Sie folgende Administrationsaufgaben erledigen:

- lesen, schreiben und löschen aller Dateien auf dem System unabhängig von deren Zugriffsrechten;

- setzen von Eigentümer und Zugriffsrechten jeglicher Dateien auf dem System;

- setzen des Passworts von jedem unprivilegierten Benutzer auf dem System;

- anmelden an jedem Benutzerkonto ohne dessen Passwort.

Diese uneingeschränkten Rechte des root-Benutzerkontos erfordern von Ihnen, dass Sie sich besonnen und verantwortungsvoll verhalten, wenn Sie es benutzen.

| Warnung
Teilen Sie das root-Passwort niemals anderen mit.

| Anmerkung

Bestimmte Dateizugriffsrechte einer Datei (inklusive Hardware-Geräte wie CD-ROM usw., die auf einem Debian-System nichts anderes als eine Datei sind) können dazu führen, dass Sie für nicht-root-Benutzer unbenutzbar sind. Obwohl die Verwendung des root-Benutzerkontos ein schneller Weg ist, solche Situationen zu testen, sollte die Lösung das korrekte Einstellen der Datei-Zugriffsrechte und/oder das Hinzufügen des Benutzers in entsprechende Gruppen sein (siehe dazu Abschnitt 1.2.3, „Dateisystem-Berechtigungen“).

### 1.1.4. Die root-shell-Eingabeaufforderung

Hier ein paar grundlegende Methoden, um mittels root-Passwort eine root-shell-Eingabeaufforderung zu bekommen:

- Geben Sie `root` im textbasierten Anmeldebildschirm ein.

- Tippen Sie in jeglicher Shell "`su -l`" ein.

  - Hierdurch werden NICHT die Umgebungseinstellungen des angemeldeten Benutzers beibehalten.

- Tippen Sie in jeglicher Benutzer-Shell-Eingabeaufforderung "`su`" ein.

  - Hierdurch werden teilweise die Umgebungseinstellungen des angemeldeten Benutzers beibehalten.

### 1.1.5. Systemadministrations-Werkzeuge mit grafischer Oberfläche (GUI)

Wenn sich über Ihr Arbeitsplatz-Menü keine GUI-Systemadministrations-Werkzeuge mit den benötigten Rechten starten lassen, können Sie diese von einer root-shell-Eingabeaufforderung aus starten, wie z.B. von `gnome-terminal`(1), `rxvt`(1) oder `xterm`(1). Lesen Sie dazu Abschnitt 1.1.4, „Die root-shell-Eingabeaufforderung“ und Abschnitt 7.9, „X-Server-Verbindungen“.

| Warnung
Starten Sie niemals das GUI-Display/den Sitzungsmanager als root, indem Sie `root` im Anmeldebildschirm des Displaymanagers (z.B. `gdm3`(1)) eingeben. Lassen Sie niemals vertrauensunwürdige GUI-Programme mit Fernanbindung in einem X-Window laufen, wenn dort kritische Daten angezeigt werden, da diese Programme Ihren grafischen Bildschirminhalt abgreifen können.

### 1.1.6. Virtuelle Konsolen

In einem Standard-Debian-System sind sechs VT100-ähnliche textbasierte Konsolen verfügbar, zwischen denen Sie hin und her schalten können, und in denen die Befehls-Shell direkt auf dem Linux-Host ausgeführt werden kann. Solange Sie sich nicht in einer GUI-Umgebung befinden, können Sie mit der linken `Alt-Taste` und gleichzeitig einer der Funktionstasten `F1` — `F6` zwischen den virtuellen Konsolen umschalten. Jede textbasierte Konsole erlaubt eine eigenständige Anmeldung mit einem Benutzerkonto und bietet eine Mehrbenutzer-Umgebung. Diese Mehrbenutzer-Umgebung ist eine tolle Unix-Funktionalität und macht sehr leicht süchtig.

Wenn Sie sich in der grafischen GUI-Umgebung befinden, bekommen Sie mit `Strg-Alt-F3` (d.h. die linke `Strg-Taste`, die linke `Alt-Taste` und `F3` gleichzeitig) Zugang zur textbasierten Konsole 3. Sie können zur GUI-Oberfläche zurückkehren, die normalerweise auf der virtuellen Konsole 2 läuft, indem Sie `Alt-F2` drücken.

Alternativ können Sie auch von der Befehlszeile aus zu einer anderen virtuellen Konsole wechseln, z.B. zur Konsole 3:

    # chvt 3

### 1.1.7. Wie Sie die Eingabeaufforderung wieder verlassen

Drücken Sie in der Eingabeaufforderung `Strg-D` (also die linke `Strg-Taste` und die `d-Taste` gleichzeitig), um die Shell-Aktivitäten zu beenden. Wenn Sie sich auf der textbasierten Konsole befinden, kehren Sie hiermit zum Anmeldebildschirm zurück. Obwohl bei diesen Steuerzeichen von "control D" mit großem D gesprochen wird, müssen Sie hier nicht die Umschalt-Taste drücken. Für `Strg-D` wird auch die Kurzform `^D` benutzt. Alternativ können Sie auch "exit" eingeben.

Wenn Sie sich in einem `X-Terminal-Emulator`(1) befinden, können Sie hiermit das `X-Terminal-Emulator`-Fenster schließen.

### 1.1.8. Wie Sie das System herunterfahren

Wie jedes andere moderne Betriebssystem, bei dem Dateioperationen das Zwischenspeichern (Caching) beinhalten, um die Performance zu erhöhen, erfordert auch das Debian-System eine Prozedur zum sauberen Herunterfahren, bevor gefahrlos abgeschaltet werden kann. Dies dient dazu, die Integrität der Daten aufrecht zu erhalten, indem alle Änderungen auf die Platte geschrieben werden. Falls Energiekontrolle per Software verfügbar ist, wird im Rahmen des Herunterfahrens die Spannung automatisch abgeschaltet. (Andernfalls müssen Sie den Ein-/Ausschaltknopf mehrere Sekunden gedrückt halten, nachdem das Herunterfahren abgeschlossen ist).

Sie können das System im normalen Mehrbenutzermodus auf der Befehlszeile herunterfahren mittels:

    # shutdown -h now

Sie können das System im Einzelbenutzermodus auf der Befehlszeile herunterfahren mittels:

    # poweroff -i -f

Lesen Sie auch Abschnitt 6.3.8, „Wie Sie das ferne System über SSH herunterfahren“.

### 1.1.9. Eine Konsole wiederherstellen

Wenn der Bildschirm verrückt spielt, nachdem Sie verrückte Dinge wie "`cat irgendeine-binärdatei`" gemacht haben, geben Sie "`reset`" an der Eingabeaufforderung ein. Sie können den Befehl möglicherweise nicht sehen, während Sie ihn eingeben. Mit "`clear`" können Sie bei Bedarf auch den Bildschirm leeren.

### 1.1.10. Zusätzliche Paketempfehlungen für Neulinge

Obwohl selbst die Minimalinstallation eines Debian-Systems ohne jegliche Arbeitsplatzumgebung die grundlegenden Unix-Funktionalitäten bietet, ist es eine gute Idee, mittels `apt-get`(8) einige Befehlszeilen- und curses-basierte Zeichen-Terminal-Pakete zusätzlich zu installieren, wie z.B. `mc` und `vim`; Anfänger können dazu für einen ersten Versuch folgendes verwenden:

    # apt-get update
     ...
    # apt-get install mc vim sudo aptitude
     ...

Falls Sie diese Pakete bereits installiert haben, werden keine neuen Pakete installiert.

Tabelle 1.1. Liste interessanter Textmodus-Programm-Pakete

Paket | Popcon | Größe | Beschreibung
--- | --- | --- | ---
`mc` | V:43, I:183 | 1590 | Ein Textmodus-Dateimanager mit Vollbildschirm-Ansicht
`sudo` | V:732, I:863 | 6773 | Ein Programm, das Benutzern eingeschränkte root-Privilegien einräumt
`vim` | V:86, I:346 | 4089 | Unix Texteditor Vi IMproved, ein Texteditor für Programmierer (Standardversion)
`vim-tiny` | V:57, I:978 | 1877 | Unix Texteditor Vi IMproved, ein Texteditor für Programmierer (Kompaktversion)
`emacs-nox` | V:3, I:13 | 46536 | Emacs vom GNU-Projekt, der Lisp-basierte erweiterbare Texteditor
`w3m` | V:11, I:145 | 2853 | Textmodus-WWW-Browser
`gpm` | V:9, I:9 | 526 | Unix-ähnliches Kopieren-und-Einfügen auf der Textkonsole (Daemon)

Es könnte eine gute Idee sein, einiges an informativer Dokumentation zu lesen.

Tabelle 1.2. Liste informativer Dokumentationspakete

Paket | Popcon | Größe | Beschreibung
--- | --- | --- | ---
`doc-debian` | I:882 | 187 | Dokumentation des Debian-Projekts und andere Dokumente
`debian-policy` | I:8 | 5061 | Debian Policy-Handbuch und zugehörige Dokumente
`developers-reference` | V:0, I:2 | 2601 | Richtlinien und Informationen für Debian-Entwickler
`debmake-doc` | I:0 | 11807 | Leitfaden für Debian-Betreuer
`debian-history` | I:0 | 6251 | Vergangenheit des Debian-Projekts
`debian-faq` | I:880 | 791 | Debian FAQ

Sie sollten vielleicht einige dieser Pakete installieren, indem Sie folgendes eingeben:

    # apt-get install package_name

### 1.1.11. Ein zusätzliches Benutzerkonto

Falls Sie Ihr Haupt-Benutzerkonto nicht für die folgenden Trainingsaktivitäten nutzen möchten, können Sie mit folgendem Befehl ein Trainings-Benutzerkonto erstellen, hier z.B. `fish`:

    # adduser fish

Beantworten Sie alle Fragen.

Dadurch wird ein neues Konto namens `fish` erstellt. Nach Ihren Übungen können Sie dieses Benutzerkonto und das dazugehörige Heimatverzeichnis entfernen, indem Sie folgendes verwenden:

    # deluser --remove-home fish

Auf nicht-Debian-Systemen sowie speziell angepassten Debian-Systemen müssen für die oben aufgeführten Aktivitäten die niederschwelligen Werkzeuge `useradd`(8) und `userdel`(8) verwendet werden.

### 1.1.12. sudo-Konfiguration

Für ein typisches Einzelbenutzer-Arbeitsplatzsystem, wie z.B. einen Debian-Desktopauf einem Laptop, ist es gängig, wie folgt eine einfache Konfiguration für `sudo`(8) einzurichten, so dass der nicht-privilegierten Benutzer, z.B. `penguin`, lediglich mit seinem Benutzer-Passwort (aber ohne das root-Passwort) administrative Rechte bekommen kann:

    # echo "penguin  ALL=(ALL) ALL" >> /etc/sudoers

Alternativ dazu ist es auch verbreitet, dem nicht-privilegierten Benutzer, hier `penguin`, wie folgt administrative Rechte zu gewähren, ohne dass dieser irgendein Passwort eingeben muss:

    # echo "penguin  ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

Dieser Trick sollte nur für einen Einzelbenutzer-Arbeitsplatz angewandt werden, den Sie selbst administrieren und auf dem Sie der einzige Benutzer sind.

| Warnung
Richten Sie keine Benutzerkonten regulärer Benutzer auf Mehrbenutzersystemen derartig ein; dies wäre sehr schlecht für die Systemsicherheit.

| Achtung

Das Passwort und Benutzerkonto von `penguin` im obigen Beispiel erfordert ebenso viel Schutz wie das root-Passwort und das root-Benutzerkonto.

Administrative Rechte in diesem Zusammenhang gehören zu jemandem, der berechtigt ist, Systemadministrationsaufgaben auf dem Arbeitsplatzsystem durchzuführen. Gewähren Sie niemals einem Manager in der Verwaltungsabteilung Ihrer Firma oder Ihrem Chef derartige Privilegien, außer diese sind dazu autorisiert und befähigt.

| Anmerkung

Um Leuten Zugriffsrechte auf limitierte Geräte und Dateien zu verschaffen, sollten Sie die Verwendung von group in Betracht ziehen, um eingeschränkte Rechte einzurichten, statt die root-Privilegien via `sudo`(8) dafür zu nutzen.

Mit einer durchdachten und vorsichtigen Konfiguration kann `sudo`(8) auf einem System, das Sie sich mit mehreren Leuten teilen, limitierte administrative Rechte einräumen, ohne dass Sie anderen das root-Passwort mitteilen müssen. Dies kann Ihnen auf Systemen helfen, wo Sie sich die Verantwortung mit mehreren Administratoren teilen, so dass Sie sagen können, wer was gemacht hat. Auf der anderen Seite möchten Sie vielleicht nicht, dass irgendjemand sonst solche Privilegien hat.

### 1.1.13. Zeit zum Spielen

Jetzt sind Sie soweit, dass Sie mit dem Debian-System ohne Risiko herumspielen können, solange Sie das nicht-privilegierte Benutzerkonto verwenden.

Das liegt daran, dass sogar nach einer Standardinstallation Ihr Debian-System mit korrekten Dateiberechtigungen konfiguriert ist, die verhindern, dass nicht-privilegierte Benutzer das System beschädigen. Natürlich könnte es immer noch einige Lücken geben, die ausgenutzt werden können, aber diejenigen, die sich darüber Sorgen machen, sollten nicht dieses Kapitel lesen, sondern die Anleitung zum Absichern von Debian (Securing Debian Manual).

Wir lernen das Debian-System mit folgenden Aspekten eines Unix-ähnlichen Systems kennen:

- Abschnitt 1.2, „Unix-ähnliches Dateisystem“

- Abschnitt 1.3, „Midnight Commander (MC)“

- Abschnitt 1.4, „Die grundlegende Unix-ähnliche Arbeitsumgebung“

- Abschnitt 1.5, „Der einfache Shell-Befehl“

- Abschnitt 1.6, „Unix-ähnliche Textverarbeitung“

## 1.2. Unix-ähnliches Dateisystem

In GNU/Linux und anderen Unix-ähnlichen Betriebssystemen sind Dateien in Verzeichnis-Strukturen organisiert. Alle Dateien und Verzeichnisse sind in einem großen Verzeichnisbaum unterhalb von "`/`" eingeordnet. Dies wird Baum genannt, weil das Dateisystem, wenn Sie es aufmalen, wie ein Baum aussieht, nur dass er auf dem Kopf steht.

Diese Dateien und Verzeichnisse können auf mehrere Geräte verteilt sein. `mount`(8) dient dazu, Dateisysteme, die auf anderen Geräten erkannt werden, in den großen Verzeichnisbaum einzubinden. Umgekehrt dient `umount`(8) dazu, es wieder daraus zu entfernen. Auf aktuellen Linux-Kernel kann `mount`(8) mit bestimmten Optionen Teile des Verzeichnisbaums zusätzlich an anderer Stelle anknüpfen oder die zusätzlichen Eigenschaften shared, private, slave oder unbindable verwenden. Unterstützte mount-Optionen für verschiedene Dateisystemtypen finden Sie in "`/usr/share/doc/linux-doc-*/Documentation/filesystems/`".

Verzeichnisse auf Unix-Systemen werden bei einigen anderen Betriebssystemen auch Ordner genannt. Bitte beachten Sie ebenfalls, dass es auf einem Unix-System kein Konzept zur Bezeichnung von Laufwerken gibt, das vergleichbar mit z.B. "`A:`" wäre. Es gibt ein Dateisystem, und dort ist alles enthalten. Dies ist ein gewaltiger Unterschied verglichen mit Windows.

### 1.2.1. Unix-Dateigrundlagen

Hier einige Grundlagen zu Dateien unter Unix:

- Bei Dateinamen ist Groß-/Kleinschreibung immer relevant. Das heißt, "`MEINEDATEI`" und "`MeineDatei`" sind zwei unterschiedliche Dateien.

- Das Wurzel-Verzeichnis (root) bedeutet Wurzel des Dateisystems und wird einfach als "`/`" dargestellt. Verwechseln Sie dies nicht mit dem Heimatverzeichnis des root-Benutzers "`/root`".

- Jedes Verzeichnis hat einen Namen, der jegliche Buchstaben oder Symbole außer "`/`" enthalten kann. Das Wurzelverzeichnis root ist eine Ausnahme; dessen Name ist "`/`" (ausgesprochen "slash" oder "das root-Verzeichnis") und es kann nicht umbenannt werden.

- Jede Datei oder jedes Verzeichnis ist über einen voll qualifizierten Dateinamen, absoluten Dateinamen oder Pfad gekennzeichnet, der die Abfolge der Verzeichnisse enthält, die zu dessen Erreichen passiert werden müssen. Die drei oben angegebenen Ausdrücke sind alle gleichbedeutend.

- Alle voll qualifizierten Dateinamen beginnen mit dem "`/`"-Verzeichnis, und zwischen zwei Verzeichnissen oder zwischen Verzeichnis und Datei steht ein weiteres "`/`". Das erste "`/`" ist das Wurzelverzeichnis, und die anderen "`/`" sind jeweils Trenner zwischen den einzelnen Unterverzeichnissen, bis der letzte Eintrag erreicht ist, was der Name der eigentlichen Datei ist. Die Wörter, die hier verwendet werden, können verwirrend sein. Nehmen Sie den folgenden voll qualifizierten Dateinamen als Beispiel: "`/usr/share/keytables/de.map.gz`". Allerdings spricht man von "`de.map.gz`" alleine als Dateiname.

- Das Wurzelverzeichnis enthält eine Anzahl von Unterverzeichnisse, wie "`/etc/`" und "`/usr/`". Diese haben wiederum nochmals weitere Unterverzeichnisse, z. B. "`/etc/systemd/`" und "`/usr/local/`". Das Ganze komplett betrachtet wird als Verzeichnisbaum bezeichnet. Sie können den absoluten Dateinamen als Route vom Fuss des Baums ("`/`") zu dessen Ende einer Verzweigung (einer Datei) betrachten. Manchmal hören Sie auch, wie Leute vom Verzeichnisbaum reden, als wäre es ein Familien-Stammbaum, der alle direkten Nachkommen einer einzigen Figur (dem Wurzelverzeichnis "`/`") einschließt: demzufolge haben die Unterverzeichnisse Eltern, und ein Pfad zeigt die vollständige Herkunft einer Datei. Es gibt auch relative Pfade, die irgendwo beginnen (nicht beim Wurzelverzeichnis). Sie sollten dabei in Erinnerung behalten, dass "`../`" immer das jeweils übergeordnete Verzeichnis (Eltern-Verzeichnis) bezeichnet. Diese Bezeichnungsweise gilt auch für andere Strukturen, die dem Verzeichnisbaum ähnlich sind, wie hierarchische Datenstrukturen.

- Es gibt keine spezielle Verzeichnispfad-Namenskomponente, die einem physikalischen Gerät, wie einer Festplatte, entspricht. Dies unterscheidet sich von RT-11, CP/M, OpenVMS, MS-DOS, AmigaOS und Microsoft Windows, wo der Pfad einen Gerätenamen wie "`C:\`" enthält. Allerdings existieren Verzeichniseinträge, die sich als Teil des normalen Dateisystems auf physikalische Geräte beziehen. Siehe dazu Abschnitt 1.2.2, „Dateisystem-Internas“.

| Anmerkung

Obwohl Sie nahezu alle Buchstaben oder Symbole in einem Dateinamen verwenden können, ist es in der Praxis eine schlechte Idee, dies zu tun. Es ist besser, alle Zeichen zu vermeiden, die auf der Befehlszeile oft eine spezielle Bedeutung haben, darunter Leerzeichen, Tabulatoren, Newlines, und andere spezielle Zeichen wie `{ } ( ) [ ] ' ` " \ / > < | ; ! # & ^ * % @ $` . Wenn Sie innerhalb des Namens einzelne Wörter trennen möchten, sind Punkte, Bindestriche und Unterstriche hierfür eine gute Wahl. Sie können auch die Wörter jeweils am Anfang großschreiben, "`SoWieHier`". Erfahrene Benutzer tendieren dazu, Leerzeichen in Dateinamen zu vermeiden.

| Anmerkung
Das Wort "root" kann entweder "root-Benutzer" oder "root-Verzeichnis" (Wurzelverzeichnis) bedeuten. Am Zusammenhang bei der Verwendung sollten Sie erkennen können, was gemeint ist.

| Anmerkung
Das Wort Pfad wird nicht nur wie oben für voll qualifizierte Dateinamen verwendet, sondern auch für den Befehls-Suchpfad. Die jeweilige Bedeutung erschließt sich für gewöhnlich aus dem Zusammenhang.

Detaillierte bewährte Methoden für die Dateihierarchie sind im Filesystem Hierarchy Standard beschrieben (in "`/usr/share/doc/debian-policy/fhs/fhs-2.3.txt.gz`" und unter `hier`(7)). Sie sollten folgendes als Ausgangspunkt nutzen:

Tabelle 1.3. Auflistung der Verwendung wichtiger Verzeichnisse

Verzeichnis | Verwendung des Verzeichnisses
--- | ---
`/` | das Wurzelverzeichnis (root-Verzeichnis)
`/etc/` | systemweite Konfigurationsdateien
`/var/log/` | System-Protokolldateien
`/home/` | die Heimatverzeichnisse aller nicht-privilegierten Benutzer

### 1.2.2. Dateisystem-Internas

Gemäß der Unix-Tradition stellt das Debian GNU/Linux-System ein Dateisystem bereit, unterhalb dessen alle physikalischen Daten auf Festplatten und anderen Speichermedien liegen; alles für das Zusammenspiel mit Hardware-Geräten wie Konsolenbildschirmen und von fern zugreifenden seriellen Konsolen benötigte wird in vereinheitlichter Art und Weise unterhalb von "`/dev/`" abgebildet.

Alle Dateien, Verzeichnisse, benannten Pipes (named pipes; ein Verfahren, mit dem zwei Progamme Daten austauschen können) oder physikalischen Geräte auf einem Debian GNU/Linux-System haben eine Datenstruktur, Inode genannt, die die mit ihr verbundenen Attribute beschreibt, wie der Benutzer, der deren Eigentümer (owner) ist, die Gruppe, der sie angehören, der Zeitpunkt des letzten Zugriffs usw. Die Idee, nahezu alles im Dateisystem darzustellen, war eine Unix-Innovation, und moderne Linux-Kernel haben diese Idee sogar noch weiterentwickelt. Jetzt kann man sogar Informationen über die Prozesse, die auf dem Computer laufen, im Dateisystem finden.

Die abstrakte und vereinheitlichte Abbildung von physikalischen Datensätzen und internen Prozessen ist sehr leistungsfähig, da sie es uns erlaubt, für die gleiche Funktion auf vielen total unterschiedlichen Geräten denselben Befehl zu verwenden. Es ist sogar möglich, die Art und Weise, wie der Kernel arbeitet, zu verändern, indem man Daten in spezielle Dateien schreibt, die mit laufenden Prozessen verbunden sind.

| Tipp
Wenn Sie wissen möchten, wie der Verzeichisbaum und die Gerätedateien verknüpft sind, führen Sie `mount`(8) ohne Argumente aus.

### 1.2.3. Dateisystem-Berechtigungen

Dateisystem-Berechtigungen auf Unix-ähnlichen Systemen werden für drei Kategorien beteiligter Benutzer festgelegt:

- der Benutzer (user), der Eigentümer der Datei ist (u);

- andere Benutzer der Gruppe (group), zu der die Datei gehört (g);

- alle anderen (other) Benutzer (o), auch "world" (Welt) oder "everyone" (jeder) genannt.

Bei Dateien gibt es Berechtigung für die folgenden Aktionen:

- Die Lese-Berechtigung (read, r) erlaubt dem Rechteinhaber, den Inhalt der Datei zu betrachten.

- Die Schreib-Berechtigung (write, w) erlaubt dem Rechteinhaber, die Datei zu verändern.

- Die Ausführungs-Berechtigung (execute, x) erlaubt dem Rechteinhaber, die Datei als Befehl auszuführen.

Bei Verzeichnissen gibt es Berechtigung für die folgenden Aktionen:

- Die Lese-Berechtigung (read, r) erlaubt dem Rechteinhaber, den Inhalt des Verzeichnisses aufzulisten.

- Die Schreib-Berechtigung (write, w) erlaubt dem Rechteinhaber, Dateien zu dem Verzeichnis hinzuzufügen oder Dateien zu löschen.

- Die Ausführungs-Berechtigung (execute, x) erlaubt dem Rechteinhaber, auf Dateien in dem Verzeichnis zuzugreifen.

Hierbei bedeutet die Ausführungs-Berechtigung für ein Verzeichnis nicht nur, dass der Inhalt der Dateien in diesem Verzeichnis betrachtet werden kann, sondern auch deren Attribute, wie die Dateigröße und der Zeitpunkt der letzten Änderung.

`ls`(1) wird verwendet, um Informationen über die Zugriffsrechte (und mehr) von Dateien und Verzeichnissen anzuzeigen. Wenn es mit der Option "`-l`" aufgerufen wird, werden die folgenden Informationen in der angegebenen Reihenfolge angezeigt:

- Typ der Datei (erstes Zeichen);

- Berechtigungen der Datei (neun Zeichen, bestehend aus drei Zeichen jeweils für Benutzer, Gruppe und andere, in dieser Reihenfolge);

- Anzahl der harten Links auf die Datei;

- Name des Benutzers, der Eigentümer der Datei ist;

- Name der Gruppe, zu der die Datei gehört;

- Größe der Datei in Zeichen (Byte);

- Datum und Uhrzeit der Datei (mtime);

- Name der Datei.

Tabelle 1.4. Bedeutungen des ersten Zeichens der "`ls -l`"-Ausgabe

Zeichen | Bedeutung
--- | ---
`-` | normale Datei
`d` | Verzeichnis
`l` | symbolischer Link
`c` | Geräte-Node für zeichenorientierte Geräte
`b` | Geräte-Node für blockorientierte Geräte
`p` | benannte Pipe (named pipe)
`s` | Socket

`chown`(1) wird von dem root-Benutzer verwendet, um den Eigentümer einer Datei zu ändern. `chgrp`(1) wird vom Eigentümer einer Datei oder von root benutzt, um die Gruppe zu ändern, zu der die Datei gehört. `chmod`(1) wird vom Eigentümer oder dem root-Benutzer verwendet, um die Zugriffsberechtigungen für Datei und Verzeichnis zu ändern. Die grundsätzliche Syntax, um die Datei `foo` zu bearbeiten, ist wie folgt:

    # chown newowner foo
    # chgrp newgroup foo
    # chmod  [ugoa][+-=][rwxXst][,...] foo

Sie können zum Beispiel mit folgenden Befehlen einen Verzeichnisbaum so manipulieren, dass `foo` sein Eigentümer wird und `bar` die Gruppe:

    # cd /some/location/
    # chown -R foo:bar .
    # chmod -R ug+rwX,o=rX .

Es gibt noch drei weitere, spezielle Zugriffs-Bits:

- das Setze Benutzer-ID-Bit (s, oder S statt dem x des Benutzers);

- das Setze Gruppen-ID-Bit (s, oder S statt dem x der Gruppe);

- das sticky (klebrig)-Bit (t, oder T statt dem x der "anderen").

Hierbei enthält die Ausgabe von "`ls -l`" für diese Bits die jeweiligen Großbuchstaben, wenn die Ausführungs-Bits (x), die bei dieser Ausgabe versteckt sind, nicht gesetzt sind.

Das Setzen des Setze Benutzer-ID-Bits einer ausführbaren Datei erlaubt dem Benutzer, die ausführbare Datei unter der Benutzer-ID der Datei (zum Beispiel root) auszuführen. Ähnlich dazu erlaubt das Setzen des Bits Setze Gruppen-ID einer ausführbaren Datei dem Benutzer, die ausführbare Datei unter der Gruppen-ID der Datei (zum Beispiel root) auszuführen. Da diese Einstellungen Sicherheitsrisiken verursachen können, erfordert deren Aktivierung besondere Vorsicht.

Das Setzen des Setze Gruppen-ID-Bits eines Verzeichnisses aktiviert das BSD-ähnliche Dateierstellungs-Schema, bei dem alle in dem Verzeichnis erzeugten Dateien der gleichen Gruppe angehören wie das Verzeichnis selbst.

Das Setzen des sticky (klebrig)-Bits eines Verzeichnisses verhindert, dass eine Datei in dem Verzeichnis von einem Benutzer gelöscht wird, der nicht Eigentümer der Datei ist. Um den Inhalt einer Datei in einem für alle schreibbaren Verzeichnis wie "`/tmp`" oder in durch die Gruppe schreibbaren Verzeichnissen sicherzustellen, muss nicht nur die Schreib-Berechtigung für die Datei zurückgenommen werden, sondern auch das sticky (klebrig)-Bit für das Verzeichnis. Ansonsten könnte jeder Benutzer, der Schreibberechtigung in dem Verzeichnis hat, die Datei löschen und eine neue mit dem gleichen Namen (aber eventuell anderem Inhalt) erstellen.

Hier einige interessante Beispiele von Dateiberechtigungen:

    $ ls -l /etc/passwd /etc/shadow /dev/ppp /usr/sbin/exim4
    crw------T 1 root root   108, 0 Oct 16 20:57 /dev/ppp
    -rw-r--r-- 1 root root     2761 Aug 30 10:38 /etc/passwd
    -rw-r----- 1 root shadow   1695 Aug 30 10:38 /etc/shadow
    -rwsr-xr-x 1 root root   973824 Sep 23 20:04 /usr/sbin/exim4
    $ ls -ld /tmp /var/tmp /usr/local /var/mail /usr/src
    drwxrwxrwt 14 root root  20480 Oct 16 21:25 /tmp
    drwxrwsr-x 10 root staff  4096 Sep 29 22:50 /usr/local
    drwxr-xr-x 10 root root   4096 Oct 11 00:28 /usr/src
    drwxrwsr-x  2 root mail   4096 Oct 15 21:40 /var/mail
    drwxrwxrwt  3 root root   4096 Oct 16 21:20 /var/tmp

Es gibt eine alternative numerische Möglichkeit, um Dateiberechtigungen mit `chmod`(1) darzustellen. Dieser numerische Modus verwendet 3 oder 4 einstellige Oktalzahlen (Basis=8).

Tabelle 1.5. Der numerische Modus für Dateiberechtigungen in `chmod`(1)-Befehlen

Ziffer | Bedeutung
--- | ---
1. Ziffer (optional) | Summe der Bits Setze Benutzer-ID (=4), Setze Gruppen-ID (=2) und sticky (klebrig) (=1)
2. Ziffer | Summer der Rechte Lesen (= 4), Schreiben (= 2) und Ausführen (= 1) für den Benutzer
3. Ziffer | identisch für die Gruppe
4. Ziffer | identisch für alle anderen

Dies klingt kompliziert, aber es ist letztendig ganz einfach. Wenn Sie die ersten Spalten (2-10) der "`ls -l`"-Ausgabe anschauen und sie in binärer Darstellung (Basis = 2) lesen ("-" ist "0" und "rwx" sind "1"), werden Sie die letzten 3 Ziffern des numerischen Modus' im Oktalformat (Basis = 8) erkennen.

Probieren Sie zum Beispiel folgendes:

    $ touch foo bar
    $ chmod u=rw,go=r foo
    $ chmod 644 bar
    $ ls -l foo bar
    -rw-r--r-- 1 penguin penguin 0 Oct 16 21:39 bar
    -rw-r--r-- 1 penguin penguin 0 Oct 16 21:35 foo

| Tipp
Wenn Sie mit einem Shell-Skript auf Informationen von "`ls -l`" zugreifen müssen, sollten Sie geeignete Befehle wie `test`(1), `stat`(1) und `readlink`(1) verwenden. Auch in die Shell integrierte Dinge wie "`[`" oder "`test`" können genutzt werden.

### 1.2.4. Steuerung der Berechtigungen für neu erzeugte Dateien: umask

Welche Berechtigungen einer neu erzeugten Datei oder einem neu erzeugten Verzeichnis zugewiesen werden, wird durch den in die Shell integrierten Befehl `umask` festgelegt/eingeschränkt. Lesen Sie dazu `dash`(1), `bash`(1) und `builtins`(7).

     (file permissions) = (requested file permissions) & ~(umask value)

Tabelle 1.6. Beispiele für umask-Werte

umask | erzeugte Dateirechte | erzeugte Verzeichnisrechte | Verwendung
--- | --- | --- | ---
`0022` | `-rw-r--r--` | `-rwxr-xr-x` | schreibbar nur durch den Benutzer
`0002` | `-rw-rw-r--` | `-rwxrwxr-x` | schreibbar durch die Gruppe

Das Debian-System verwendet standardmäßig das UPG-Schema (user private group, eineprivate Gruppe für jeden Benutzer). Eine UPG wird erstellt, immer wenn ein Benutzer dem System hinzugefügt wird. Eine UPG hat den gleichen Namen wie der Benutzer, für den sie erstellt wurde, und dieser Benutzer ist das alleinige Mitglied in dieser Gruppe. Durch das UPG-Schema ist es sicher, die umask auf `0002` zu setzen, da jeder Benutzer seine eigene private Gruppe hat. (Bei einigen Unix-Varianten ist es gängig, alle normalen Benutzer so einzurichten, dass sie einer einzigen `users`-Gruppe angehören und es ist in solchen Fällen eine gute Idee, umask aus Sicherheitsgründen auf `0022` zu setzen.)

| Tipp
Sie aktivieren das UPG-Schema, indem Sie "`umask 002`" zur Datei `~/.bashrc` hinzufügen.

### 1.2.5. Berechtigungen für Gruppen von Benutzern (group)

| Warnung
Stellen sie sicher, dass noch nicht gespeicherte Änderungen gespeichert werden, bevor Sie einen Reboot oder ähnliches ausführen.

Sie können mit zwei Schritten den Benutzer `penguin` zu der Gruppe `bird` hinzufügen:

- Ändern der Gruppenkonfiguration mit einem der folgenden Befehle:

  - Führen Sie "`sudo usermod -aG bird penguin`" aus.

  - Führen Sie "`sudo adduser penguin bird`" aus (nur auf typischen Debian-Systemen).

  - Führen Sie "`sudo vigr`" für `/etc/group` aus,sowie "`sudo vigr -s`" für `/etc/gshadow`, um `penguin` der Zeile für die Gruppe `bird` hinzuzufügen.

- Übernehmen Sie die Konfiguration mit einer der folgenden Möglichkeiten:

  - Kalt-Neustart und neu anmelden (die beste Option).

  - Logout via GUI menu and login. (This may not work under the modern Desktop environment.)

Sie können mit zwei Schritten den Benutzer `penguin` aus der Gruppe `bird` entfernen:

- Ändern der Gruppenkonfiguration mit einem der folgenden Befehle:

  - Führen Sie "`sudo usermod -rG bird penguin`" aus.

  - Führen Sie "`sudo deluser penguin bird`" aus (nur auf typischen Debian-Systemen).

  - Führen Sie "`sudo vigr`" für `/etc/group`, sowie "`sudo vigr -s`" für `/etc/gshadow` aus, um `penguin` aus der Zeile für die Gruppe `bird` zu entfernen.

- Übernehmen Sie die Konfiguration mit einer der folgenden Möglichkeiten:

  - Kalt-Neustart und neu anmelden (die beste Option).

  - Führen Sie "`kill -TERM -1`" aus sowie einige korrigierende Aktionen wie "`systemctl restart NetworkManager.service`".

  - Abmelden über die grafische Oberfläche ist für den GNOME-Desktop keine Option.

Jegliche Versuche eines Warm-Neustarts sind bei modernen Arbeitsplatzsystemen ein fragiler Ersatz für einen Kalt-Neustart.

| Anmerkung
Alternativ können Sie Benutzer während des Authentifizierungsprozesses dynamisch zu Gruppen hinzufügen, indem Sie die Zeile "`auth optional pam_group.so`" zu "`/etc/pam.d/common-auth`" hinzufügen und "`/etc/security/group.conf`" einrichten. Lesen Sie dazu Kapitel 4, Authentifizierung und Zugriffskontrolle.)

The hardware devices are just another kind of file on the Debian system. If you have problems accessing devices such as USB flash drive and CD-ROM from a user account, you should make that user a member of the relevant group.

Einige erwähnenswerte systemweite Gruppen erlauben ihren Mitglieder, ohne `root`-Privilegien auf die jeweiligen Dateien und Geräte zuzugreifen:

Tabelle 1.7. Liste erwähnenswerter systemweiter Gruppen

Gruppe | Beschreibung der Dateien und Geräte, auf die zugegriffen werden kann
--- | ---
`dialout` | voller und direkter Zugriff auf serielle Ports ("`/dev/ttyS[0-3]`")
`dip` | eingeschränkter Zugriff auf serielle Ports für Dialup IP-(Einwahl-)Verbindungen zu vertrauenswürden Gegenstellen
`cdrom` | CD-ROM- und DVD+/-RW-Laufwerke
`audio` | Audiogeräte (z.B. Soundkarten)
`video` | Videogeräte (z.B. Grafikkarten)
`scanner` | Scanner
`adm` | Systemüberwachungs-Protokolle
`staff` | einige Verzeichnisse für untergeordnete administrative Tätigkeiten: "`/usr/local`", "`/home`"

| Tipp
Sie müssen der Gruppe `dialout` angehören, um ein Modem umzukonfigurieren, sich irgendwo einzuwählen usw. Wenn jedoch `root` vordefinierte Konfigurationsdateien für vertrauenswürdige Gegenstellen in "`/etc/ppp/peers/`" anlegt, müssen Sie lediglich Mitglied der Gruppe `dip` sein, um mit den Befehlen `pppd`(8), `pon`(1) und `poff`(1) Dialup IP-(Einwahl-)Verbindungen herzustellen.

Einige erwähnenswerte, vom System angebotene Gruppen erlauben Ihren Mitgliedern, besondere Befehle ohne `root`-Rechte auszuführen:

Tabelle 1.8. Liste erwähnenswerter, vom System angebotenen Gruppen zur Ausführung besonderer Befehle

Gruppe | Befehle, die ausgeführt werden können
--- | ---
`sudo` | Einen Befehl mit Superuser-Privilegien ausführen
`lpadmin` | Befehle ausführen, um Drucker zur Druckerdatenbank hinzuzufügen, zu modifizieren und zu entfernen

Eine vollständige Liste der vom System angebotenen Benutzer und Gruppen finden Sie in der letzten Version des Dokuments "Users and Groups" in "`/usr/share/doc/base-passwd/users-and-groups.html`" aus dem Paket `base-passwd`.

Lesen Sie `passwd`(5), `group`(5), `shadow`(5), `newgrp`(1), `vipw`(8), `vigr`(8) und `pam_group`(8) für Informationen über Befehle zur Verwaltung des Benutzer- und Gruppensystems.

### 1.2.6. Zeitstempel

Es gibt drei Arten von Zeitstempeln für eine GNU/Linux-Datei:

Tabelle 1.9. Liste der Arten von Zeitstempeln

Art | Bedeutung (historische Unix-Definition)
--- | ---
mtime | Zeitpunkt der letzten Änderung an der Datei (`ls -l`)
ctime | Zeitpunkt der letzten Statusänderung der Datei (`ls -lc`)
atime | Zeitpunkt des letzten Zugriffs auf die Datei (`ls -lu`)

| Anmerkung
ctime ist nicht der Zeitpunkt der Dateierzeugung.

| Anmerkung
Der wirkliche Wert von atime auf einem GNU/Linux-System könnte sich von dem mit der historischen Unix-Definition konformen Variante unterscheiden.

- Das Überschreiben einer Datei ändert die mtime-, ctime- und atime-Attribute der Datei.

- Das Ändern von Eigentümer oder Zugriffsrechten ändert die ctime- und atime-Attribute der Datei.

- Das Lesen einer Datei ändert das atime-Attribut der Datei auf einem historischen Unix-System.

- Das Lesen einer Datei ändert das atime-Attribut der Datei auf einem GNU/Linux-System, wenn das Dateisystem mit dem Argument "`strictatime`" eingebunden wurde.

- Das erstmalige Lesen einer Datei oder das Lesen nach einem Tag ändert das atime-Attribut der Datei auf einem GNU/Linux-System, wenn das Dateisystem mit dem Argument "`relatime`" eingebunden wurde (dies ist das Standardverhalten seit Linux 2.6.30).

- Das Lesen einer Datei ändert nicht das atime-Attribut der Datei auf einem GNU/Linux-System, wenn das Dateisystem mit dem Argument "`noatime`" eingebunden wurde.

| Anmerkung

Die mount-Argument "`noatime`" und "`relatime`" wurden eingeführt, um in normalen Anwendungssituationen die Leistungsfähigkeit der Systeme beim Lesen vom Dateisystem zu verbessern. Der einfache Vorgang zum Lesen einer Datei beinhaltet bei aktivierter "`strictatime`"-Option den zeitaufwendigen Schreibvorgang zum Aktualisieren des atime-Attributs. Jedoch wird das atime-Attribut selten benutzt, außer bei der `mbox`(5)-Datei. Lesen Sie dazu `mount`(8).

Verwenden Sie den Befehl `touch`(1), um den Zeitstempel vorhandener Dateien zu ändern.

Zeitstempel werden in der Ausgabe des `ls`-Befehls lokalisiert angezeigt, wenn ein nicht-englisches Gebietsschema (Locale) eingestellt ist (bei "`de_DE.UTF-8`" also im deutschen Datumsformat.

    $ LANG=C  ls -l foo
    -rw-rw-r-- 1 penguin penguin 0 Oct 16 21:35 foo
    $ LANG=en_US.UTF-8  ls -l foo
    -rw-rw-r-- 1 penguin penguin 0 Oct 16 21:35 foo
    $ LANG=fr_FR.UTF-8  ls -l foo
    -rw-rw-r-- 1 penguin penguin 0 oct. 16 21:35 foo

| Tipp
Lesen Sie Abschnitt 9.3.4, „Angepasste Anzeige von Datum und Uhrzeit“, um die Ausgabe von "`ls -l`" anzupassen.

### 1.2.7. Links

Es gibt zwei Methoden, um die Datei "`foo`" mit einem anderen Dateinamen, z.B. "`bar`" zu verbinden:

- Harter Link

  - doppelter Name für eine existierende Datei

  - "`ln foo bar`"

- symbolischer Link (auch Symlink genannt)

  - eine spezielle Datei, die über deren Namen auf eine andere Datei verweist

  - "`ln -s foo bar`"

Schauen Sie sich folgendes Beispiel bezüglich Änderungen bei der Linkanzahl und den feinen Unterschieden im Resultat des `rm`-Befehls an:

    $ umask 002
    $ echo "Original Content" > foo
    $ ls -li foo
    1449840 -rw-rw-r-- 1 penguin penguin 17 Oct 16 21:42 foo
    $ ln foo bar     # hard link
    $ ln -s foo baz  # symlink
    $ ls -li foo bar baz
    1449840 -rw-rw-r-- 2 penguin penguin 17 Oct 16 21:42 bar
    1450180 lrwxrwxrwx 1 penguin penguin  3 Oct 16 21:47 baz -> foo
    1449840 -rw-rw-r-- 2 penguin penguin 17 Oct 16 21:42 foo
    $ rm foo
    $ echo "New Content" > foo
    $ ls -li foo bar baz
    1449840 -rw-rw-r-- 1 penguin penguin 17 Oct 16 21:42 bar
    1450180 lrwxrwxrwx 1 penguin penguin  3 Oct 16 21:47 baz -> foo
    1450183 -rw-rw-r-- 1 penguin penguin 12 Oct 16 21:48 foo
    $ cat bar
    Original Content
    $ cat baz
    New Content

Der harte Link kann innerhalb des gleichen Dateisystems erstellt werden und teilt sich die gleiche Inode-Nummer mit der Originaldatei, welche Sie mittels der Option "`-i`" des `ls`(1)-Befehls herausfinden können.

Der Symlink hat immer nominal die Dateiberechtigungen "`rwxrwxrwx`", wie in dem obigen Beispiel zu sehen, wobei die letztlich wirksamen Zugriffsrechte durch die Berechtigungen der Datei, auf die verwiesen wird, bestimmt werden.

| Achtung
Es ist grundsätzlich eine gute Idee, keine komplizierten symbolischen oder harten Link zu erstellen, außer Sie haben einen sehr guten Grund dafür. Es könnte Ihnen sonst Albträume bescheren, wenn die logische Kombination von symbolischen Links zu Schleifen im Dateisystem führt.

| Anmerkung
Im allgemeinen sollten Sie symbolische Links gegenüber harten Links bevorzugen, außer Sie haben einen guten Grund, einen harten Link zu verwenden.

Das Verzeichnis "`.`" verweist auf das Verzeichnis, in dem es erscheint, daher steht die Anzahl der Links in jedem neuen Verzeichnis auf 2. "`..`" verweist auf das jeweilige Elternverzeichnis, daher erhöht sich die Anzahl der Links für dieses Verzeichnis mit jedem Hinzufügen eines neuen Unterverzeichnisses.

Wenn Sie gerade von Windows zu Linux wechseln, wird Ihnen bald klar werden, wie gut das Verfahren zum Verknüpfen von Dateinamen bei Unix aufgebaut ist, verglichen mit dem Windows-Equivalent der "Shortcuts". Weil es im Dateisystem implementiert ist, bemerken Anwendungen keinen Unterschied zwischen der verknüpften Datei und dem Original. Im Fall eines harten Links gibt es auch tatsächlich keinen Unterschied.

### 1.2.8. Benannte Pipes (FIFOs)

Eine benannte Pipe (named pipe) ist eine Datei, die sich wie ein Rohr verhält: wenn Sie etwas in die Datei hineingeben, kommt es am anderen Ende wieder heraus. Daher wird sie auch FIFO genannt, vom englischen First-In-First-Out: das erste, was Sie in das Rohr hineingeben, kommt als erstes am anderen Ende wieder heraus.

Wenn Sie in eine benannte Pipe schreiben, wird der Prozess, der in die Pipe schreibt, nicht eher beendet, als bis die zu schreibenden Informationen von der Pipe gelesen wurden. Wenn Sie aus einer benannten Pipe lesen, wartet der lesende Prozess, bis es nichts mehr zu lesen gibt, bevor er beendet wird. Die Größe der Pipe ist immer Null --- sie speichert keine Informationen, sie verbindet lediglich zwei Prozesse, wie dies die Shell mittels "`|`" tut. Da diese Pipe allerdings einen Namen hat, müssen die beiden Prozesse nicht auf der gleichen Befehlszeile und nicht einmal unter dem gleichen Benutzerkonto laufen. Pipes waren eine sehr einflußreiche Innovation von Unix.

Probieren Sie zum Beispiel folgendes:

    $ cd; mkfifo mypipe
    $ echo "hello" >mypipe & # put into background
    [1] 8022
    $ ls -l mypipe
    prw-rw-r-- 1 penguin penguin 0 Oct 16 21:49 mypipe
    $ cat mypipe
    hello
    [1]+  Done                    echo "hello" >mypipe
    $ ls mypipe
    mypipe
    $ rm mypipe

### 1.2.9. Sockets

Sockets werden von allen Internet-Übertragungen, Datenbanken und dem Betriebssystem selbst umfassend genutzt. Sie sind den benannten Pipes (FIFO) ähnlich und erlauben Prozessen, Informationen sogar zwischen verschiedenen Computern auszutauschen. Für die Nutzung von Sockets müssen diese Prozesse nicht zur gleichen Zeit laufen und auch nicht Kindprozesse desselben Urprozesses sein. Ein Socket ist der Endpunkt für die Interprozesskommunikation (IPC). Der Austausch von Informationen kann über das Netzwerk zwischen verschiedenen Rechnern stattfinden. Die beiden meist verwendeten sind der Internet-Socket und der Unix-Domain-Socket.

| Tipp
"`netstat -an`" bietet eine sehr nützliche Übersicht aller auf einem entsprechenden System geöffneten Sockets.

### 1.2.10. Gerätedateien

Gerätedateien verweisen auf physikalische oder virtuelle Geräte auf Ihrem System, wie Ihre Festplatte, Grafikkarte, Bildschirm oder Tastatur. Ein Beispiel für ein virtuelles Gerät ist die Konsole, repräsentiert durch "`/dev/console`".

Es gibt zwei Arten von Gerätedateien:

- Zeichenorientierte Geräte

  - Zugriff immer nur auf ein Zeichen gleichzeitig

  - 1 Zeichen = 1 Byte

  - z.B. Tastatur, serieller Port, …

- Blockorientierte Geräte

  - Zugriff in größeren Einheiten, Blocks genannt

  - 1 Block > 1 Byte

  - z.B. Festplatten, …

Sie können Gerätedateien lesen und schreiben, allerdings enthalten diese möglicherweise Binärdaten, die für Menschen nur unverständliches Kauderwelsch darstellen. Daten direkt in diese Dateien zu schreiben, ist manchmal zur Fehlersuche bei Verbindungsproblemen nützlich. Zum Beispiel können Sie eine Textdatei zur Drucker-Gerätedatei "`/dev/lp0`" schicken oder Modembefehle an den entsprechenden seriellen Port "`/dev/ttyS0`". Aber wenn hierbei nicht mit Vorsicht gearbeitet wird, kann dies eine große Katastrophe verursachen. Seien Sie also auf der Hut.

| Anmerkung
Für den normalen Zugriff auf den Drucker verwenden Sie `lp`(1).

Die Geräte-Node-Nummer wird angezeigt, indem Sie `ls`(1) wie folgt ausführen:

    $ ls -l /dev/sda /dev/sr0 /dev/ttyS0 /dev/zero
    brw-rw---T  1 root disk     8,  0 Oct 16 20:57 /dev/sda
    brw-rw---T+ 1 root cdrom   11,  0 Oct 16 21:53 /dev/sr0
    crw-rw---T  1 root dialout  4, 64 Oct 16 20:57 /dev/ttyS0
    crw-rw-rw-  1 root root     1,  5 Oct 16 20:57 /dev/zero

- "`/dev/sda`" hat die major-Gerätenummer 8 und die minor-Gerätenummer 0. Es ist lesbar/schreibbar für Benutzer, die der Gruppe `disk` angehören.

- "`/dev/sr0`" hat die major-Gerätenummer 11 und die minor-Gerätenummer 0. Es ist lesbar/schreibbar für Benutzer, die der Gruppe `cdrom` angehören.

- "`/dev/ttyS0`" hat die major-Gerätenummer 4 und die minor-Gerätenummer 64. Es ist lesbar/schreibbar für Benutzer, die der Gruppe `dialout` angehören.

- "`/dev/zero`" hat die major-Gerätenummer 1 und die minor-Gerätenummer 5. Es ist lesbar/schreibbar für jeden.

Auf modernen Linux-Systemen wird das Dateisystem unterhalb von "`/dev/`" automatisch durch den `udev`(7)-Mechanismus bestückt.

### 1.2.11. Spezielle Gerätedateien

Es gibt einige spezielle Gerätedateien:

Tabelle 1.10. Liste spezieller Gerätedateien

Gerätedatei | Aktion | Beschreibung der Antwort
--- | --- | ---
`/dev/null` | lesen | gibt das "end-of-file"-Zeichen (EOF) zurück
`/dev/null` | schreiben | gibt nichts zurück (ein bodenloses Loch für Datenmüll)
`/dev/zero` | lesen | gibt das "`\0`"-Zeichen (NUL) zurück (das ist nicht dasselbe wie die Zahl Null in ASCII)
`/dev/random` | lesen | gibt zufällige Zeichen von einem realen Zufallszahlengenerator zurück, der echte Entropie liefert (langsam)
`/dev/urandom` | lesen | gibt zufällige Zeichen von einem kryptografisch sicheren Pseudo-Zufallszahlengenerator zurück
`/dev/full` | schreiben | gibt den "disk-full"-Fehler (ENOSPC, Platte voll) zurück

Diese werden oft in Verbindung mit der Shell-Umleitung genutzt (lesen Sie Abschnitt 1.5.8, „Typische Befehlssequenzen und Shell-Weiterleitungen“).

### 1.2.12. procfs und sysfs

procfs und sysfs, eingebunden unter "`/proc`" und "`/sys`", sind Pseudo-Dateisysteme und bringen interne Datenstrukturen des Kernel in den Userspace. Mit anderen Worten: diese Einträge sind virtuell, sie fungieren als komfortables Fenster zu den Operationen des Betriebssystems.

Das Verzeichnis "`/proc`" enthält (neben anderen Dingen) ein Unterverzeichnis für jeden Prozess, der auf dem System läuft, welches nach der Prozess-ID (PID) benannt ist. Systemwerkzeuge, die auf Prozessinformationen zugreifen, wie `ps`(1), bekommen ihre Informationen aus dieser Verzeichnisstruktur.

Die Verzeichnisse unterhalb von "`/proc/sys/`" enthalten Schnittstellen, um bestimmte Kernel-Parameter zur Laufzeit zu ändern. (Sie können dies möglicherweise auch mit dem spezialisierten Befehl `sysctl`(8) oder seiner Preload-/Konfigurationsdatei "`/etc/sysctl.conf`" erreichen.)

Die Leute geraten regelmäßig in Panik, wenn Sie eine bestimmte Datei bemerken - "`/proc/kcore`" - die wirklich riesig ist. Dies ist (mehr oder weniger) eine Kopie des Inhalts vom Arbeitsspeicher Ihres Rechners. Sie wird für Fehlersuche im Kernel verwendet. Es ist eine virtuelle Datei, die auf den Arbeitsspeicher verweist, sorgen Sie sich daher nicht über ihre Größe.

Das Verzeichnis unterhalb von "`/sys`" enthält vom Kernel exportierte Datenstrukturen, deren Attribute sowie die Anbindungen zwischen ihnen. Es enthält auch Schnittstellen, um bestimmte Kernel-Parameter zur Laufzeit zu ändern.

Lesen Sie "`proc.txt(.gz)`", "`sysfs.txt(.gz)`" sowie weitere dazugehörige Dokumente aus der Linux-Kernel-Dokumentation ("`/usr/share/doc/linux-doc-*/Documentation/filesystems/*`") aus dem Paket `linux-doc-*`.

### 1.2.13. tmpfs

tmpfs ist ein temporäres Dateisystem, das alle Dateien im virtuellen Speicher hält. Die Daten des tmpfs im page cache des Speichers können - falls nötig - in den Swap-Bereich auf der Festplatte ausgelagert werden.

Das Verzeichnis "`/run`" wird im frühen Stadium des Boot-Prozesses als tmpfs eingebunden. Dadurch ist es möglich, in dieses Verzeichnis zu schreiben, auch wenn "`/`" als read-only (nur lesen) eingebunden ist. Dies ist der neue Ablageort für die Speicherung kurzlebiger Statusdateien und ersetzt verschiedene Orte, die im Filesystem Hierarchy Standard Version 2.3 beschrieben sind:

- "`/var/run`" → "`/run`"

- "`/var/lock`" → "`/run/lock`"

- "`/dev/shm`" → "`/run/shm`"

Lesen Sie "`tmpfs.txt(.gz)`" in der Linux-Kernel-Dokumentation ("`/usr/share/doc/linux-doc-2.6.*/Documentation/filesystems/*`") aus dem Paket `linux-doc-2.6.*`.

## 1.3. Midnight Commander (MC)

Midnight Commander (MC) ist ein GNU "Schweizer Messer" für die Linux-Konsole und andere Terminal-Umgebungen. Er bringt Neulingen eine menügeführte Konsole, die viel einfacher zu erlernen ist wie die Standard-Unix-Befehle.

Sie müssen möglicherweise wie folgt das Midnight Commander-Paket mit Namen "`mc`" installieren:

    $ sudo apt-get install mc

Verwenden Sie den `mc`(1)-Befehl, um das Debian-System zu erforschen. Dies ist der beste Weg, um zu lernen. Entdecken Sie einige interessante Orte lediglich durch Verwendung der Pfeiltasten und der Enter-Taste.

- "`/etc`" und dessen Unterverzeichnisse;

- "`/var/log`" und dessen Unterverzeichnisse;

- "`/usr/share/doc`" und dessen Unterverzeichnisse;

- "`/usr/sbin`" und "`/usr/bin`".

### 1.3.1. Anpassen des MC

Um beim Schließen des MC das Arbeitsverzeichnis zu speichern und beim nächsten Start mit `cd` dorthin zu wechseln, empfehle ich, "`~/.bashrc`" zu modifizieren, um ein Skript dort zu integrieren, das vom `mc`-Paket bereitgestellt wird:

    . /usr/lib/mc/mc.sh

Den Grund finden Sie unter `mc`(1) (unter der Option "`-P`"). (Falls Sie nicht verstehen, worum genau es hier geht, können Sie dies später erledigen.)

### 1.3.2. Starten von MC

MC kann wie folgt gestartet werden:

    $ mc

MC kümmert sich über sein Menü um alle Dateioperationen und erfordert dabei nur minimale Anstrengungen des Benutzers. Drücken Sie einfach F1, um die Hilfe-Seiten zu bekommen. Sie können mit dem MC herumspielen, indem Sie einfach die Pfeiltasten und Funktionstasten drücken.

| Anmerkung
In einigen Konsolen, wie `gnome-terminal`(1), könnten Tastendrücke der Funktionstasten vom Konsolenprogramm "gestohlen" werden. Bei `gnome-terminal` können Sie diese Funktionalität über "Bearbeiten" → "Einstellungen" → "Tastenkürzel" deaktivieren.

Wenn Sie Probleme mit der Zeichenkodierung feststellen und Zeichenmüll angezeigt wird, kann das Hinzufügen von "`-a`" zur MC-Befehlszeile helfen, Probleme zu vermeiden.

Falls dies Ihre Anzeigeprobleme mit MC nicht löst, lesen Sie Abschnitt 9.5.6, „Die Terminal-Konfiguration“.

### 1.3.3. Dateimanager in MC

Die Standardanzeige sind zwei Verzeichnisfenster, welche Dateilisten enthalten. Ein anderer nützlicher Modus ist, das rechte Fenster auf "Info" einzustellen, um dort Informationen zu Dateizugriffsrechten und anderem zu erhalten. Wenn der `gpm`(8)-Daemon läuft, kann man auch auf textbasierten Linux-Konsolen eine Maus verwenden. (Stellen Sie sicher, dass Sie die Umschalt-Taste drücken, um im MC das normale Ausschneiden-und-Einfügen-Verhalten zu bekommen.)

Tabelle 1.11. Die Tastaturbefehle von MC

Taste | Tastaturbefehl
--- | ---
`F1` | Hilfe-Menü
`F3` | interner Dateibetrachter
`F4` | interner Texteditor
`F9` | Aufklapp-Menü aktivieren
`F10` | Midnight Commander beenden
`Tab` | zwischen den beiden Fenstern wechseln
`Einfg` oder `Strg-T` | Datei für eine mehrere Dateien betreffende Operation wie Kopieren markieren
`Entf` | Datei löschen (seien Sie vorsichtig --- stellen Sie MC auf "sicheres Löschen")
Pfeiltasten | selbsterklärend

### 1.3.4. Befehlszeilentricks in MC

- `cd`-Befehl wechselt das Verzeichnis, das im gewählten Fenster angezeigt wird.

- `Strg-Enter` oder `Alt-Enter` kopiert einen Dateinamen auf die Befehlszeile. Nutzen Sie dies mit `cp`(1) und `mv`(1) zusammen mit dem Editieren auf der Befehlszeile.

- `Alt-Tab` zeigt Auswahlmöglichkeiten für die Auto-Vervollständigung von Dateinamen.

- Die Start-Verzeichnisse für beide Fenster können MC als Argumente angegeben werden, zum Beispiel "`mc /etc /root`".

- `Esc` + `n-Taste` → `Fn` (d.h. `Esc` + `1` → `F1`, usw.; `Esc` + `0` → `F10`).

- Das Drücken von `Esc` vor einer anderen Buchstabentaste hat den gleichen Effekt wie das Drücken von `Alt` und der anderen Taste zusammen, d. h. drücken Sie `Esc` + `c` für `Alt-C`. `Esc` wird Meta-Taste genannt und manchmal als "`M-`" dargestellt.

### 1.3.5. Der interne Texteditor in MC

Der interne Editor hat ein interessantes Ausschneiden-und-Einfügen-Schema: das Drücken von `F3` setzt den Startpunkt einer zu markierenden Auswahl, ein weiteres `F3` markiert das Ende der Auswahl und hebt die Auswahl hervor. Dann können Sie Ihren Cursor verschieben. Wenn Sie `F6` drücken, wird der ausgewählte Bereich an die Cursor-Position verschoben. Wenn Sie `F5` drücken, wird der ausgewählte Bereich kopiert und an der Cursor-Position eingefügt. `F2` sichert die Datei. `F10` beendet das Ganze. Die meisten Pfeiltasten funktionieren intuitiv.

Dieser Editor kann direkt mit einer Datei gestartet werden, indem einer der folgenden Befehle benutzt wird:

    $ mc -e filename_to_edit

    $ mcedit filename_to_edit

Dies ist kein Multi-Fenster-Editor, aber man kann mehrere Linux-Konsolen verwenden, um den gleichen Effekt zu erreichen. Um Inhalte zwischen verschiedenen Fenstern hin und her zu kopieren, verwenden Sie die Alt-Fn-Tasten, um zwischen den virtuellen Konsolen zu wechseln, und "Datei→Datei einfügen" oder "Datei→Kopie in Datei", um Teile einer Datei in eine andere Datei zu kopieren.

Dieser interne Editor kann auf Wunsch durch jeden anderen externen Editor ersetzt werden.

Außerdem verwenden viele Programme die Umgebungsvariablen "`$EDITOR`" oder "`$VISUAL`", um festzulegen, welcher Editor genutzt wird. Wenn Ihnen `vim`(1) oder `nano`(1) nicht behagen, möchten Sie diese vielleicht auf "`mcedit`" setzen, indem Sie folgende Zeilen zu "`~/.bashrc`" hinzufügen:

    export EDITOR=mcedit
    export VISUAL=mcedit

Ich empfehle, diese wenn möglich auf "`vim`" zu setzen.

Wenn Sie `vim`(1) nicht mögen, können Sie für die meisten Systemwartungsaufgaben auch `mcedit`(1) benutzen.

### 1.3.6. Der interne Dateibetrachter in MC

MC ist ein sehr toller Dateibetrachter. Er ist ein großartiges Werkzeug, um nach Wörtern in Dokumenten zu suchen. Ich verwende ihn immer für Dateien im `/usr/share/doc`-Verzeichnis. Dies ist der schnellste Weg, um Massen von Linux-Informationen zu durchsuchen. Dieser Betrachter kann direkt gestartet werden, indem einer der folgenden Befehle benutzt wird:

    $ mc -v path/to/filename_to_view

    $ mcview path/to/filename_to_view

### 1.3.7. Autostart-Funktionalitäten von MC

Drücken Sie Enter auf einer Datei und das zugehörige Programm wird den Inhalt der Datei verarbeiten (lesen Sie Abschnitt 9.4.11, „Anpassen des zu startenden Programms“). Dies ist eine sehr praktische MC-Funktionalität.

Tabelle 1.12. Die Reaktion auf die Enter-Taste in MC

Dateityp | Reaktion auf die Enter-Taste
--- | ---
ausführbare Datei | Befehl ausführen
Handbuchseiten-Datei | Inhalt an Betrachter-Software weiterleiten
html-Datei | Inhalt an Webbrowser weiterleiten
"`*.tar.gz`"- und "`*.deb`"-Datei | den Inhalt anzeigen, als wäre es ein Unterverzeichnis

Damit diese Betrachter- und virtuellen Dateifunktionalitäten korrekt funktionieren können, sollte bei Dateien, deren Inhalt betrachtet werden kann, nicht die Ausführungs-Berechtigung gesetzt sein. Ändern Sie deren Status ansonsten mit `chmod`(1) oder über das MC-Dateimenü.

### 1.3.8. Virtuelles Dateisystem von MC

MC kann verwendet werden, um über das Internet auf Dateien zuzugreifen. Rufen Sie das Menü auf über `F9`, "`Enter`" und "`h`" aktiviert das virtuelle Dateisystem. Geben Sie eine URL in der Form "`sh://[benutzer@]rechner[:optionen]/[fernes-verzeichnis]`" ein, wodurch (mittels `ssh`) ein auf einem fernen Rechner liegendes Verzeichnis abgerufen wird, das dann wie ein lokales erscheint.

## 1.4. Die grundlegende Unix-ähnliche Arbeitsumgebung

Obwohl MC es Ihnen erlaubt, fast alles zu tun, ist es sehr wichtig für Sie, zu lernen, wie die Befehlszeilenwerkzeuge am Shell-Prompt aufgerufen werden, und mit der Unix-ähnlichen Arbeitsumgebung vertraut zu werden.

### 1.4.1. Die Login-Shell

Da die Login-Shell von einigen Programmen zur Systeminitialisierung verwendet werden könnte, ist es klug, diese auf `bash`(1) eingestellt zu lassen (vermeiden Sie es also auch, mittels `chsh`(1) die Login-Shell zu ändern).

Wenn Sie eine andere interaktive Shell nutzen möchten, stellen Sie dies in der GUI-Konfiguration des Terminal-Emulator-Programms ein oder legen Sie es in `~/.bashrc` fest, z.B. indem Sie dort "`exec /usr/bin/zsh -i -l`" oder "`exec /usr/bin/fish -i -l`" angeben.

Tabelle 1.13. Liste von Shell-Programmen

Paket | Popcon | Größe | POSIX-Shell | Beschreibung
--- | --- | --- | --- | ---
`bash` | V:866, I:999 | 7277 | Ja | Bash: die GNU Bourne Again SHell (De-Facto-Standard)
`bash-completion` | V:35, I:953 | 1952 | Nicht verfügbar | konfigurierbare Vervollständigung für die bash-Shell
`dash` | V:906, I:998 | 207 | Ja | Debian Almquist Shell, gut für Shell-Scripting
`zsh` | V:40, I:70 | 2509 | Ja | Z Shell: die Standard-Shell mit vielen Erweiterungen
`tcsh` | V:4, I:15 | 1366 | Nein | TENEX C Shell: eine erweiterte Version der Berkeley csh
`mksh` | V:5, I:8 | 7713 | Ja | Eine Version der Korn-Shell
`csh` | V:1, I:5 | 348 | Nein | OpenBSD C-Shell, eine Version der Berkeley csh
`sash` | V:0, I:5 | 1335 | Ja | Stand-alone Shell mit integrierten Befehlen (nicht gedacht für Standard "`/usr/bin/sh`")
`ksh` | I:8 | 65 | Ja | die echte AT&T-Version der Korn Shell
`rc` | V:0, I:0 | 182 | Nein | Implementierung der AT&T Plan 9 rc-Shell
`posh` | V:0, I:0 | 187 | Ja | Policy-compliant (grundsatz-konforme) Ordinary SHell (`pdksh`-Abkömmling)

| Tipp
Obwohl sich POSIX-konforme Shells die grundsätzliche Syntax teilen, können sie sich beim Verhalten für Dinge wie Shell-Variablen oder Glob-Ersetzungen unterscheiden. Bitte konsultieren Sie die jeweilige Dokumentation bezüglich weiterer Details.

In dieser Lehrstunde ist mit interaktiver Shell immer `bash` gemeint.

### 1.4.2. Anpassen der bash

Sie können das Verhalten von `bash`(1) mittels "`~/.bashrc`" anpassen.

Probieren Sie zum Beispiel folgendes:

    # enable bash-completion
    if ! shopt -oq posix; then
      if [ -f /usr/share/bash-completion/bash_completion ]; then
        . /usr/share/bash-completion/bash_completion
      elif [ -f /etc/bash_completion ]; then
        . /etc/bash_completion
      fi
    fi

    # CD upon exiting MC
    . /usr/lib/mc/mc.sh

    # set CDPATH to a good one
    CDPATH=.:/usr/share/doc:~:~/Desktop:~
    export CDPATH

    PATH="${PATH+$PATH:}/usr/sbin:/sbin"
    # set PATH so it includes user's private bin if it exists
    if [ -d ~/bin ] ; then
      PATH="~/bin${PATH+:$PATH}"
    fi
    export PATH

    EDITOR=vim
    export EDITOR

| Tipp
Es gibt weitere Tipps zur Anpassung der `bash`, zum Beispiel Abschnitt 9.3.6, „Farbige Befehle“ in Kapitel 9, Systemtipps.

| Tipp
Das `bash-completion`-Paket enthält eine konfigurierbare Auto-Vervollständigung für `bash`.

### 1.4.3. Spezielle Tastendrücke

In einer Unix-ähnlichen Umgebung gibt es ein paar Tastendrücke, die spezielle Bedeutungen haben. Bitte beachten Sie, dass auf einer normalen textbasierten Linux-Konsole nur die linke `Strg`- und `Alt`-Taste wie erwartet funktionieren. Hier ein paar erwähnenswerte Tastendrücke, die Sie sich merken sollten:

Tabelle 1.14. Liste der Tastaturbefehle für bash

Taste | Beschreibung des Tastaturbefehls
--- | ---
`Strg-U` | alle Zeichen vor dem Cursor löschen
`Strg-H` | ein Zeichen vor dem Cursor löschen
`Strg-D` | Eingabe beenden (Shell beenden, wenn Sie eine benutzen)
`Strg-C` | einen laufenden Prozess beenden
`Strg-Z` | Programm vorübergehend stoppen, indem es in den Hintergrund geschoben wird
`Strg-S` | Ausgabe auf den Bildschirm anhalten
`Strg-Q` | Ausgabe auf den Bildschirm wieder starten
`Strg-Alt-Entf` | Neu starten/anhalten des Systems, siehe dazu `inittab`(5)
`Linke-Alt-Taste` (optional `Windows-Taste`) | Meta-Taste für Emacs und ähnliche Benutzerschnittstellen
`Pfeiltaste aufwärts` | Die zuletzt ausgeführten Befehlen der `bash` anzeigen
`Strg-R` | Inkrementelle Suche in den zuletzt ausgeführten Befehlen der `bash`
`Tab` | Auto-Vervollständigung des Dateinamens auf der Befehlszeile in der `bash`
`Strg-V` `Tab` | Eingabe von `Tab` ohne Auto-Vervollständigung auf der Befehlszeile in der `bash`

| Tipp
Die Terminal-Funktionalität von `Strg-S` kann mittels `stty`(1) deaktiviert werden.

### 1.4.4. Mausoperationen

Bei Mausoperationen für text-basierte Anwendungen werden auf Debian-Systemen über einige Kniffe zwei 2 Stile miteinander vermischt:

- Traditionelle Mausoperationen im Unix-Stil:

  - Verwendung von 3 Tasten (Klicken)

  - Verwendung von PRIMARY

  - wird verwendet von X-Anwendungen wie `xterm` sowie von textbasierten Anwendungen in der Linux-Konsole

- Moderne Mausoperationen im GUI-Stil:

  - Verwendung von 2 Knöpfen (Ziehen + Klicken)

  - Verwendung von PRIMARY und ZWISCHENABLAGE

  - wird verwendet in modernen GUI-Anwendungen wie `gnome-terminal`

Tabelle 1.15. Liste von Mausoperationen und zugehörigen Tastenaktionen auf Debian-Systemen

Aktion | Reaktion
--- | ---
Links-Klick und Ziehen der Maus | Bereich als PRIMARY-Auswahl festlegen
Links-Klick | Beginn des Bereich für die PRIMARY-Auswahl festlegen
Rechts-Klick (traditionell) | Ende des Bereich für die PRIMARY-Auswahl festlegen
Rechts-Klick (modern) | Kontextmenü (ausschneiden/kopieren/einfügen)
Mittel-Klick oder Umschalt-`Einfüg` | PRIMARY-Auswahl an Cursor-Position einfügen
`Strg-X` | PRIMARY-Auswahl ausschneiden und in ZWISCHENABLAGE einfügen
`Strg-C` (`Umschalt-Strg-C` im Terminal) | PRIMARY-Auswahl in ZWISCHENABLAGE kopieren
`Strg-V` | Inhalt der ZWISCHENABLAGE an Cursor-Position einfügen

Hierbei ist die PRIMARY-Auswahl der hervorgehobene Textbereich. Innerhalb des Terminal-Programms wird `Umschalt-Strg-C` anstelle von `Strg-C` zum Kopieren benutzt, um zu vermeiden, dass laufende Programme beendet werden.

Das Mittelrad auf einer modernen Radmaus wird als mittlerer Mausknopf betrachtet und kann für den Mittel-Klick verwendet werden. Das gleichzeitige Drücken des rechten und linken Maus-Knopfes wirkt in einem 2-Knopf-Maus-System wie ein Mittel-Klick.

Um eine Maus in textbasierten Linux-Konsolen verwenden zu können, müssen Sie `gpm`(8) als Daemon laufen haben.

### 1.4.5. Der Pager

Der `less`(1)-Befehl ist ein erweiterter Pager (Dateiinhalt-Browser). Er liest die Datei, die per Befehlsargument oder Standardeingabe angegeben wird. Drücken Sie "`h`", wenn Sie beim Anzeigen von Dateiinhalten mit `less` Hilfe benötigen. Er hat viel mehr Fähigkeiten als `more`(1) und kann sogar noch weiter aufgebohrt werden, indem "`eval $(lesspipe)`" oder "`eval $(lessfile)`" im Shell-Startskript ausgeführt wird. Weiteres dazu finden Sie in "`/usr/share/doc/less/LESSOPEN`". Die Option "`-R`" erlaubt die Ausgabe von Rohformat-Zeichen und aktiviert ANSI-Color-Escape-Sequenzen. Lesen Sie dazu `less`(1).

| Tipp
In `less` können Sie "`h`" eingeben, um den Hilfe-Bildschirm anzuzeigen, mit "`/`" oder "`?`" können Sie nach einer Zeichenfolge suchen, und mit "`-i`" schalten Sie zwischen Groß- und Kleinschreibung um.

### 1.4.6. Der Texteditor

Sie sollten lernen, eine der Varianten von Vim oder Emacs zu nutzen, die auf Unix-ähnlichen Systemen beliebt sind.

Ich denke, sich an Vim-Befehle zu gewöhnen, ist das richtige, da der Vi-Editor in der Linux-/Unix-Welt immer vorhanden ist. (Eigentlich sind der originale `vi` oder auch der neue `nvi` Programme, die Sie überall finden. Ich habe stattdessen für Neulinge Vim ausgewählt, da es über `F1` eine Hilfe anbietet, den anderen sehr ähnlich und gleichzeitig noch leistungsfähiger ist.)

Wenn Sie stattdessen entweder Emacs oder XEmacs als Ihren Editor auswählen, ist dies in der Tat eine andere gute Wahl, speziell zum Programmieren. Emacs enthält ebenso eine Fülle an weiteren Funktionen, dazu gehört die Arbeit als Newsreader, Verzeichnis-Editor, Mail-Programm usw. Wenn Sie ihn zum Programmieren oder Editieren von Shell-Skripten verwenden, erkennt er intelligent das Format, an dem Sie arbeiten, und versucht Sie dabei zu unterstützen. Einige Leute behaupten, dass das einzige Programm, dass Sie unter Linux benötigen, Emacs sei. Jetzt zehn Minuten Emacs lernen kann später Stunden an Zeit sparen. Es wird dringend empfohlen, beim Erlernen von Emacs das GNU Emacs-Handbuch als Referenz zur Hand zu haben.

All diese Programme enthalten gewöhnlich Unterrichtseinheiten für Sie, damit Sie sie erlernen können. Starten Sie Vim, indem Sie "`vim`" eingeben, und drücken Sie die F1-Taste. Sie sollten zumindest die ersten 35 Zeilen lesen. Absolvieren Sie dann den Online-Trainingskurs, indem Sie mit dem Cursor auf "`|tutor|`" gehen, und drücken Sie `Strg-]`.

| Anmerkung

Gute Editoren wie Vim und Emacs können Texte mit UTF-8 und anderen exotischen Kodierungen korrekt darstellen. Es ist eine gute Idee, für die GUI-Umgebung eine UTF-8-Locale zu verwenden und dafür benötigte Programme und Schriften zu installieren. Editoren haben Optionen, um die Dateikodierung unabhängig von der GUI-Umgebung zu setzen. Bitte ziehen Sie deren Dokumentation bezüglich Multibyte-Text zu Rate.

### 1.4.7. Einen Standard-Texteditor einstellen

Debian enthält eine Reihe verschiedener Editoren. Wir empfehlen wie oben bereits erwähnt, das `vim`-Paket zu installieren.

Debian bietet über den Befehl "`/usr/bin/editor`" einen einheitlichen Zugriff auf den Standard-Editor des Systems, so dass andere Programme (z. B. `reportbug`(1)) ihn aufrufen können. Sie können ihn wie folgt ändern:

    $ sudo update-alternatives --config editor

Ich empfehle Neulingen, die Auswahl "`/usr/bin/vim.basic`" gegenüber `/usr/bin/vim.tiny` zu bevorzugen, da er Syntaxhervorhebung beherrscht.

| Tipp

Viele Programme nutzen die Umgebungsvariablen "`$EDITOR`" oder "`$VISUAL`", um zu entscheiden, welcher Editor verwendet wird (lesen Sie dazu Abschnitt 1.3.5, „Der interne Texteditor in MC“ und Abschnitt 9.4.11, „Anpassen des zu startenden Programms“). Zwecks Konsistenz auf Debian-Systemen sollten Sie dies auf "`/usr/bin/editor`" setzen. (Früher war "`$EDITOR`" auf "`ed`" und "`$VISUAL`" auf "`vi`" gesetzt.)

### 1.4.8. Verwenden von vim

Der aktuelle `vim`(1) startet selbsttätig mit der schlauen "`nocompatible`"-Option und wechselt in den `NORMAL`-Modus.[1]

Tabelle 1.16. Liste grundlegender Vim-Tastenkürzel

Modus | Tastatureingabe | Aktion
--- | --- | ---
`NORMAL` | `:help|only` | die Hilfedatei anzeigen
`NORMAL` | `:e dateiname.ext` | neuen Puffer öffnen, um `dateiname.ext` zu bearbeiten
`NORMAL` | `:w` | Originaldatei mit aktuellem Puffer überschreiben
`NORMAL` | `:w filename.ext` | aktuellen Puffer in `filename.ext` schreiben
`NORMAL` | `:q` | `vim` beenden
`NORMAL` | `:q!` | Beenden von `vim` erzwingen
`NORMAL` | `:only` | alle anderen vorhandenen Fenster schließen
`NORMAL` | `:set nocompatible?` | prüfen, ob `vim` im schlauen `nocompatible`-Modus läuft
`NORMAL` | `:set nocompatible` | `vim` in den schlauen `nocompatible`-Modus versetzen
`NORMAL` | `i` | in den `EINGABE`-Modus wechseln
`NORMAL` | `R` | in den `ERSETZEN`-Modus wechseln
`NORMAL` | `v` | in den `VISUELL`-Modus wechseln
`NORMAL` | `V` | in den zeilenweise `VISUELLEN` Modus wechseln
`NORMAL` | Strg-`V` | in den blockweise `VISUELLEN` Modus wechseln
außer `TERMINAL-JOB` | `ESC`-Taste | in den `NORMAL`-Modus wechseln
`NORMAL` | `:term` | in den `TERMINAL-JOB`-Modus wechseln
`TERMINAL-NORMAL` | `i` | in den `TERMINAL-JOB`-Modus wechseln
`TERMINAL-JOB` | Strg-`W` `N` (oder Strg-`\` Strg-`N`) | in den `TERMINAL-NORMAL`-Modus wechseln
`TERMINAL-JOB` | Strg-`W` `:` | in den `Ex`-Modus in `TERMINAL-NORMAL` wechseln

Bitte nutzen Sie das "`vimtutor`"-Programm, um die Verwendung von `vim` über einen interaktiven Einführungskurs zu erlernen.

Das `vim`-Programm ändert seine Reaktion auf Tastatureingaben abhängig vom aktiven Modus: Tastatureingaben in den Puffer erfolgen überwiegend im `EINFÜGEN`- oder `ERSETZEN`-Modus. Das Bewegen des Cursors findet meist im `NORMAL`-Modus statt. Interaktive Auswahlen erledigen Sie im `VISUELL`-Modus. Die Eingabe von "`:`" im `NORMAL`-Modus schaltet den Modus in den `Ex`-Modus um. Im `Ex`-Modus werden Befehle akzeptiert.

| Tipp
Vim bringt das Netrw-Paket mit. Netrw unterstützt das Lesen und Schreiben von Dateien sowie das Durchsuchen von Verzeichnissen über das Netzwerk und lokal! Probieren Sie Netrw, indem Sie "`vim .`" ausführen (also ein Punkt als Argument zu vim) und lesen Sie das Handbuch mittels "`:help netrw`".

Informationen zur fortgeschrittenen Konfiguration von `vim` finden Sie in Abschnitt 9.2, „Anpassen von vim“.

### 1.4.9. Aufzeichnen der Shell-Aktivitäten

Die Ausgabe eines Shell-Befehls könnte aus Ihrem Bildschirm herauslaufen und für immer verloren sein. Es ist nützlich, Shell-Aktivitäten in einer Datei zu protokollieren, um sie später kontrollieren zu können. Diese Art der Aufzeichnung ist besonders wichtig für jegliche Systemadministrationsaufgaben.

| Tipp
Der neue Vim (Version>=8.2) kann über seinen `TERMINAL-JOB`-Modus verwendet werden, um Shell-Aktivitäten sauber aufzuzeichnen. Näheres in Abschnitt 1.4.8, „Verwenden von vim“.

Die grundsätzliche Methode, um die Aktivitäten auf der Shell aufzuzeichnen ist, sie via `script`(1) laufen zu lassen.

Probieren Sie zum Beispiel folgendes:

    $ script
    Script started, file is typescript

Führen Sie alle gewünschten Shell-Befehle via `script` aus.

Drücken Sie `Strg-D`, um `script` zu beenden.

    $ vim typescript

Lesen Sie Abschnitt 9.1.1, „Shell-Aktivitäten sauber aufzeichnen“ .

### 1.4.10. Grundlegende Unix-Befehle

Wir wollen einige grundlegende Unix-Befehle lernen. Ich verwende hier "Unix" in seiner allgemeinen Bedeutung. Alle Unix-Clone-Betriebssysteme bieten normalerweise entsprechende gleichbedeutende Befehle. Das Debian-System ist hier keine Ausnahme. Sorgen Sie sich nicht, wenn einige Befehle jetzt bei Ihnen nicht wie gewünscht funktionieren. Falls `alias` in der Shell verwendet wird, sind die zugehörigen Befehlsausgaben unterschiedlich. Diese Beispiele sind nicht dazu gedacht, in dieser Reihenfolge ausgeführt zu werden.

Probieren Sie die folgenden Befehle von einem nicht-privilegierten Benutzerkonto:

Tabelle 1.17. Liste grundlegender Unix-Befehle

Befehl | Beschreibung
--- | ---
`pwd` | Name des derzeitigen/Arbeits-Verzeichnisses
`whoami` | derzeitigen Benutzernamen anzeigen
`id` | derzeitige Benutzeridentität anzeigen (Name, uid (Benutzer-ID), gid (Gruppen-ID) und zugehörige Gruppen)
`file foo` | den Dateityp der Datei "`foo`" anzeigen
`type -p befehlsname` | den Speicherort des Befehls `befehlsname` anzeigen
`which befehlsname` | "
`type befehlsname` | Informationen zum Befehl `befehlsname` anzeigen
`apropos schlüsselwort` | Befehle mit Bezug zu `schlüsselwort` finden
`man -k schlüsselwort` | "
`whatis befehlsname` | eine einzeilige Kurzbeschreibung des Befehls `befehlsname` anzeigen
`man -a befehlsname` | Beschreibung zum Befehl `befehlsname` anzeigen (Unix-Stil)
`info befehlsname` | eher lange Beschreibung zum Befehl "`befehlsname`" anzeigen (GNU-Stil)
`ls` | Inhalte eines Verzeichnisses auflisten (keine versteckten Dateien und Verzeichnisse)
`ls -a` | Inhalte eines Verzeichnisses auflisten (alle Dateien und Verzeichnisse)
`ls -A` | Inhalte eines Verzeichnisses auflisten (nahezu alle Dateien und Verzeichnisse, "`..`" und "`.`" werden übersprungen)
`ls -la` | alle Inhalte eines Verzeichnisses mit detaillierten Informationen auflisten
`ls -lai` | alle Inhalte eines Verzeichnisses mit Inode-Nummer und detaillierten Informationen auflisten
`ls -d` | alle Verzeichnisse im derzeitigen Verzeichnis auflisten
`tree` | Verzeichnisbaum-Inhalte anzeigen
`lsof foo` | "geöffnet"-Status der Datei `foo` anzeigen
`lsof -p pid` | Dateien auflisten, die von dem Prozess mit der ID `pid` geöffnet wurden
`mkdir foo` | ein neues Verzeichnis `foo` im derzeitigen Verzeichnis erstellen
`rmdir foo` | das Verzeichnis `foo` im derzeitigen Verzeichnis löschen
`cd foo` | in das Verzeichnis `foo` im derzeitigen Verzeichnis oder im in der Variable "`$CDPATH`" enthaltenen Verzeichnis wechseln
`cd /` | in das root-Verzeichnis wechseln
`cd` | in das Heimatverzeichnis des derzeitigen Benutzers wechseln
`cd /foo` | in das Verzeichnis mit dem absoluten Pfad "`/foo`" wechseln
`cd ..` | in das übergeordnete Verzeichnis (Eltern-Verzeichnis) wechseln
`cd ~foo` | in das Heimatverzeichnis des Benutzers `foo` wechseln
`cd -` | in das vorherige Verzeichnis wechseln
`</etc/motd pager` | Inhalt von "`/etc/motd`" mit dem Standard-Pager anzeigen
`touch leeredatei` | eine leere Datei mit Namen `leeredatei` erzeugen
`cp foo bar` | die vorhandene Datei `foo` in eine neue Datei `bar` kopieren
`rm unnützedatei` | die Datei `unnützedatei` entfernen
`mv foo bar` | die vorhandene Datei `foo` umbenennen zum neuen Namen `bar` (`bar` darf nicht existieren)
`mv foo bar` | die vorhandene Datei `foo` an einen neuen Ort `bar/foo` verschieben (das Verzeichnis `bar` muss existieren)
`mv foo bar/baz` | die vorhandene Datei `foo` an einen neuen Ort verschieben und gleichzeitig umbenennen nach `bar/baz` (das Verzeichnis `bar` muss existieren, aber der Dateiname `bar/baz` darf nicht existieren)
`chmod 600 foo` | die vorhandene Datei `foo` als nicht lesbar und nicht schreibbar für andere Benutzer einstellen (und nicht ausführbar für alle)
`chmod 644 foo` | die vorhandene Datei `foo` als lesbar, aber nicht schreibbar für andere Benutzer einstellen (und nicht ausführbar für alle)
`chmod 755 foo` | die vorhandene Datei `foo` als lesbar, aber nicht schreibbar für andere Benutzer einstellen (und als ausführbar für alle)
`find . -name Suchmuster` | passende Dateinamen finden durch Verwendung von Shell-`Suchmuster` (langsamer)
`locate -d . Suchmuster` | passende Dateinamen finden durch Verwendung von Shell-`Suchmuster` (schneller, nutzt eine regelmäßig erstellte Datenbank)
`grep -e "Suchmuster" *.html` | das `Suchmuster` in allen Dateien finden, die im derzeitigen Verzeichnis auf "`.html`" enden, und dann anzeigen
`top` | Prozessinformationen im Vollbildschirm-Ansicht anzeigen, drücken Sie "`q`" zum Beenden
`ps aux | pager` | Informationen über alle laufenden Prozesse im BSD-Ausgabestil anzeigen
`ps -ef | pager` | Informationen über alle laufenden Prozesse im Unix-System-V-Ausgabestil anzeigen
`ps aux | grep -e "[e]xim4*"` | alle Prozesse anzeigen, die "`exim`" oder "`exim4`" ausführen
`ps axf | pager` | Informationen über alle laufenden Prozesse in künstlerischem ASCII-Ausgabestil anzeigen
`kill 1234` | einen Prozess abbrechen, identifiziert über die Prozess-ID 1234
`gzip foo` | `foo` mittels Lempel-Ziv-Codierung (LZ77) komprimieren und `foo.gz` erzeugen
`gunzip foo.gz` | `foo.gz` dekomprimieren und `foo` erzeugen
`bzip2 foo` | `foo` mittels Burrows-Wheeler Block-Sorting Textkompressions-Algorithmus und Huffman-Codierung komprimieren und `foo.bz2` erzeugen (bessere Kompression als `gzip`)
`bunzip2 foo.bz2` | `foo.bz2` dekomprimieren und `foo` erzeugen
`xz foo` | `foo` mittels Lempel–Ziv–Markov-Algorithmus komprimieren und `foo.xz` erzeugen (bessere Kompression als `bzip2`)
`unxz foo.xz` | `foo.xz` dekomprimieren und `foo` erzeugen
`tar -xvf foo.tar` | Dateien aus dem Archiv `foo.tar` extrahieren
`tar -xvzf foo.tar.gz` | Dateien aus dem gzip-komprimierten Archiv `foo.tar.gz` extrahieren
`tar -xvjf foo.tar.bz2` | Dateien aus dem Archiv `foo.tar.bz2` extrahieren
`tar -xvJf foo.tar.xz` | Dateien aus dem Archiv `foo.tar.xz` extrahieren
`tar -cvf foo.tar bar/` | Inhalte des Verzeichnisses `bar/` in das Archiv `foo.tar` archivieren
`tar -cvzf foo.tar.gz bar/` | Inhalte des Verzeichnisses `bar/` in das komprimierte Archiv `foo.tar.gz` archivieren
`tar -cvjf foo.tar.bz2 bar/` | Inhalte des Verzeichnisses `bar/` in das Archiv `foo.tar.bz2` archivieren
`tar -cvJf foo.tar.xz bar/` | Inhalte des Verzeichnisses `bar/` in das Archiv `foo.tar.xz` archivieren
`zcat README.gz | pager` | Archivinhalte des komprimierten "`README.gz`"-Archivs mittels Standard-Pager anzeigen
`zcat README.gz > foo` | eine Datei "`foo`" mit dem dekomprimierten Inhalt von "`README.gz`" erstellen
`zcat README.gz >> foo` | den dekomprimierten Inhalt von "`README.gz`" an das Ende der Datei "`foo`" anfügen (Datei vorher erzeugen, falls sie nicht existiert)

| Anmerkung

Unix hat die Tradition, Dateinamen zu verstecken, die mit einem "`.`" beginnen. Dies sind traditionell Dateien, die Konfigurationsinformationen und Benutzereinstellungen enthalten.

Bezüglich des `cd`-Befehls schauen Sie unter `builtins`(7).

Der Standard-Pager auf einem reinen Debian-System ist `more`(1), der nicht rückwärts scrollen kann. Indem Sie das `less`-Paket mittels "`apt-get install less`" installieren, wird `less`(1) zum Standard-Pager und Sie können mit den Pfeiltasten rückwärts scrollen.

Die Zeichen "`[`" und "`]`" in dem regulären Ausdruck des obigen Befehls "`ps aux | grep -e "[e]xim4*"`" vermeiden, dass `grep` sich selbst findet. Das "`4*`" in dem regulären Ausdruck steht für 0 oder mehr Wiederholungen des Zeichens "`4`", wodurch `grep` sowohl "`exim`" wie auch "`exim4`" findet. Obwohl "`*`" in dem Dateinamen und dem regulären Ausdruck verwendet wird, ist ihre Bedeutung unterschiedlich. Lernen Sie die regulären Ausdrücke von `grep`(1).

Bitte durchlaufen Sie zur Übung verschiedene Verzeichnisse und erforschen Sie das System. Wenn Sie Fragen zu einem der Konsolenbefehle haben, seien Sie sicher, dass Sie die Handbuchseite gelesen haben.

Probieren Sie zum Beispiel folgendes:

    $ man man
    $ man bash
    $ man builtins
    $ man grep
    $ man ls

An den Stil der Handbuchseiten kann man sich eventuell etwas schwer gewöhnen, da sie eher knapp gehalten sind, speziell die älteren, traditionellen. Aber wenn Sie sich einmal daran gewöhnt haben, werden Sie die knappe Form zu schätzen wissen.

Bitte beachten Sie, dass viele der Unix-ähnlichen Befehle von GNU und BSD eine kurze Hilfe anzeigen, wenn Sie auf eine der folgenden Arten aufgerufen werden (oder in einigen Fällen ohne jegliche Argumente):

    $ commandname --help
    $ commandname -h

## 1.5. Der einfache Shell-Befehl

Jetzt haben Sie ein Gefühl, wie das Debian-System genutzt wird. Lassen Sie uns tiefer in den Mechanismus der Befehlsausführung einsteigen. Eine genaue Beschreibung finden Sie unter `bash`(1).

Ein einfacher Befehl ist eine Abfolge mehrerer Komponenten.

1. Zuweisung von Variablen (optional)

2. Befehlsname

3. Argumente (optional)

4. Weiterleitungen (optional: `>` , `>>` , `<` , `<<` usw.)

5. Steuer-Operator (optional: `&&` , `||` , newline , `;` , `&` , `(` , `)` )

### 1.5.1. Befehlsausführung und Umgebungsvariablen

Die Werte einiger Umgebungsvariablen verändern teilweise das Verhalten von Unix-Befehlen.

Die Standardwerte von Umgebungsvariablen werden zunächst vom PAM-System gesetzt und dann eventuell von manchen Anwendungsprogrammen wieder zurückgesetzt.

- Das PAM-System (wie `pam_env`) könnte Umgebungsvariablen über "`/etc/pam.conf`", "`/etc/environment`" und "`/etc/default/locale`" setzen.

- Display-Manager wie z.B. `gdm3` setzen Umgebungsvariablen für GUI-Sitzungen unter Umständen über "`~/.profile`" zurück.

- Benutzer-spezifische Programminitialisierungen könnten Umgebungsvariablen über "`~/.profile`", "`~/.bash_profile`" und "`~/.bashrc`" zurücksetzen.

### 1.5.2. Die "`$LANG`"-Variable

Das Standard-Gebietsschema wird über die Umgebungsvariable "`$LANG`" festgelegt; sie hat die Form "`LANG=xx_YY.UTF-8`" und wird vom Installer oder einer späteren GUI-Konfiguration (in GNOME z.B. über "Einstellungen" → "Region & Sprache" → "Sprache" / "Formate") gesetzt.

| Anmerkung
Ich empfehle Ihnen, die Systemumgebung für den Anfang direkt über die "`$LANG`"-Variable zu konfigurieren und die Finger von den "`$LC_*`"-Variablen zu lassen, außer es ist absolut nötig.

Der vollständige Wert für das Gebietsschema (Locale), der an die "`$LANG`"-Variable übergeben wird, besteht aus drei Teilen: "`xx_YY.ZZZZ`".

Tabelle 1.18. Die drei Teile des locale-Wertes

locale-Wert | Bedeutung
--- | ---
`xx` | Sprach-Code laut ISO 639 (in Kleinbuchstaben) wie z.B. "de"
`YY` | Länder-Code laut ISO 3166 (in Großbuchstaben) wie z.B. "DE"
`ZZZZ` | Zeichenkodierung (am besten immer auf "UTF-8" setzen)

Tabelle 1.19. Liste mit Empfehlungen zum Gebietsschema

empfohlenes Gebietsschema | Sprache (Gebiet)
--- | ---
`en_US.UTF-8` | Englisch (USA)
`en_GB.UTF-8` | Englisch (Großbritannien)
`fr_FR.UTF-8` | Französisch (Frankreich)
`de_DE.UTF-8` | Deutsch (Deutschland)
`it_IT.UTF-8` | Italienisch (Italien)
`es_ES.UTF-8` | Spanisch (Spanien)
`ca_ES.UTF-8` | Katalanisch (Spanien)
`sv_SE.UTF-8` | Schwedisch (Schweden)
`pt_BR.UTF-8` | Portugiesisch (Brasilien)
`ru_RU.UTF-8` | Russisch (Russland)
`zh_CN.UTF-8` | Chinesisch (Volksrepublik China)
`zh_TW.UTF-8` | Chinesisch (Taiwan)
`ja_JP.UTF-8` | Japanisch (Japan)
`ko_KR.UTF-8` | Koreanisch (Republik Korea)
`vi_VN.UTF-8` | Vietnamesisch (Vietnam)

Eine typische Befehlsausführung verwendet eine Shell-Sequenz wie die folgende:

    $ echo $LANG
    en_US.UTF-8
    $ date -u
    Wed 19 May 2021 03:18:43 PM UTC
    $ LANG=fr_FR.UTF-8 date -u
    mer. 19 mai 2021 15:19:02 UTC

Hier wird das Programm `date`(1) mit verschiedenen Gebietsschema-Einstellungen ausgeführt.

- Beim ersten Befehl ist "`$LANG`" auf den System-locale-Standardwert "`en_US.UTF-8`" gesetzt.

- Beim zweiten Befehl ist "`$LANG`" auf den französischen UTF-8-locale-Wert "`fr_FR.UTF-8`" gesetzt.

Die meisten Befehlsausführungen haben keine voreingestellten Definitionen für Umgebungsvariablen. Bei dem obigen Beispiel können Sie alternativ auch folgendes ausführen:

    $ LANG=fr_FR.UTF-8
    $ date -u
    mer. 19 mai 2021 15:19:24 UTC

| Tipp
Wenn Sie mit einem nicht auf Englisch eingerichteten System einen Fehlerbericht einreichen, ist es eine gute Idee, die nötigen Befehle mit "`en_US.UTF-8`" als Gebietsschema laufen zu lassen und zu überprüfen.

Tolle Details zur Konfiguration des Gebietsschemas finden Sie in Abschnitt 8.1, „Das Gebietsschema (Locale)“.

### 1.5.3. Die "`$PATH`"-Variable

Wenn Sie einen Befehl in die Shell eingeben, sucht die Shell in den durch die Umgebungsvariable "`$PATH`" definierten Verzeichnissen nach diesem Befehl. Der Wert der Umgebungsvariablen "`$PATH`" wird auch als Shell-Suchpfad bezeichnet.

In der Standard-Debian-Installation enthält die Umgebungsvariable "`$PATH`" bei normalen Benutzerkonten nicht die Verzeichnisse "`/usr/sbin`" und "`/usr/sbin`". Zum Beispiel muss der `ifconfig`-Befehl mit dem vollständigen Pfad aufgerufen werden, also "`/usr/sbin/ifconfig`". Ähnlich dazu ist der `ip`-Befehl in "`/usr/bin`" abgelegt.

Sie können die Umgebungsvariable "`$PATH`" der Bash-Shell über die Dateien "`~/.bash_profile`" oder "`~/.bashrc`" verändern.

### 1.5.4. Die "`$HOME`"-Variable

Viele Befehle speichern Konfigurationsdateien im Heimatverzeichnis des jeweiligen Benutzers. Über diese läßt sich das Verhalten der Befehle anpassen. Der Ort des Heimatverzeichnisses ist in der Umgebungsvariable "`$HOME`" gespeichert.

Tabelle 1.20. Liste der Werte von "`$HOME`"

Wert von "`$HOME`" | Situation bei Programmausführung
--- | ---
`/` | Programm ausgeführt vom init-Prozess (Daemon)
`/root` | Programm ausgeführt von der root-Shell
`/home/normaler_benutzer` | Programm ausgeführt von der Shell des normalen Benutzers
`/home/normaler_benutzer` | Programm ausgeführt vom GUI-Desktop-Menü des normalen Benutzers
`/home/normaler_benutzer` | Programm ausgeführt von root mittels "`sudo programm`"
`/root` | Programm ausgeführt von root mittels "`sudo -H programm`"

| Tipp
Die Shell expandiert "`~/`" zum Heimatverzeichnis des aktuellen Benutzers, also "`$HOME/`", und "`~foo/`" zum Heimatverzeichnis des Benutzers `foo`, also "`/home/foo/`".

Schauen Sie in Abschnitt 12.1.5, „Shell-Umgebungsvariablen“, wenn `$HOME` für Ihr Programm nicht verfügbar ist.

### 1.5.5. Befehlszeilen-Optionen

Einige Befehle akzeptieren Argumente. Argumente, die mit "`-`" oder "`--`" beginnen, werden Optionen genannt und steuern das Verhalten des Befehls.

    $ date
    Thu 20 May 2021 01:08:08 AM JST
    $ date -R
    Thu, 20 May 2021 01:08:12 +0900

Hier ändert das Befehlszeilen-Argument "`-R`" das Verhalten von `date`(1) zwecks Ausgabe einer RFC2822-konformen Datumsangabe.

### 1.5.6. Shell-Glob

Oft möchten Sie einen Befehl auf eine Gruppe von Dateien anwenden, ohne all die Dateinamen einzutippen. Die Dateinamen-Suchmuster mittels Shell-Glob (manchmal auch Wildcards genannt) erfüllen diese Bedürfnisse.

Tabelle 1.21. Shell-Glob-Suchmuster

Shell-Glob-Suchmuster | Beschreibung der Regel
--- | ---
`*` | Dateiname (oder Segment), der nicht mit "`.`" beginnt
`.*` | Dateiname (oder Segment), der mit "`.`" beginnt
`?` | genau ein Zeichen
`[…]` | genau eins der in Klammern eingeschlossenen Zeichen
`[a-z]` | genau ein Zeichen von denen zwischen "`a`" und "`z`"
`[^…]` | genau ein Zeichen von denen, die nicht in Klammern eingeschlossen sind (außer "`^`")

Probieren Sie zum Beispiel folgendes:

    $ mkdir junk; cd junk; touch 1.txt 2.txt 3.c 4.h .5.txt ..6.txt
    $ echo *.txt
    1.txt 2.txt
    $ echo *
    1.txt 2.txt 3.c 4.h
    $ echo *.[hc]
    3.c 4.h
    $ echo .*
    . .. .5.txt ..6.txt
    $ echo .*[^.]*
    .5.txt ..6.txt
    $ echo [^1-3]*
    4.h
    $ cd ..; rm -rf junk

Weitere Details finden Sie in `glob`(7).

| Anmerkung
Anders als die normale Dateinamenerweiterung der Shell findet das Shell-Suchmuster "`*`", das in `find`(1) mit `-name` abgefragt wird, den führenden "`.`" des Dateinamens (neue POSIX-Funktionalität).

| Anmerkung
bash kann dahingehend angepasst werden, sein glob-Verhalten mittels der integrierten shopt-Optionen wie "`dotglob`", "`noglob`", "`nocaseglob`", "`nullglob`", "`extglob`" usw. zu verändern. Lesen Sie dazu `bash`(1).

### 1.5.7. Rückgabewert eines Befehls

Jeder Befehl gibt seinen Beendigungsstatus (Exit-Status, Variable: "`$?`") als Rückgabewert zurück.

Tabelle 1.22. Befehls-Beendigungs-Codes

Befehls-Beendigungsstatus | numerischer Rückgabewert | logischer Rückgabewert
--- | --- | ---
Erfolg | Null, 0 | WAHR
Fehler | nicht-Null, -1 | FALSCH

Probieren Sie zum Beispiel folgendes:

    $ [ 1 = 1 ] ; echo $?
    0
    $ [ 1 = 2 ] ; echo $?
    1

| Anmerkung
Bitte beachten Sie, dass im logischen Zusammenhang für die Shell Erfolg als logisches WAHR betrachtet wird, was 0 (Null) als Wert bedeutet. Dies ist nicht ganz intuitiv und daher soll hier daran erinnert werden.

### 1.5.8. Typische Befehlssequenzen und Shell-Weiterleitungen

Versuchen Sie, sich folgende Shell-Befehlsfolgen zu merken, die in einer Zeile eingegeben werden:

Tabelle 1.23. Abfolgen von Shell-Befehlen

Befehlsabfolge | Beschreibung
--- | ---
`befehl &` | Ausführung von `befehl` im Hintergrund in einer Unter-Shell
`befehl1 | befehl2` | Weiterleitung (pipe) der Standardausgabe von `befehl1` an die Standardeingabe von `befehl2` (gleichzeitige Ausführung)
`befehl1 2>&1 | befehl2` | Weiterleitung (pipe) der Standardausgabe und Standardfehler von `befehl1` an die Standardeingabe von `befehl2` (gleichzeitige Ausführung)
`befehl1 ; befehl2` | Aufeinander folgende Ausführung von `befehl1` und `befehl2`
`befehl1 && befehl2` | Ausführung von `befehl1`; falls erfolgreich, anschließende Ausführung von `befehl2` (Erfolg zurückgeben, wenn beide (`befehl1` und `befehl2`) erfolgreich sind)
`befehl1 || befehl2` | Ausführung von `befehl1`; falls nicht erfolgreich, anschließende Ausführung von `befehl2` (Erfolg zurückgeben, wenn `befehl1` oder `befehl2` erfolgreich ist)
`befehl > foo` | Weiterleitung der Standardausgabe von `befehl` in die Datei `foo` (Datei überschreiben)
`befehl 2> foo` | Weiterleitung des Standardfehlers von `befehl` in die Datei `foo` (Datei überschreiben)
`befehl >> foo` | Weiterleitung der Standardausgabe von `befehl` in die Datei `foo` (an Datei anhängen)
`befehl 2>> foo` | Weiterleitung des Standardfehlers von `befehl` in die Datei `foo` (an Datei anhängen)
`befehl > foo 2>&1` | Weiterleitung der Standardausgabe und Standardfehler von `befehl` in die Datei `foo`
`befehl < foo` | Weiterleitung der Standardeingabe von `befehl` in die Datei `foo`
`befehl << begrenzung` | Weiterleitung der Standardeingabe von `befehl` in die folgenden Zeilen, bis "`begrenzung`" erreicht ist
`befehl <<- delimiter` | Weiterleitung der Standardeingabe von `befehl` in die folgenden Zeilen, bis "`begrenzung`" erreicht ist (die führenden Tab-Zeichen werden von den Eingabezeilen entfernt)

Das Debian-System ist ein Multi-Tasking-System. Hintergrundprozesse erlauben es Benutzern, mehrere Programme in einer einzigen Shell laufen zu lassen. Zur Verwaltung von Hintergrundprozessen werden die Shell-Builtins `jobs`, `fg`, `bg` und `kill` benutzt. Bitte lesen Sie die entsprechenden Abschnitte von bash(1) bezüglich "SIGNALS", "JOB CONTROL" und `builtins`(1).

Probieren Sie zum Beispiel folgendes:

    $ </etc/motd pager

    $ pager </etc/motd

    $ pager /etc/motd

    $ cat /etc/motd | pager

Obwohl alle 4 Beispiele von Shell-Weiterleitungen dasselbe anzeigen, führt das letzte Beispiel einen separaten `cat`-Befehl aus und verschwendet ohne Grund zusätzliche Ressourcen.

Die Shell erlaubt Ihnen, Dateien mittels dem `exec`-Builtin mit einem frei wählbaren Datei-Deskriptor zu öffnen.

    $ echo Hello >foo
    $ exec 3<foo 4>bar  # open files
    $ cat <&3 >&4       # redirect stdin to 3, stdout to 4
    $ exec 3<&- 4>&-    # close files
    $ cat bar
    Hello

Die Datei-Deskriptoren 0-2 sind fest vordefiniert.

Tabelle 1.24. Vordefinierte Datei-Deskriptoren

Gerät | Beschreibung | Datei-Deskriptor
--- | --- | ---
`stdin` | Standardeingabe | 0
`stdout` | Standardausgabe | 1
`stderr` | Standardfehler | 2

### 1.5.9. Befehls-Alias

Sie können einen Alias für häufig verwendete Befehle definieren.

Probieren Sie zum Beispiel folgendes:

    $ alias la='ls -la'

Jetzt funktioniert "`la`" als Kurzform für "`ls -la`", was alle Dateien in einem langen Listenformat auflistet.

Sie können alle vorhandenen Alias-Definitionen mit `alias` anzeigen (lesen Sie dazu in `bash`(1) den Abschnitt "SHELL BUILTIN COMMANDS").

    $ alias
    ...
    alias la='ls -la'

Sie können den exakten Pfad oder die Identität eines Befehls mit `type` herausfinden (lesen Sie dazu in `bash`(1) den Abschnitt "SHELL BUILTIN COMMANDS").

Probieren Sie zum Beispiel folgendes:

    $ type ls
    ls is hashed (/bin/ls)
    $ type la
    la is aliased to ls -la
    $ type echo
    echo is a shell builtin
    $ type file
    file is /usr/bin/file

Hier wurde kürzlich nach "`ls`" gesucht, nach "`file`" hingegen nicht, daher ist "`ls`" "hashed", d.h. die Shell hat einen internen Eintrag für einen schnellen Zugriff auf den Speicherort des "`ls`"-Befehls.

| Tipp
Lesen Sie Abschnitt 9.3.6, „Farbige Befehle“.

## 1.6. Unix-ähnliche Textverarbeitung

In Unix-ähnlichen Arbeitsumgebungen können Textverarbeitungsvorgänge durchgeführt werden, indem der Text durch Abfolgen mehrerer Standardwerkzeuge geleitet wird. Dies war eine weitere bedeutende Unix-Innovation.

### 1.6.1. Unix-Textverarbeitungswerkzeuge

Es gibt ein paar Standard-Textverarbeitungswerkzeuge, die auf Unix-ähnlichen Systemen sehr oft verwendet werden.

- Ohne Verwendung regulärer Ausdrücke:

  - `cat`(1) verkettet Dateien und gibt den vollständigen Inhalt aus.

  - `tac`(1) verkettet Dateien und gibt den Inhalt in umgekehrter Reihenfolge aus.

  - `cut`(1) wählt Teile von Zeilen und ausgegebenen Inhalten aus.

  - `head`(1) gibt die ersten Zeilen von Dateien aus.

  - `tail`(1) gibt die letzten Zeilen von Dateien aus.

  - `sort`(1) sortiert Zeilen von Textdateien.

  - `uniq`(1) entfernt doppelte Zeilen aus einer sortierten Datei.

  - `tr`(1) übersetzt oder löscht Zeichen.

  - `diff`(1) vergleicht Dateien Zeile für Zeile.

- Mit Verwendung grundlegender regulärer Ausdrücke (basic regular expressions / BRE) als Standardeinstellung:

  - `ed`(1) ist ein primitiver Zeilen-Editor.

  - `sed`(1) ist ein Stream-Editor.

  - `grep`(1) findet Text über Suchmuster.

  - `vim`(1) ist ein Bildschirm-gestützter Editor.

  - `emacs`(1) ist ein Bildschirm-gestützter Editor (leicht erweiterte BRE)

- Mit Verwendung erweiterter regulärer Ausdrücke (extended regular expressions / ERE):

  - `awk`(1) führt einfache Textverarbeitung durch.

  - `egrep`(1) findet Text über Suchmuster.

  - `tcl`(3tcl) kann jede erdenkliche Art von Textverarbeitung durchführen. Lesen Sie dazu `re_syntax`(3). Oft zusammen mit `tk`(3tk) verwendet.

  - `perl`(1) kann jede erdenkliche Art von Textverarbeitung durchführen. Lesen Sie dazu `perlre`(1).

  - `pcre2grep`(1) aus dem `pcre2-util`-Paket findet Text über Perl-kompatible reguläre Ausdrücke (PCRE).

  - `python`(1) mit dem `re`-Modul kann jede erdenkliche Art von Textverarbeitung durchführen. Lesen Sie dazu "`/usr/share/doc/python/html/index.html`".

Wenn Sie sich nicht sicher sind, was genau diese Befehle tun, verwenden Sie bitte "`man befehl`", um es selbst herauszufinden.

| Anmerkung
Sortierreihenfolge und Bereichsausdruck sind abhängig vom Gebietsschema (Locale). Wenn Sie das traditionelle Verhalten eines Befehls erreichen möchten, verwenden Sie die Locale C oder C.UTF-8 statt der normalen UTF-8-Locales (siehe Abschnitt 8.1, „Das Gebietsschema (Locale)“).

| Anmerkung
Die regulären Perl-Erweiterungen (`perlre`(1)), Perl-kompatiblen regulären Ausdrücke (PCRE) sowie regulären Python-Erweiterungen (bereitgestellt durch das `re`-Modul) enthalten viele gängige Erweiterungen zu den normalen erweiterten regulären Ausdrücken (ERE).

### 1.6.2. Reguläre Ausdrücke

Reguläre Ausdrücke werden in vielen Textverarbeitungswerkzeugen verwendet. Sie sind den Shell Globs ähnlich, aber viel komplexer und leistungsfähiger.

Ein regulärer Ausdruck beschreibt ein Muster und besteht aus Textzeichen und Metazeichen.

Ein Metazeichen ist einfach ein Zeichen mit einer speziellen Bedeutung. Es gibt zwei Hauptgruppen, BRE und ERE, abhängig von den Textwerkzeugen, wie unten beschrieben.

Tabelle 1.25. Metazeichen für BRE und ERE

BRE | ERE | Beschreibung des regulären Ausdrucks
--- | --- | ---
`\ . [ ] ^ $ *` | `\ . [ ] ^ $ *` | allgemeine Metazeichen
`\+ \? \( \) \{ \} \|` |  | nur bei BRE: durch "`\`" geschützte Metazeichen
| `+ ? ( ) { } |` | nur bei ERE: nicht durch "`\`" geschützte Metazeichen
`c` | `c` | findet Nicht-Metazeichen "`c`"
`\c` | `\c` | findet den Buchstaben "`c`", auch wenn "`c`" selbst ein Metazeichen ist
`.` | `.` | findet jegliches Zeichen inklusive Newline
`^` | `^` | Position am Anfang einer Zeichenkette
`$` | `$` | Position am Ende einer Zeichenkette
`\<` | `\<` | Position am Anfang eines Wortes
`\>` | `\>` | Position am Ende eines Wortes
`[abc…]` | `[abc…]` | findet irgendein Zeichen von "`abc…`"
`[^abc…]` | `[^abc…]` | findet irgendein Zeichen außer "`abc…`"
`r*` | `r*` | findet keinen oder mehrere reguläre Ausdrücke festgelegt durch "`r`"
`r\+` | `r+` | findet einen oder mehrere reguläre Ausdrücke festgelegt durch "`r`"
`r\?` | `r?` | findet keinen oder einen regulären Ausdruck festgelegt durch "`r`"
`r1\|r2` | `r1|r2` | findet einen der regulären Ausdrücke festgelegt durch "`r1`" oder "`r2`"
`\(r1\|r2\)` | `(r1|r2)` | findet einen der regulären Ausdrücke festgelegt durch "`r1`" oder "`r2`" und behandelt es als einen in Klammern gesetzten regulären Ausdruck

Die regulären Ausdrücke von `emacs` gehören grundsätzlich zu den BRE, sind aber erweitert worden, damit "`+`" und "`?`" wie bei den ERE als Metazeichen behandelt werden. Es ist daher nicht nötig, sie bei den regulären Ausdrücken von `emacs` mit "`\`" zu schützen.

`grep`(1) kann verwendet werden, um eine Textsuche mittels regulärer Ausdrücke durchzuführen.

Probieren Sie zum Beispiel folgendes:

    $ egrep 'GNU.*LICENSE|Yoyodyne' /usr/share/common-licenses/GPL
    GNU GENERAL PUBLIC LICENSE
    GNU GENERAL PUBLIC LICENSE
    Yoyodyne, Inc., hereby disclaims all copyright interest in the program

| Tipp
Lesen Sie Abschnitt 9.3.6, „Farbige Befehle“.

### 1.6.3. Ersetzungsausdrücke

Bei den Ersetzungsausdrücken haben einige Zeichen spezielle Bedeutungen.

Tabelle 1.26. Der Ersetzungsausdruck

Ersetzungsausdruck | Beschreibung des Textes, der den Ersetzungsausdruck ersetzen soll
--- | ---
`&` | was der reguläre Ausdruck gefunden hat (benutzen Sie `\&` in `emacs`)
`\n` | was der n-te in Klammern gesetzte reguläre Ausdruck gefunden hat ("n" ist ein Zahl)

Bei Ersetzungsausdrücken für Perl wird "$&" statt "&" verwendet und "$n" statt "\n".

Probieren Sie zum Beispiel folgendes:

    $ echo zzz1abc2efg3hij4 | \
    sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/=&=/'
    zzz=1abc2efg3hij4=
    $ echo zzz1abc2efg3hij4 | \
    sed -E -e 's/(1[a-z]*)[0-9]*(.*)$/=&=/'
    zzz=1abc2efg3hij4=
    $ echo zzz1abc2efg3hij4 | \
    perl -pe 's/(1[a-z]*)[0-9]*(.*)$/=$&=/'
    zzz=1abc2efg3hij4=
    $ echo zzz1abc2efg3hij4 | \
    sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/\2===\1/'
    zzzefg3hij4===1abc
    $ echo zzz1abc2efg3hij4 | \
    sed -E -e 's/(1[a-z]*)[0-9]*(.*)$/\2===\1/'
    zzzefg3hij4===1abc
    $ echo zzz1abc2efg3hij4 | \
    perl -pe 's/(1[a-z]*)[0-9]*(.*)$/$2===$1/'
    zzzefg3hij4===1abc

Achten Sie hier bitte besonders auf die Art der in Klammern gesetzten regulären Ausdrücke und wie die gefundenen Zeichenketten bei der Textersetzung mit verschiedenen Werkzeugen genutzt werden.

Diese regulären Ausdrücke können in einigen Editoren auch zur Cursor-Verschiebung und Textersetzung verwendet werden.

Der Back-Slash "`\`" am Ende der Zeile in der Shell-Befehlszeile schützt das Newline als Leerraum-Zeichen und erlaubt die Fortsetzung der Shell-Befehlszeileneingabe in die nächste Zeile.

Bitte lesen Sie alle zugehörigen Handbuchseiten, um diese Befehle zu erlernen.

### 1.6.4. Globale Ersetzungen mit regulären Ausdrücken

Der Befehl `ed`(1) ersetzt hier alle Vorkommen von "`VON_REGEX`" in "`datei`" durch "`ZU_TEXT`".

    $ ed file <<EOF
    ,s/FROM_REGEX/TO_TEXT/g
    w
    q
    EOF

Der Befehl `sed`(1) ersetzt hier alle Vorkommen von "`VON_REGEX`" in "`datei`" durch "`ZU_TEXT`".

    $ sed -i -e 's/FROM_REGEX/TO_TEXT/g' file

Der Befehl `vim`(1) ersetzt hier durch Verwendung der `ex`(1)-Befehle alle Vorkommen von "`VON_REGEX`" in "`datei`" durch "`ZU_TEXT`".

    $ vim '+%s/FROM_REGEX/TO_TEXT/gc' '+update' '+q' file

| Tipp
Die "`c`"-Markierung in dem obigen Beispiel gewährleistet die interaktive Ersetzung jedes Vorkommmnisses.

Mehrere Dateien ("`datei1`", "`datei2`" und "`datei3`") können auf ähnlichem Wege mittels regulärer Ausdrücke mit `vim`(1) oder `perl`(1) verarbeitet werden.

    $ vim '+argdo %s/FROM_REGEX/TO_TEXT/gce|update' '+q' file1 file2 file3

| Tipp
Die Option "`e`" in dem obigen Beispiel verhindert, dass der "No match"-Fehler die Zuweisung unterbricht.

    $ perl -i -p -e 's/FROM_REGEX/TO_TEXT/g;' file1 file2 file3

In dem perl(1)-Beispiel steht "`-i`" für direkte Bearbeitung der jeweiligen Zieldatei und "`-p`" für implizites Abarbeiten aller angegebenen Dateien mittels Schleifen.

| Tipp
Durch die Verwendung von "`-i.bak`" statt "`-i`" wird jede Originaldatei gesichert, dabei wird "`.bak`" zum Dateinamen hinzugefügt. Dies erlaubt eine einfachere Wiederherstellung bei Fehlern in komplexen Situationen.

| Anmerkung
`ed`(1) und `vim`(1) gehören zu den BRE, `perl`(1) zu den ERE.

### 1.6.5. Extrahieren von Daten aus einer Textdatei-Tabelle

Wir nehmen an, eine Textdatei namens "`DPL`" enthält die Namen einiger Debian-Projektleiter der Jahre vor 2004 sowie deren Ernennungsdatum in einem durch Leerzeichen getrennten Format:

    Ian     Murdock   August  1993
    Bruce   Perens    April   1996
    Ian     Jackson   January 1998
    Wichert Akkerman  January 1999
    Ben     Collins   April   2001
    Bdale   Garbee    April   2002
    Martin  Michlmayr March   2003

| Tipp
Lesen Sie "Eine kurze Geschichte von Debian " bezüglich der neuesten Vergangenheit zum Debian-Projektleiter.

Awk wird oft verwendet, um Daten aus dieser Art von Dateien zu extrahieren.

Probieren Sie zum Beispiel folgendes:

    $ awk '{ print $3 }' <DPL                   # month started
    August
    April
    January
    January
    April
    April
    March
    $ awk '($1=="Ian") { print }' <DPL          # DPL called Ian
    Ian     Murdock   August  1993
    Ian     Jackson   January 1998
    $ awk '($2=="Perens") { print $3,$4 }' <DPL # When Perens started
    April 1996

Auch Shells wie Bash können verwendet werden, um diese Art von Dateien zu verarbeiten.

Probieren Sie zum Beispiel folgendes:

    $ while read first last month year; do
        echo $month
      done <DPL
    ... same output as the first Awk example

Hier verwendet der Builtin-Befehl `read` Zeichen aus "`$IFS`" (interne Feldseparatoren), um Zeilen in einzelne Wörter aufzusplitten.

Wenn Sie "`$IFS`" in "`:`" ändern, können Sie auf nette Weise "`/etc/passwd`" mit der Shell verarbeiten.

    $ oldIFS="$IFS"   # save old value
    $ IFS=':'
    $ while read user password uid gid rest_of_line; do
        if [ "$user" = "bozo" ]; then
          echo "$user's ID is $uid"
        fi
      done < /etc/passwd
    bozo's ID is 1000
    $ IFS="$oldIFS"   # restore old value

(Wenn Awk dies erledigen soll, verwenden Sie "`FS=':'`", um den Feldseparator festzulegen.)

IFS wird auch von der Shell verwendet, um die Ergebnisse von Parameterexpansion, Befehlsersetzung und arithmetischer Expansion aufzusplitten. Diese werden nicht innerhalb von doppelten oder einfachen Anführungszeichen dargestellt. Der Standardwert von IFS ist die Kombination von Space, Tab und Newline.

Seien Sie vorsichtig bei der Verwendung dieser Shell-IFS-Tricks. Verrückte Dinge passieren, wenn die Shell einige Teile des Skripts als eigene Eingabe interpretiert.

    $ IFS=":,"                        # use ":" and "," as IFS
    $ echo IFS=$IFS,   IFS="$IFS"     # echo is a Bash builtin
    IFS=  , IFS=:,
    $ date -R                         # just a command output
    Sat, 23 Aug 2003 08:30:15 +0200
    $ echo $(date -R)                 # sub shell --> input to main shell
    Sat  23 Aug 2003 08 30 36 +0200
    $ unset IFS                       # reset IFS to the default
    $ echo $(date -R)
    Sat, 23 Aug 2003 08:30:50 +0200

### 1.6.6. Skript-Schnipsel für die Befehlsweiterleitung

Die folgenden Befehlsketten tun nette Dinge als Teil einer Weiterleitung:

Tabelle 1.27. Liste von Skript-Schnipseln für die Befehlsweiterleitung

Skript-Schnipsel (in einer Zeile eingeben) | Auswirkung des Befehls
--- | ---
`find /usr -print` | findet alle Dateien in "`/usr`"
`seq 1 100` | gibt die Zahlen 1 bis 100 aus
`| xargs -n 1 befehl` | führt <befehl> wiederholt aus, jeweils mit jedem Element aus der Weiterleitung als Argument
`| xargs -n 1 echo` | splittet durch Leerraum getrennte Elemente aus der Weiterleitung in einzelne Zeilen auf
`| xargs echo` | führt alle Zeilen aus der Weiterleitung in eine Zeile zusammen
`| grep -e regex_muster` | extrahiert Zeilen aus der Weiterleitung, die das Regex-Suchmuster enthalten
`| grep -v -e regex_muster` | extrahiert Zeilen aus der Weiterleitung, die nicht das Regex-Suchmuster enthalten
`| cut -d: -f3 -` | extrahiert das dritte Feld aus der Weiterleitung, separiert durch "`:`" (z.B. aus der passwd-Datei)
`| awk '{ print $3 }'` | extrahiert das dritte Feld aus der Weiterleitung, separiert durch Leerraum-Zeichen
`| awk -F'\t' '{ print $3 }'` | extrahiert das dritte Feld aus der Weiterleitung, separiert durch Tab
`| col -bx` | entfernt Backspace und expandiert Tabs zu Leerzeichen
`| expand -` | expandiert Tabs
`| sort| uniq` | sortiert Inhalte und entfernt Duplikate
`| tr 'A-Z' 'a-z'` | konvertiert Großschreibung in Kleinschreibung
`| tr -d '\n'` | führt mehrere Zeilen in eine zusammen
`| tr -d '\r'` | entfernt CR (carriage return/Wagenrücklauf)
`| sed 's/^/# /'` | fügt "`#`" zum Anfang jeder Zeile hinzu
`| sed 's/\.ext//g'` | entfernt "`.ext`"
`| sed -n -e 2p` | gibt die zweite Zeile aus
`| head -n 2 -` | gibt die ersten zwei Zeilen aus
`| tail -n 2 -` | gibt die letzten zwei Zeilen aus

Ein einzeiliges Shell-Skript kann durch Verwendung von `find`(1) und `xargs`(1) über Schleifen viele Dateien in Folge abarbeiten und so ziemlich komplexe Aufgaben erledigen. Lesen Sie dazu Abschnitt 10.1.5, „Aufrufe für die Auswahl von Dateien“ und Abschnitt 9.4.9, „Einen Befehl wiederholt mit einer Schleife über verschiedene Dateien ausführen“.

Wenn die Verwendung des interaktiven Shell-Modus' zu kompliziert wird, ziehen Sie bitte in Erwägung, ein Shell-Skript zu schreiben (weiteres dazu in Abschnitt 12.1, „Das Shell-Skript“).

[1] Auch ältere `vim`-Versionen können im schlauen "`nocompatible`"-Modus genutzt werden, wenn Sie mit der Option "`-N`" gestartet werden.

Vorwort |  | Kapitel 2. Debian-Paketmanagement