Kapitel 1. GNU/Linux-Lehrstunde

Inhaltsverzeichnis

1.1. Grundlagen für die Konsole
1.1.1. Die Shell-Eingabeaufforderung (Shell-Prompt)
1.1.2. Die Shell-Eingabeaufforderung unter X
1.1.3. Das root-Benutzerkonto
1.1.4. Die root-shell-Eingabeaufforderung
1.1.5. Systemadministrations-Werkzeuge mit GUI
1.1.6. Virtuelle Konsolen
1.1.7. Wie Sie die Eingabeaufforderung wieder verlassen
1.1.8. Wie Sie das System herunterfahren
1.1.9. Eine Konsole wiederherstellen
1.1.10. Zusätzliche Paketempfehlungen für Neulinge
1.1.11. Ein zusätzliches Benutzerkonto
1.1.12. sudo-Konfiguration
1.1.13. Zeit zum Spielen
1.2. Unix-ähnliches Dateisystem
1.2.1. Unix-Dateigrundlagen
1.2.2. Dateisystem-Internas
1.2.3. Dateisystem-Berechtigungen
1.2.4. Steuerung der Berechtigungen für neu erzeugte Dateien: umask
1.2.5. Berechtigungen für Gruppen von Benutzern (group)
1.2.6. Zeitstempel
1.2.7. Links
1.2.8. Benannte Pipes (FIFOs)
1.2.9. Sockets
1.2.10. Gerätedateien
1.2.11. Spezielle Gerätedateien
1.2.12. procfs und sysfs
1.2.13. tmpfs
1.3. Midnight Commander (MC)
1.3.1. Anpassen des MC
1.3.2. Starten von MC
1.3.3. Dateimanager in MC
1.3.4. Befehlszeilentricks in MC
1.3.5. Der interne Texteditor in MC
1.3.6. Der interne Dateibetrachter in MC
1.3.7. Auto-Start-Funktionalitäten von MC
1.3.8. Virtuelles FTP-Dateisystem von MC
1.4. Die grundlegende Unix-ähnliche Arbeitsumgebung
1.4.1. Die Login-Shell
1.4.2. Anpassen der bash
1.4.3. Spezielle Tastendrücke
1.4.4. Mausoperationen im Unix-Stil
1.4.5. Der Pager
1.4.6. Der Texteditor
1.4.7. Einen Standard-Texteditor einstellen
1.4.8. Anpassen von vim
1.4.9. Aufzeichnen der Shell-Aktivitäten
1.4.10. Grundlegende Unix-Befehle
1.5. Der einfache Shell-Befehl
1.5.1. Befehlsausführung und Umgebungsvariablen
1.5.2. Die "$LANG"-Variable
1.5.3. Die "$PATH"-Variable
1.5.4. Die "$HOME"-Variable
1.5.5. Befehlszeilen-Optionen
1.5.6. Shell-Glob
1.5.7. Rückgabewert des Befehls
1.5.8. Typische Befehlssequenzen und Shell-Weiterleitungen
1.5.9. Befehls-Alias
1.6. Unix-ähnliche Textverarbeitung
1.6.1. Unix-Textverarbeitungswerkzeuge
1.6.2. Reguläre Ausdrücke
1.6.3. Ersetzungsausdrücke
1.6.4. Globale Ersetzungen mit regulären Ausdrücken
1.6.5. Extrahieren von Daten aus einer Textdatei-Tabelle
1.6.6. Skript-Schnipsel für die Befehlsweiterleitung

Ich denke, ein Computersystem zu erlernen ist wie das Lernen einer neuen Sprache. Obwohl Anleitungen und Dokumentation hilfreich sind, müssen Sie es selbst einüben. Um Ihnen bei einem sanften Start zu helfen, werde ich einige grundsätzliche Dinge hier ausführen.

Das kraftvolle Design von Debian GNU/Linux stammt von dem Unix-Betriebssystem, d. h. einem Multiuser- und Multitasking-Betriebssystem. 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 Ihnen so viele nützliche Informationen geraubt würden.

[Anmerkung] Anmerkung

Falls Sie bereits irgend ein Unix-ähnliches System für eine Weile mit Befehlszeilenwerkzeugen genutzt haben, wissen Sie möglicherweise bereits alles, was ich hier beschreibe. Bitte nutzen Sie dies als Realitätscheck und zur Auffrischung.

Nach dem Starten des Systems wird Ihnen ein zeichenbasierter Anmeldebildschirm präsentiert, sofern Sie nicht das X-Window-System mit einem Displaymanager wie gdm3 installiert haben. Angenommen Ihr Rechnername ist foo, so sieht der Anmeldebildschirm wie folgt aus:

foo login:

Falls Sie eine Umgebung mit grafischer Benutzerschnittstelle (GUI) wie GNOME oder KDE installiert haben, können Sie solch einen Anmeldebildschirm bekommen, indem Sie Strg-Alt-F1 drücken; mit Strg-Alt-F7 kehren Sie zur GUI-Umgebung zurück (mehr dazu unten unter Abschnitt 1.1.6, „Virtuelle Konsolen“).

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

[Anmerkung] Anmerkung

Folgend der Unix-Tradition ist bei Benutzername und Passwort die Groß- und Kleinschreibung relevant. Im Benutzernamen werden gewöhnlich nur Kleinbuchstaben verwendet. Das erste Benutzerkonto wird normalerweise während der Installation angelegt. Weitere Benutzerkonten können mit adduser(8) durch root erstellt werden.

Das System startet mit der Grußnachricht, die in "/etc/motd" (Message Of The Day, Meldung des Tages) gespeichert ist, und präsentiert einen Befehls-Prompt.

Debian GNU/Linux jessie/sid foo tty1
foo login: penguin
Password:
Last login: Mon Sep 23 19:36:44 JST 2013 on tty3
Linux snoopy 3.11-1-amd64 #1 SMP Debian 3.11.6-2 (2013-11-01) 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.
foo:~$

Hierbei kann der Hauptteil der Grußnachricht über das Editieren der Datei "/etc/motd.tail" angepasst werden. Die erste Zeile wird aus den Systeminformationen mittels "uname -snrvm" erzeugt.

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

Falls bei Ihnen das X-Window-System mit einem Displaymanager wie GNOMEs gdm3 installiert ist, weil Sie während der Installation die Programmgruppe "Arbeitsplatzumgebung" (Desktop environment) ausgewählt haben, bekommen Sie nach dem Systemstart einen grafischen Anmeldebildschirm. Geben Sie Ihren Benutzernamen und Ihr Passwort ein, um sich mit dem unprivilegierten Benutzerkonto anzumelden. Verwenden Sie dabei die TAB-Taste, um zwischen Benutzername und Passwort zu wechseln, oder benutzen Sie die Maus.

Unter X 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 kommen Sie per Klicken auf "Anwendungen" → "Systemwerkzeuge" → "Terminal" zum Ziel.

Lesen Sie auch unten den Abschnitt 1.1.6, „Virtuelle Konsolen“.

Bei einigen anderen Arbeitsplatz-Umgebungen (wie fluxbox) gibt es möglicherweise keine offensichtliche Möglichkeit, um ein Menü zu bekommen. Falls dies passiert, versuchen Sie einfach einen Rechtsklick auf den Desktop-Hintergrund und hoffen darauf, dass ein Menü erscheint.

Das root-Benutzerkonto wird auch Superuser oder privilegierter Benutzer genannt. Mit diesem Benutzerkonto können Sie die folgenden Aufgaben zur Systemadministration 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 deren Passwort.

Diese uneingeschränkte Kraft des root-Benutzerkontos erfordert von Ihnen, dass Sie sich besonnen und verantwortungsvoll verhalten, wenn Sie es benutzen.

[Warnung] Warnung

Teilen Sie das root-Passwort nie anderen mit.

[Anmerkung] Anmerkung

Dateizugriffsrechte einer Datei (inklusive Hardware-Geräte wie CD-ROM usw., die auf einem Debian-System nichts anderes wie eine Datei sind) können sie für nicht-root-Benutzer unbenutzbar machen. Obwohl die Verwendung des root-Benutzerkontos ein schneller Weg ist, solche Situationen zu testen, sollte die Lösung über eine korrekte Einstellung der Datei-Zugriffsrechte und die Mitgliedschaft des Benutzers in entsprechenden Gruppen führen (siehe dazu Abschnitt 1.2.3, „Dateisystem-Berechtigungen“).

Wenn sich über Ihr Arbeitsplatz-Menü keine GUI-Systemadministrations-Werkzeuge automatisch mit den benötigten Rechten starten lassen, können Sie diese von der 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.8.4, „X-Client-Programme als root laufen lassen“.

[Warnung] Warnung

Starten Sie niemals das X-Display/den Sitzungsmanager über das root-Benutzerkonto, indem Sie root im Anmeldebildschirm des Displaymanagers (wie z.B. gdm3(1)) eingeben.

[Warnung] Warnung

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.

In einem Standard-Debian-System sind sechs VT100-ähnliche zeichenbasierte 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 zwischen den virtuellen Konsolen umschalten, indem Sie die Linke Alt-Taste gleichzeitig mit einer der Tasten F1F6 drücken. Jede zeichenbasierte 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 einer X-Window-Umgebung befinden, können Sie Zugang zur zeichenbasierten Konsole 1 bekommen, indem Sie Strg-Alt-F1 drücken, d.h. die linke Strg-Taste, die linke Alt-Taste und die F1-Taste gleichzeitig drücken. Sie können zum X-Window-System zurück gelangen, das normalerweise auf der virtuellen Konsole 7 läuft, indem Sie Alt-F7 drücken.

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

# chvt 1

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 die Energie sicher abgeschaltet werden kann. Dies dient dazu, die Integrität der Dateien aufrecht zu erhalten, indem alle Änderungen im Speicher 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:

# shutdown -h now

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

# poweroff -i -f

Alternativ, können Sie Strg-Alt-Entf drücken (die linke-Strg-Taste, die linke-Alt-Taste und die Entf-Taste gleichzeitig), um das System herunterzufahren, falls "/etc/inittab" folgendes enthält: "ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -h now". Details dazu finden Sie unter inittab(5).

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

Obwohl selbst die Minimal-Installation eines Debian-Systems ohne jegliche Arbeitsplatz-Umgebung 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
 ...

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


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


Sie können einige dieser Pakete installieren, indem Sie folgendes eingeben:

# apt-get install paketname

Für ein typisches Einzelbenutzer-Arbeitsplatzsystem wie ein Debian-Desktop-System auf einem Laptop ist es gängig, eine einfache Konfiguration für sudo(8) wie folgt einzurichten, um dem nicht-privilegierten Benutzer, z.B. penguin, lediglich mit dessen Benutzer-Passwort, aber ohne das root-Passwort, administrative Privilegien zu verschaffen:

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

Alternativ dazu ist es auch verbreitet, dem nicht-privilegierten Benutzer, hier penguin, wie folgt administrative Privilegien ohne irgendein Passwort zu gewähren:

# 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] Warnung

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

[Achtung] Achtung

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

[Achtung] Achtung

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

[Anmerkung] 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.

[Anmerkung] Anmerkung

Mit einer durchdachteren und vorsichtigeren 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.

In GNU/Linux und anderen Unix-ähnlichen Betriebssystemen sind Dateien in Verzeichnissen 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 ein Dateisystem als geteilt, privat, slave oder nichtverknüpfbar einbinden. Unterstützte mount-Optionen für jeden Dateisystemtyp sind in "/share/doc/linux-doc-*/Documentation/filesystems/" verfügbar.

Verzeichnisse auf Unix-Systemen werden unter einigen anderen Betriebssystemen Ordner genannt. Bitte beachten Sie auch, dass es auf einem Unix-System kein Konzept für Laufwerke wie "A:" gibt. Es gibt ein Dateisystem, und dort ist alles enthalten. Dies ist ein gewaltiger Unterschied verglichen mit Windows.

Hier einige Grundlagen zu Dateien unter Unix:

[Anmerkung] 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] Anmerkung

Das Wort "root" kann entweder "root-Benutzer" oder "root-Verzeichnis" (Wurzelverzeichnis) bedeuten. Der Zusammenhang bei der Verwendung sollte die Bedeutung deutlich machen.

[Anmerkung] Anmerkung

Das Wort Pfad wird nicht nur wie oben für voll qualifizierte Dateinamen verwendet, sondern auch für den Befehls-Suchpfad. Die gewünschte 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 ("/usr/share/doc/debian-policy/fhs/fhs-2.3.txt.gz" und unter hier(7)). Sie sollten die folgenden Fakten als Ansatzpunkt nehmen.


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/" repräsentiert.

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. Wenn Sie wirklich Interesse daran haben, finden Sie in "/usr/include/linux/fs.h" die genaue Definition von "struct inode" im Debian GNU/Linux-System. 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] Tipp

Falls Sie das Zusammenwirken zwischen dem Verzeichisbaum und den physikalischen Datensätzen bestimmen müssen, führen Sie mount(8) ohne Argumente aus.

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.

Für die Datei erlaubt jede zugehörige Berechtigung 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.

Für das Verzeichnis erlaubt jede zugehörige Berechtigung 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 zu der 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 Zeit der Datei (mtime);

  • Name der Datei.


chown(1) wird von dem root-Benutzerkonto verwendet, um den Eigentümer der Datei zu ändern. chgrp(1) wird vom Eigentümer der 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-Benutzerkonto verwendet, um die Zugriffsberechtigungen für die Datei und das Verzeichnis zu ändern. Die grundsätzliche Syntax, um die Datei foo zu bearbeiten, ist wie folgt:

# chown <neuereigentümer> foo
# chgrp <neuegruppe> 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, die bei dieser Ausgabe versteckt sind, nicht gesetzt sind.

Das Setzen des setze Benutzer-ID-Bits bei einer ausführbaren Datei erlaubt dem Benutzer, die ausführbare Datei mit der Benutzer-ID der Datei (zum Beispiel root) auszuführen. Ähnlich dazu erlaubt das Setzen des Bits setze Gruppen-ID bei einer ausführbaren Datei dem Benutzer, die ausführbare Datei mit 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 bei einem Verzeichnis 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 bei einem Verzeichnis 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 von jedem Benutzer, der Schreibberechtigung in dem Verzeichnis hat, die Datei gelöscht und eine neue Datei mit dem gleichen Namen erstellt werden.

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).


Dies klingt kompliziert, aber es ist letztendig ganz einfach. Wenn Sie die ersten paar Spalten (2-10) der "ls -l"-Ausgabe anschauen und sie als Binärdarstellung (Basis=2) der Dateiberechtigungen lesen ("-" ist "0" und "rwx" sind "1"), werden Sie die letzten 3 Ziffern des numerischen Modus als Oktaldarstellung (Basis=8) der Dateirechte 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] Tipp

Wenn Sie mit einem Shellskript 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.

Um zu erreichen, dass Gruppenberechtigungen für bestimmte Benutzer übernommen werden, muss der Benutzer ein Mitglied dieser Gruppe werden (mittels "sudo vigr" für /etc/group und "sudo vigr -s" für /etc/gshadow). Sie müssen sich abmelden und neu anmelden, damit die neue Gruppenkonfiguration übernommen wird (oder führen Sie "exec newgrp" aus).

[Anmerkung] 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.)

Hardware-Geräte sind nur eine andere Art von Datei auf dem Debian-System. Wenn Sie Probleme haben, von einem Benutzerkonto aus auf Geräte wie CD-ROM-Laufwerke oder USB-Memory-Sticks zuzugreifen, sollten Sie den Benutzer zu einem Mitglied der entsprechenden Gruppe machen.

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


[Tipp] 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-IP-)Verbindungen herzustellen.

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


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.

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


[Anmerkung] Anmerkung

ctime ist nicht der Zeitpunkt der Dateierzeugung.

  • 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.

[Anmerkung] Anmerkung

Sogar das einfache Lesen einer Datei erzeugt auf einem Debian-System normalerweise eine Dateischreib-Operation, um die atime-Information im Inode zu aktualisieren. Durch das Einbinden des Dateisystems mit der Option "noatime" oder "relatime" überspringt das System diese Operation, was zu schnellerem Dateizugriff beim Lesen führt. Dies ist oft auf Laptops gefordert, weil es die Festplattenaktivität reduziert und Strom (Akkulaufzeit) spart. Lesen Sie mount(8).

Verwenden Sie den Befehl touch(1), um die Zeitstempel von vorhandenen Dateien zu ändern.

Bei Zeitstempeln unterscheidet sich die Ausgabe des ls-Befehls, wenn ein nicht-englisches Gebietsschema (Locale) wie "de_DE.UTF-8" eingestellt ist, von der Ausgabe bei der alten Locale "C".

$ LANG=de_DE.UTF-8  ls -l foo
-rw-rw-r-- 1 penguin penguin 0 16. Okt 21:35 foo
$ LANG=C  ls -l foo
-rw-rw-r-- 1 penguin penguin 0 Oct 16 21:35 foo
[Tipp] Tipp

Lesen Sie Abschnitt 9.2.5, „Angepasste Anzeige von Datum und Zeit“, um die Ausgabe von "ls -l" anzupassen.

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

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-Text" > foo
$ ls -li foo
1449840 -rw-rw-r-- 1 penguin penguin 17 Oct 16 21:42 foo
$ ln foo bar     # harter 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 "Neuer Text" > 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-Text
$ cat baz
Neuer Text

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" mit dem Befehl ls(1) 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] 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] 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 von neuen Unterverzeichnissen.

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.

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 wieder am anderen Ende 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 mit "|" 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 "hallo" >mypipe & # in den Hintergrund schieben
[1] 8022
$ ls -l mypipe
prw-rw-r-- 1 penguin penguin 0 Oct 16 21:49 mypipe
$ cat mypipe
hallo
[1]+  Done                    echo "hallo" >mypipe
$ ls mypipe
mypipe
$ rm mypipe

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 Hardware-Verbindungen nützlich. Zum Beispiel können Sie eine Textdatei zum Drucker-Gerät "/dev/lp0" schicken oder Modembefehle an den entsprechenden seriellen Port "/dev/ttyS0" senden. Aber wenn hierbei nicht mit Vorsicht gearbeitet wird, kann dies eine große Katastrophe verursachen. Seien Sie also auf der Hut.

[Anmerkung] 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.

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 agieren 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-*.

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.*.

Midnight Commander (MC) ist ein GNU "Schweizer Messer" für die Linux-Konsole und andere Terminal-Umgebungen. Er bringt Neulingen eine Erfahrung mit einer menügeführten 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;

  • "/sbin" und "/bin".

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 gespeichert. 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 name_der_zu_editierenden_Datei
$ mcedit name_der_zu_editierenden_Datei

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-F<n>-Tasten, um zwischen den virtuellen Konsolen zu wechseln, und "File→Insert file" oder "File→Copy to file", 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 trotzdem mcedit(1) für die meisten Systemwartungsaufgaben benutzen.

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

Sie sollten sich darin üben, 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 Shellskripten verwenden, erkennt er intelligent das Format, an dem Sie arbeiten, und versucht Ihnen dabei zu assistieren. 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] Anmerkung

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

Lassen Sie uns 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.16. 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, d. h. ".." und "." überspringen)
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 eines Shell-<suchmuster>s (langsamer)
locate -d . <suchmuster> passende Dateinamen finden durch Verwendung eines Shell-<suchmuster>s (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] Anmerkung

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

[Anmerkung] Anmerkung

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

[Anmerkung] Anmerkung

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.

[Anmerkung] Anmerkung

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):

$ <befehlsname> --help
$ <befehlsname> -h

Jetzt haben Sie ein Gefühl, wie das Debian-System genutzt wird. Lassen Sie uns tiefer in den Mechanismus der Befehlsausführung in einem Debian-System 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> , ; , & , ( , ) )

Die Werte einiger Umgebungsvariablen verändern das Verhalten einiger Unix-Befehle.

Die Standardwerte von Umgebungsvariablen werden ursprünglich vom PAM-System gesetzt und dann werden einige von ihnen von manchen Anwendungsprogrammen zurückgesetzt.

  • Display-Manager wie z.B. gdm3 setzen Umgebungsvariablen zurück.

  • Die Shell setzt durch Ihre Startmechanismen in "~/.bash_profile" und "~/.bashrc" Umgebungsvariablen zurück.

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


Einschlägige Beschreibungen zu Sprach- und Länder-Codes finden Sie unter "info gettext".

Auf dem modernen Debian-System sollten Sie die Zeichenkodierung immer auf UTF-8 setzen, außer Sie möchten aus einem guten Grund speziell eine der historischen Kodierungen verwenden und haben dazu ausreichende Hintergrundkenntnisse.

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

[Anmerkung] Anmerkung

"LANG=de_DE" ist weder "LANG=C" noch "LANG=de_DE.UTF-8". Es ist "LANG=de_DE.ISO-8859-1" (siehe Abschnitt 8.3.1, „Grundlagen der Kodierung“).


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

$ date
Sun Jun  3 10:27:39 JST 2007
$ LANG=fr_FR.UTF-8 date
dimanche 3 juin 2007, 10:27:33 (UTC+0900)

Hier wird das Programm date(1) mit verschiedenen Werten für die Umgebungsvariable "$LANG" ausgeführt:

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

$ LANG=fr_FR.UTF-8
$ date
dimanche 3 juin 2007, 10:27:33 (UTC+0900)

Wie Sie hier sehen können, wird die Ausgabe des Befehls von der Umgebungsvariable beeinflußt, um eine französische Ausgabe zu erzeugen. Wenn Sie möchten, dass die Umgebungsvariable von Unterprozessen übernommen wird (z.B. beim Aufruf eines Shellskriptes), müssen Sie sie stattdessen wie folgt mit export exportieren:

$ export LANG
[Anmerkung] Anmerkung

Wenn Sie ein typisches Konsolen-Terminal verwenden, ist die "$LANG"-Variable gewöhnlich so eingestellt, dass Sie durch die Desktop-Umgebung exportiert wird. Daher ist das obige nicht wirklich ein gutes Beispiel, um die Auswirkungen von export auszuprobieren.

[Tipp] Tipp

Wenn Sie einen Fehlerbericht einreichen und als Umgebung nicht Englisch verwenden, ist es eine gute Idee, den Befehl mit "LANG=en_US.UTF-8" laufen zu lassen und zu überprüfen.

Informationen zu "$LANG" und anderen zugehörigen Umgebungsvariablen finden Sie in locale(5) und locale(7).

[Anmerkung] Anmerkung

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

Versuchen wir, uns an die folgenden Abfolgen von Shell-Befehlen zu erinnern, die als Teil eines Shell-Befehls in einer Zeile eingegeben werden.

Tabelle 1.22. Abfolgen von Shell-Befehlen

Befehlsabfolge Beschreibung
befehl & Ausführung von befehl im Hintergrund in der Subshell
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ßend Ausführung von befehl2 (Erfolg zurückgeben, wenn beide (befehl1 und befehl2) erfolgreich sind)
befehl1 || befehl2 Ausführung von befehl1; falls nicht erfolgreich, anschließend Ausführung von befehl2 (Erfolg zurückgeben, wenn befehl1 oder befehl2 erfolgreich sind)
befehl > foo Weiterleitung der Standardausgabe von befehl in eine Datei foo (Datei überschreiben)
befehl 2> foo Weiterleitung des Standardfehlers von befehl in eine Datei foo (Datei überschreiben)
befehl >> foo Weiterleitung der Standardausgabe von befehl in eine Datei foo (an Datei anhängen)
befehl 2>> foo Weiterleitung des Standardfehlers von befehl in eine Datei foo (an Datei anhängen)
befehl > foo 2>&1 Weiterleitung der Standardausgabe und Standardfehler von befehl in eine Datei foo
befehl < foo Weiterleitung der Standardeingabe von befehl in eine Datei foo
befehl << begrenzung Weiterleitung der Standardeingabe von befehl in die folgenden Zeilen, bis "begrenzung" erreicht ist (hier Dokument)
befehl <<- delimiter Weiterleitung der Standardeingabe von befehl in die folgenden Zeilen, bis "begrenzung" erreicht ist (hier Dokument, 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. Bei der Verwaltung des Hintergrundprozesses sind die Shell-Builtins jobs, fg, bg und kill involviert. Bitte lesen Sie 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 extra 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 Hallo >foo
$ exec 3<foo 4>bar  # Dateien öffnen
$ cat <&3 >&4       # stdin an 3 weiterleiten und stdout an 4
$ exec 3<&- 4>&-    # Dateien schließen
$ cat bar
Hallo

Die Datei-Deskriptoren 0-2 sind vordefiniert.


In Unix-ähnlichen Arbeitsumgebungen wird Textverarbeitung erledigt, indem Text durch Abfolgen mehrerer Standard-Textverarbeitungswerkzeuge geleitet wird. Dies war eine weitere bedeutende Unix-Innovation.

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

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

[Anmerkung] Anmerkung

Sortierreihenfolge und Bereichsausdruck sind abhängig vom Gebietsschema (Locale). Wenn Sie das traditionelle Verhalten eines Befehls erreichen möchten, verwenden Sie statt der UTF-8-Locales die C-Locale, indem Sie dem Befehl "LANG=C" voranstellen (lesen Sie dazu Abschnitt 1.5.2, „Die "$LANG"-Variable“ und Abschnitt 8.3, „Das Gebietsschema (Locale)“).

[Anmerkung] Anmerkung

Perl regular expressions (perlre(1)), Perl-kompatible reguläre Ausdrücke (PCRE) und Python regular expressions, bereitgestellt durch das re-Modul, haben viele gängige Erweiterungen zu den normalen ERE.

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

Der reguläre Ausdruck beschreibt das passende 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.


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

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

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

Probieren Sie zum Beispiel folgendes:

$ awk '{ print $3 }' <DPL                   # Monat der Ernennung
August
April
January
January
April
April
March
$ awk '($1=="Ian") { print }' <DPL          # DPL namens Ian
Ian     Murdock   August  1993
Ian     Jackson   January 1998
$ awk '($2=="Perens") { print $3,$4 }' <DPL # Wann Perens ernannt wurde
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
... ergibt die gleiche Ausgabe wie beim ersten Awk-Beispiel

Hier verwendet der read-Builtin-Befehl 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"           # den alten Wert speichern
$ 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"           # den alten Wert wiederherstellen

(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 tauchen nicht innerhalb von doppelt oder einfach quotierten Wörtern auf. 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=":,"                        # ":" und "," als IFS verwenden
$ echo IFS=$IFS,   IFS="$IFS"     # echo ist ein Bash-Builtin
IFS=  , IFS=:,
$ date -R                         # Einfach eine Befehlsausgabe
Sat, 23 Aug 2003 08:30:15 +0200
$ echo $(date -R)                 # Sub-Shell --> Eingabe zur Haupt-Shell
Sat  23 Aug 2003 08 30 36 +0200
$ unset IFS                       # IFS auf den Standardwert zurücksetzen
$ echo $(date -R)
Sat, 23 Aug 2003 08:30:50 +0200

Die folgenden Skripte tun nette Dinge als Teil einer Weiterleitung.

Tabelle 1.26. 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, mit jedem Element aus der Weiterleitung jeweils 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 ":" (passwd-Datei usw.)
| 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 Zeile 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 Shellskript 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.3.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 Shellskript zu schreiben (weiteres dazu in Abschnitt 12.1, „Das Shellskript“).