Kapitel 1. Grundlegende Konzepte

Diese Arbeit wurde mithilfe von KI übersetzt. Wir freuen uns über dein Feedback und deine Kommentare: translation-feedback@oreilly.com

Was ist Linux?

Linux ist ein freies, quelloffenes Betriebssystem (OS), das eine Alternative zu Microsoft Windows und Apple macOS ist. Linux betreibt die meisten Server im Internet. Es läuft hinter den Kulissen auf jedem Android-Handy und Chromebook und auf Millionen von Geräten, die mit dem Netzwerk verbunden sind, wie Router, Firewalls und Roboter-Kuh-Melkanlagen (im Ernst). Auch auf Desktop- und Laptop-Computern läuft es einwandfrei.

Linux besteht aus vier Hauptteilen, die in Abbildung 1-1 dargestellt sind:

Der Kernel

Low-Level-Software. Sie steuert die Hardware und grundlegende Funktionen wie Prozessplanung und Netzwerke. Nur wenige Benutzer interagieren direkt mit dem Kernel.

Gelieferte Programme

Tausende von Programmen zur Dateiverwaltung, Textbearbeitung, Softwareentwicklung, zum Surfen im Internet, für Audio, Video, Verschlüsselung, Mathematik ... du weißt schon, was. Diese Programme kommunizieren mit dem Kernel. Programme, die auf der Kommandozeile laufen, werden Befehle genannt.

Die Muschel

Ein Linux-Programm, das Befehle ausführt und die Ergebnisse anzeigt. Linux verfügt über eine Reihe von Shells mit unterschiedlichen Funktionen. Dieses Buch konzentriert sich auf die Shell bash ( ), die oft als Standard für Benutzerkonten verwendet wird. Andere Shells sind dash, fish, ksh (Korn-Shell), tcsh (TC-Shell oder T-Shell), zsh (Z-Shell) und in geringerem Maße busybox. Alle Shells haben ähnliche Funktionen, auch wenn sie unterschiedlich eingesetzt werden.

Grafische Desktop-Umgebung (optional)

Eine Benutzeroberfläche mit Fenstern, Menüs, Symbolen, Mausunterstützung und anderen bekannten GUI-Elementen. Einige beliebte Umgebungen sind GNOME und KDE Plasma. Die meisten Anwendungen, die für GNOME entwickelt wurden, können in KDE ausgeführt werden und umgekehrt .1

Dieses Buch konzentriert sich auf die Kommandozeilenteile von Linux, nämlich die mitgelieferten Programme und die Shell. Windows und macOS haben zwar auch Kommandozeilenschnittstellen (cmd und powershell unter Windows, Terminal auf dem Mac), aber die meisten Benutzer bleiben bei der grafischen Benutzeroberfläche und werden die Kommandozeile nie sehen oder brauchen. Unter Linux ist die Shell entscheidend. Wenn du Linux ohne die Shell benutzt, verpasst du etwas.

Linux ist extrem konfigurierbar und wird in Hunderten von Varianten angeboten, die unterschiedliche Bedürfnisse und Geschmäcker bedienen. Jede Variante wird alsDistro (kurz für "Distribution") bezeichnet. Alle Distros haben einige Kernkomponenten gemeinsam, können aber unterschiedlich aussehen und verschiedene Programme und Dateien enthalten. Zu den beliebtesten Distros gehören unter anderem Mint, Ubuntu, Manjaro, Arch, Gentoo, Red Hat und OpenSUSE. Das Kernmaterial in diesem Buch sollte für alle Distros gelten.

The four major parts of Linux, conceptually. Low-level kernel functions are called by programs, which are invoked in a shell, which can be launched by a graphical desktop.
Abbildung 1-1. Die vier Hauptbestandteile von Linux, konzeptionell. Low-Level-Kernel-Funktionen werden von Programmen aufgerufen, die in einer Shell aufgerufen werden, die von einem grafischen Desktop aus gestartet werden kann.

Starten einer Shell

Woher kommen die Shells? Manchmal startet Linux eine Shell automatisch für dich. Das ist oft der Fall, wenn du dich über ein Netzwerk mit ssh oder einem ähnlichen Tool anmeldest.Das erste, was du siehst, ist eine Eingabeaufforderung, die auf deinen Befehl wartet.

In anderen Fällen musst du eine Shell manuell starten. Das ist häufig der Fall, wenn du einen grafischen Desktop mit vielen Symbolen und Menüs verwendest und keine Shell in Sicht ist. In solchen Fällen brauchst du eine GUI-Anwendung, ein Terminaloder Terminalprogramm, das Shells in einem Fenster ausführt. Die Seitenleiste"Shell Versus Terminal" erklärt den Unterschied zwischen Shells und Terminals.

Jede Distribution mit einem grafischen Desktop enthält mindestens ein Terminalprogramm, aber du musst es vielleicht erst einmal finden. Suche nach einer Anwendung, einem Symbol oder einem Menüpunkt namens Terminal, Konsole,xterm, gnome-terminal,uxterm, oder etwas Ähnlichem und starte es, um ein Terminal zu öffnen. Versuche auch, Ctrl-Alt-t zu drücken (halte die Strg- und Alt-Tasten gedrückt und drücke T), was in manchen Umgebungen ein Terminal öffnet.

Befehlszeilen-Warm-up

Um ein Gefühl für Linux zu geben, findest du hier 10 einfache Befehle, die du sofort in einer Shell ausprobieren kannst. Gib sie genau ein, einschließlich Groß- und Kleinbuchstaben, Leerzeichen und aller Symbole nach der Eingabeaufforderung. Am Ende jedes Befehls drückst du Enter.2

Zeige einen Kalender für November 2023 an:

cal nov 2023
   November 2023
Su Mo Tu We Th Fr Sa
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30

Liste den Inhalt des Verzeichnisses /bin auf, das viele Befehle enthält:

ls /bin
bash      less        rm
bunzip2   lessecho    rmdir
busybox   lessfile    rnano
⋮

Zähle die Anzahl der sichtbaren Elemente in deinem Home-Verzeichnis (hier dargestellt durch die Variable HOME, die ich später bespreche):

ls $HOME | wc -l
8                     Your value may be different

Sieh nach, wie viel Platz auf einer Partition deiner Festplatte belegt ist:

df -h /
Filesystem  Size  Used Avail Use% Mounted on
/dev/sdb1    78G   30G   48G  61% /

Beobachte die Prozesse, die auf deinem Computer laufen (drücke "q" zum Beenden):

top -d1

Drucke die Datei /etc/hosts, die Namen und Adressen von Computern enthält, auf deinem Standarddrucker aus, wenn du einen eingerichtet hast:

lpr /etc/hosts

Sieh nach, wie lange du schon eingeloggt bist:

last -1 $USER
smith  pts/7 :0  Tue Nov 10 20:12  still logged in

Lade die Datei sample.pdf von der Website dieses Buches in dein aktuelles Verzeichnis herunter, ohne dass du einen Webbrowser brauchst:

curl -O https://linuxpocketguide.com/sample.pdf

Sieh nach, wem der Domainname oreilly.com gehört (drücke die Leertaste, um Seite für Seite vorwärts zu gehen, und drücke "q", um zu beenden):

whois oreilly.com | less
Domain Name: OREILLY.COM
Registrar: GODADDY.COM, LLC
⋮

Zum Schluss löschst du dein Terminal oder deinen Bildschirm:

clear

Herzlichen Glückwunsch, du bist jetzt ein Linux Benutzer!

Die Struktur der Befehle

Ein Linux-Befehl besteht normalerweise aus einem Programmnamen, gefolgt von Optionen undArgumenten:

wc -l myfile

Der Programmname (wc, kurz für "word count") verweist auf ein Programm irgendwo auf der Festplatte, das die Shell findet und ausführt. Optionen, die normalerweise mit einem Bindestrich beginnen, beeinflussen das Verhalten des Programms. Im vorangegangenen Befehl weist die Option -l wc an, Zeilen und nicht Wörter zu zählen. Das Argument myfile gibt die Datei an, die wc lesen und verarbeiten soll.

Befehle können mehrere Optionen und Argumente haben. Die Optionen können einzeln oder kombiniert nach einem Bindestrich angegeben werden:

wc -l -w myfile           Two individual options
wc -lw myfile             Combined options, same as -l -w

Einige Programme sind jedoch sehr eigenwillig und erkennen keine kombinierten Optionen. Mehrere Argumente sind auch in Ordnung:

wc -l myfile myfile2      Count lines in two files

Optionen sind nicht standardisiert. Sie können aus einem einzelnen Bindestrich und einem Zeichen (z. B. -l), zwei Bindestrichen und einem Wort (--lines) oder verschiedenen anderen Formaten bestehen. Dieselbe Option kann für verschiedene Programme unterschiedliche Bedeutungen haben: Im Befehl wc -l bedeutet die Option -l "Textzeilen", aber in ls -l bedeutet sie "lange Ausgabe". Es kann auch sein, dass zwei Programme unterschiedliche Optionen für dieselbe Sache verwenden, z. B. -qfür "leise laufen" und -s für "leise laufen". Einige Optionen werden von einem Wert gefolgt, wie -s 10, und ein Leerzeichen dazwischen ist möglicherweise nicht erforderlich (-s10).

Argumente sind normalerweise Dateinamen für die Ein- oder Ausgabe, aber sie können auch andere Dinge sein, wie Verzeichnisnamen, Benutzernamen, Hostnamen, IP-Adressen, reguläre Ausdrücke oder beliebige Zeichenketten.

Ein Befehl, der nur aus einem einzigen Programm mit Optionen und Argumenten besteht, wird als einfacher Befehl bezeichnet.Hier ist ein einfacher Befehl, der die Benutzer auflistet, die bei einem Linux-Server angemeldet sind:3

who
silver       :0    Sep 23 20:44
byrnes    pts/0    Sep 15 13:51
barrett   pts/1    Sep 22 21:15
silver    pts/2    Sep 22 21:18

Ein Befehl kann auch mehrere Programme gleichzeitig aufrufen und sogar Programme miteinander verbinden, damit sie interagieren. Hier ist ein Befehl, der die Ausgabe von who mit der Eingabe von wc verbindet, das Textzeilen zählt. Das Ergebnis ist die Anzahl der Zeilen in der Ausgabe von who:

who | wc -l
4

Der vertikale Balken, eine sogenannte Pipe, stellt die Verbindung zwischen who und wc her. Linux-Experten verwenden diese Art von kombinierten Befehlen, die Pipelines genannt werden, immer wieder.

Befehle können auch Programmiersprachenkonstrukte wie Variablen, Bedingungen und Schleifen enthalten, die ich in"Programmieren mit Shell-Skripten" behandle. Ein Befehl könnte zum Beispiel lauten: "Führe dieses Programm aus, schreibe seine Ausgabe in eine Datei meiner Wahl und schicke mir bei Fehlern eine E-Mail mit den Ergebnissen an ."

Benutzer und Superuser

Linux ist ein Mehrbenutzer-Betriebssystem: Mehrere Personen können gleichzeitig Programme auf einem einzigen Linux-Computer ausführen. Auf einem bestimmten Computer wird jeder Benutzer durch einen Benutzernamen identifiziert, z. B. smith oderfunkydance. Jeder Benutzer hat eine Art eigenen Arbeitsbereich (siehe"Home-Verzeichnisse"), damit sie sich nicht gegenseitig behindern.

Ein spezieller Benutzer namens root - der Superuser oder Administrator - hatdie Berechtigung, alles im System zu tun. Der Superuser kann jede Datei erstellen, ändern oder löschen und jedes Programm ausführen. Normale Benutzer/innen sind eingeschränkt: Sie können die meisten Programme ausführen, aber im Allgemeinen können sie nicht an den Sachen anderer Benutzer/innen herumspielen.

Einige Befehle in diesem Buch erfordern Superuser-Rechte. Ich stelle diesen Befehlen das Zeichen sudo voran:

sudo superuser command goes here
Warnung

sudo gibt dir die Macht, dein Linux-System zu zerstören.

Ich bespreche sudo ausführlich in "Der Superuser werden", aber im Moment musst du nur wissen, dass sudo dir Superuser-Rechte gibt und manchmal nach deinem Passwort fragt. Um zum Beispiel die Zeilen in der geschützten Datei /etc/shadow mit und ohne sudo zu zählen, kannst du diesen Befehl ausführen:

wc -l /etc/shadow                 This fails
wc: /etc/shadow: Permission denied
→ sudo wc -l /etc/shadow            Run with sudo
[sudo] password: xxxxxxxx
51 /etc/shadow                      It worked!

Das Dateisystem

Um nutzen zu können, musst du dich mit den Dateien und Verzeichnissen (auch Ordner genannt) von Linux vertraut machen,die zusammen das Dateisystem bilden. Auf einem grafischen Desktop sind die Dateien und Verzeichnisse auf dem Bildschirm sichtbar. In einer Befehlszeilenschnittstelle wie der Linux-Shell sind dieselben Dateien und Verzeichnisse zwar immer noch vorhanden, aber weniger sichtbar, so dass du dich manchmal daran erinnern musst, in welchem Verzeichnis du dich befindest und wie es mit anderen Verzeichnissen zusammenhängt. Du verwendest Shell-Befehle wie cd (Verzeichnis wechseln), um zwischen Verzeichnissen zu wechseln, und Befehle wiepwd (Arbeitsverzeichnis drucken), um zu wissen, wo du dich im Dateisystem befindest.

Lass uns ein paar Begriffe klären. Linux-Dateien werden inVerzeichnissen gesammelt. Die Verzeichnisse bilden eine Hierarchie oder einen Baum, wie in Abbildung 1-3. Ein Verzeichnis kann andere Verzeichnisse enthalten, dieUnterverzeichnisse genannt werden, die wiederum andere Dateien und Unterverzeichnisse enthalten können, und so weiter, bis ins Unendliche. Das oberste Verzeichnis wird als Stammverzeichnis bezeichnet und ist mit einem Schrägstrich (/) gekennzeichnet.4

A Linux filesystem (partial). The root directory is at the top. The absolute path to the 'dan' directory is /home/dan.
Abbildung 1-3. Ein Linux-Dateisystem (teilweise). Das Stammverzeichnis befindet sich ganz oben. Der absolute Pfad zum Verzeichnis "dan" lautet /home/dan.

Linux verweist auf seine Dateien und Verzeichnisse mit einer "Namen und Schrägstriche"-Syntax, die Pfad genannt wird. Zum Beispiel der folgende Pfad:

/one/two/three/four

verweist auf das Stammverzeichnis /, das ein Verzeichnis namenseins enthält, das ein Verzeichnis zwei enthält, das ein Verzeichnisdrei enthält, das eine letzte Datei oder ein Verzeichnis vier enthält. Jeder Pfad, der mit einem Schrägstrich beginnt und vom Stammverzeichnis absteigt, wird als absoluter Pfad bezeichnet.

Pfade müssen nicht absolut sein - sie können auch relativ zu einem anderen Verzeichnis als dem Stammverzeichnis sein. In Abbildung 1-3 gibt es zwei verschiedene Verzeichnisse mit dem Namen bin, deren absolute Pfade /binund /usr/bin lauten. Wenn du dich einfach auf "das bin-Verzeichnis " beziehst, ist nicht klar, welches Verzeichnis du meinst. Du brauchst mehr Kontext. Jeder Pfad, der nicht mit einem Schrägstrich beginnt, wie bin, wird als relativerPfad bezeichnet.

Um einen relativen Pfad zu verstehen, musst du wissen, "wo du dich" im Linux-Dateisystem befindest. Dieser Ort wird als dein aktuelles Verzeichnis bezeichnet (manchmal auch als "Arbeitsverzeichnis" oder "aktuelles Arbeitsverzeichnis").

Jede Shell hat ein aktuelles Verzeichnis, und wenn du Befehle in dieser Shell ausführst, beziehen sie sich auf das aktuelle Verzeichnis. Wenn sich deine Shell zum Beispiel im Verzeichnis /usr befindet und du einen relativen Pfad bin angibst, bedeutet das /usr/bin. Wenn dein aktuelles Verzeichnis /one/two/three ist, würde ein relativer Pfad a/b/c den absoluten Pfad /one/two/three/a/b/c bedeuten.

Zwei spezielle relative Pfade heißen . (ein einzelner Punkt) und .. (zwei Punkte). "Punkt" steht für das aktuelle Verzeichnis deiner Shell und "Punkt Punkt" für das übergeordnete Verzeichnis, eine Ebene darüber. Wenn das aktuelle Verzeichnis deiner Shell also /eins/zwei/drei ist, dann bezieht sich . auf dieses Verzeichnis und .. auf /eins/zwei.

Um von einem Verzeichnis in ein anderes zu wechseln, verwendest du den Befehl cd,, der das aktuelle Verzeichnis deiner Shell ändert:

cd /usr/local/bin       Enter the directory /usr/local/bin

Der vorherige Befehl cd verwendete einen absoluten Pfad. Mit cd kannst du auch relative Verschiebungen vornehmen:

cd d           Enter subdirectory d of my current directorycd ../mydir    Go up to my parent, then into directory mydir

Datei- und Verzeichnisnamen können die meisten Zeichen enthalten, die du erwartest: Groß- und Kleinbuchstaben,5 Zahlen, Punkte, Bindestriche, Unterstriche und die meisten Symbole (aber nicht "/", das für die Trennung von Verzeichnissen reserviert ist). Aus Gründen der Effizienz solltest du jedoch Leerzeichen, Sternchen, Dollarzeichen, Klammern und andere Zeichen, die für die Shell eine besondere Bedeutung haben, vermeiden. Diese Zeichen müssen in Dateinamen besonders behandelt werden (siehe "Quoting"), was lästig und mühsam sein kann.

Home Verzeichnisse

Die persönlichen Dateien der Benutzerinnen und Benutzer werden normalerweise im Verzeichnis/home (für normale Benutzerinnen und Benutzer) oder /root (für den Superuser) gespeichert. Dein Home-Verzeichnis ist in der Regel/home/<Dein-Benutzername>(/home/smith, /home/funkydance, etc.). Es gibt verschiedene Möglichkeiten, dein Home-Verzeichnis zu besuchen oder darauf zu verweisen:

cd

Ohne Argumente bringt dich der Befehl cd zurück in dein Heimatverzeichnis (d.h. er setzt das aktuelle Verzeichnis der Shell).

HOME variabel

Die Umgebungsvariable HOME (siehe "Shell-Variablen") enthält den Namen deines Heimatverzeichnisses:

echo $HOME                 Print the directory name
/home/smith
→ cd $HOME/linuxpocketguide  Visit a subdirectory
~

Wenn du eine Tilde anstelle eines Verzeichnisses verwendest, wird sie von der Shell zum Namen deines Heimatverzeichnisses erweitert.

echo ~                  Print the directory name
/home/smith
→ cd ~/linuxpocketguide   Visit a subdirectory

Wenn die Tilde von einem Benutzernamen gefolgt wird (wie in ~fred), erweitert die Shell diese Zeichenkette zu dem home Verzeichnis des Benutzers:

cd ~fred       Visit Fred's home directory, if it existspwd            The “print working directory” command
/home/fred

Systemverzeichnisse

Ein Linux-System hat zehntausende von Systemverzeichnissen. Sie enthalten Betriebssystemdateien, Anwendungen, Dokumentation und so ziemlich alles außer den persönlichen Benutzerdateien (die normalerweise in/home liegen).

Wenn du kein Systemadministrator bist, wirst du die meisten Systemverzeichnisse nur selten besuchen - aber mit ein wenig Wissen kannst du ihren Zweck verstehen oder erraten. Ihre Namen bestehen oft aus drei Teilen, wie inAbbildung 1-4 gezeigt.

Directory scope, category, and application
Abbildung 1-4. Verzeichnisumfang, Kategorie und Anwendung

Verzeichnispfad Teil 1: Umfang

Der Bereich eines Verzeichnispfads beschreibt auf einer hohen Ebene den Zweck eines ganzen Verzeichnisbaums. Einige gängige Beispiele sind:

/

(Aussprache: "root") Systemdateien, die mit deiner Distribution geliefert werden

/usr

(Aussprache: "user") Weitere Systemdateien, die mit deiner Distribution geliefert werden

/usr/local

(sprich: "user local") Systemdateien, die nicht mit deiner Distribution mitgeliefert werden; sie können für dein lokales Linux-Netzwerk oder deinen einzelnen Computer spezifisch sein

In der Praxis gibt es keine klare Unterscheidung zwischen / und /usr, aber / gilt als "untere Ebene" und ist näher am Betriebssystem.

Verzeichnispfad Teil 2: Kategorie

Die Kategorie eines Verzeichnispfads in Abbildung 1-4beschreibt die Arten von Dateien, die in einem Verzeichnis zu finden sind. Wenn die Kategorie zum Beispiel lib lautet, kannst du ziemlich sicher sein, dass das Verzeichnis Bibliotheksdateienfür die Programmierung enthält. Wenn die Kategorie bin lautet, handelt es sich in der Regel um Binärdateien- ausführbare Programme.

Wenn du einer Kategorie wie bin einen Bereich voranstellst, erhältst du Pfade wie /bin, /usr/bin und /usr/local/bin. Die wichtigsten Systemprogramme einer Distribution wie ls und cat befinden sich normalerweise in/bin, andere Systemprogramme in/usr/bin.6 /usr/local/bin enthält lokal installierte Programme, die nicht in deiner Distribution enthalten sind. Dies sind keine festen Regeln, sondern typische Fälle.

Einige gängige Kategorien sind die folgenden:

Kategorien für Programme

bin

Programme (normalerweise binäre Dateien)

sbin

Programme (normalerweise Binärdateien) für Superuser

lib

Von Programmen verwendete Code-Bibliotheken

Kategorien für die Dokumentation

doc

Dokumentation

Infos

Dokumentationsdateien für das integrierte Hilfesystem von emacs

Mann

Dokumentationsdateien (Handbuchseiten), die mit dem Befehl man angezeigt werden; die Dateien sind oft komprimiert und mit Setzbefehlen gespickt, die man interpretieren kann

Aktie

Programmspezifische Dateien, wie Beispiele und Installationsanweisungen

Kategorien für die Konfiguration

usw.

Konfigurationsdateien für das System (und andere verschiedene Dinge)

init.d

Konfigurationsdateien zum Booten von Linux

rc.d

Konfigurationsdateien zum Booten von Linux; auch rc1.d, rc2.d, ...

Kategorien für die Programmierung

einschließen.

Header-Dateien für die Programmierung

src

Quellcode für Programme

Kategorien für Webdateien

cgi-bin

Skripte/Programme, die auf Webseiten laufen

html

Web-Seiten

public_html

Webseiten, in der Regel in den Home-Verzeichnissen der Nutzer

www

Web-Seiten

Kategorien für die Anzeige

Schriftarten

Schriftarten (Überraschung!)

X11

X Window System Dateien

Kategorien für Hardware

dev

Gerätedateien für die Verbindung mit Festplatten und anderer Hardware

Medien

Mountpoints: Verzeichnisse, die Zugriff auf Festplatten bieten

mnt

Mountpoints: Verzeichnisse, die Zugriff auf Festplatten bieten

Kategorien für Laufzeitdateien

var

Häufig aktualisierte Dateien, die den Zustand des Computers betreffen

sperren

Sperrdateien, die von Programmen erstellt werden, um zu sagen: "Ich laufe"; die Existenz einer Sperrdatei kann ein anderes Programm oder eine andere Instanz desselben Programms daran hindern, eine Aktion auszuführen

loggen

Logdateien, die wichtige Systemereignisse verfolgen und Fehler-, Warn- und Informationsmeldungen enthalten

Mail

Postfächer für eingehende E-Mails

laufen.

PID-Dateien, die die IDs von laufenden Prozessen enthalten; diese Dateien werden oft konsultiert, um bestimmte Prozesse zu verfolgen oder zu beenden

Spule

Dateien in der Warteschlange oder im Transit, wie ausgehende E-Mails, Druckaufträge und geplante Aufträge

tmp

Temporäre Speicherung für Programme und/oder Personen auf nutzen

Verzeichnispfad Teil 3: Anwendung

Der Anwendungsteil eines Verzeichnispfads(Abbildung 1-4) ist, falls vorhanden, normalerweise der Name eines Programms. Zum Beispiel hat das Verzeichnis/etc/systemd den Bereich root (/), die Kategorie etc (Konfigurationsdateien) und die Anwendung systemd. Da systemd ein Dienst zur Konfiguration von Linux-Rechnern ist, liegt die Vermutung nahe, dass /etc/systemdKonfigurationsdateien für diesen Dienst enthält - und das tut .

Kernel-bezogene Verzeichnisse

Einige Verzeichnisse unterstützen den Linux-Kernel, den untersten Teil des Linux-Betriebssystems:

/boot

Dateien zum Booten des Systems. Der Kernel befindet sich hier, normalerweise in /boot/vmlinuz oder einer Datei mit ähnlichem Namen.

/verloren+gefunden

Beschädigte Dateien, die mit einem Festplattenwiederherstellungsprogramm gerettet wurden.

/proc

Dateien für aktuell laufende Prozesse; für fortgeschrittene Benutzer.

/sys

Dateien für Kernel-Interna; für fortgeschrittene Benutzer.

Die Dateien in /proc und /sys bieten Einblicke in den laufenden Kernel und haben besondere Eigenschaften. Dateien in /proc scheinen immer null Größe zu haben, sind schreibgeschützt und veraltet, aber ihr Inhalt enthält auf magische Weise Informationen über den Linux-Kernel:

ls -lG /proc/version
-r--r--r--  1 root  0 Oct  3 22:55 /proc/version
→ cat /proc/version
Linux version 5.15.0-76-generic ...

Dateien in /sys haben auch irreführende Größen und magische Inhalte:

ls -lG /sys/power/state
-rw-r--r-- 1 root 4096 Jul  8 06:12 /sys/power/state
→ cat /sys/power/state
freeze mem disk

/proc und /sys werden hauptsächlich von Systemprogrammen benutzt, aber du kannst sie auch gerne ansehen. Hier sind einige Beispiele:

/proc/ioports

Eine Liste der Ein- und Ausgabehardware deines Computers.

/proc/cpuinfo

Informationen über die Prozessoren deines Computers.

/proc/version

Die Betriebssystemversion. Der Befehl uname gibt die gleichen Informationen aus.

/proc/uptime

Systembetriebszeit: Sekunden, die seit dem letzten Hochfahren des Systems vergangen sind. Führe uptime aus, um ein besser lesbares Ergebnis zu erhalten.

/proc/NNN

Informationen über den Linux-Prozess mit der ID NNN, wobei NNN eine positive ganze Zahl ist, z. B. /proc/13542.

/proc/self

Informationen über den aktuellen Prozess, den du gerade ausführst; ein symbolischer Link zu einer /proc/nnn-Datei, der automatisch aktualisiert wird. Versuche, ihn auszuführen:

ls -l /proc/self

mehrmals hintereinander, und /proc/self ändert, wo es Punkte.

Dateiberechtigungen

Ein Linux-System kann viele Benutzerkonten haben. Um die Privatsphäre und die Sicherheit zu wahren, können die meisten Benutzer nur auf einige Dateien im System zugreifen, nicht auf alle. Diese Zugriffskontrolle ist in zwei Fragen verankert:

Wer hat die Erlaubnis?

Jede Datei und jedes Verzeichnis hat einenBesitzer der damit machen kann, was er will. Normalerweise ist der Besitzer einer Datei der Benutzer, der sie erstellt hat. Ein Superuser kann den Besitzer einer Datei ändern.

Außerdem kann eine vordefinierte Gruppe von Benutzern auf eine Datei zugreifen. Gruppen werden vom Systemadministrator definiert und ich behandle sie in "Gruppenverwaltung".

Schließlich kann eine Datei oder ein Verzeichnis für alle Benutzer geöffnet werden, die ein Konto im System haben. Diese Gruppe von Benutzern wird auch als Welt oder einfach als andere bezeichnet.

Welche Art von Erlaubnis wird erteilt?

Dateibesitzer, Gruppen und die Welt können jeweils die Berechtigung haben, bestimmte Dateienzu lesen, zu schreiben (zu ändern) und ( auszuführen). Die Berechtigungen erstrecken sich auch auf Verzeichnisse, die Benutzer lesen (Dateien im Verzeichnis ansehen), schreiben (Dateien im Verzeichnis erstellen und löschen) und ausführen (das Verzeichnis mit cd betreten) dürfen.

Um die Besitzverhältnisse und Berechtigungen einer Datei namens myfile zu sehen, führe ls -l aus, wie in"Grundlegende Dateioperationen" beschrieben:

ls -l myfile
-rw-r--r-- 1 smith smith  1168 Oct 28  2015 myfile

Um die Besitzverhältnisse und Berechtigungen eines Verzeichnisses namens mydir zu sehen, füge die Option -d hinzu:

ls -ld mydir
drwxr-x--- 3 smith smith  4096 Jan 08 15:02 mydir

In der Ausgabe sind die Dateiberechtigungen die 10 am weitesten links stehenden Zeichen, eine Zeichenfolge aus r (lesen), w (schreiben), x (ausführen), anderen Buchstaben und Bindestrichen. Zum Beispiel:

-rwxr-x---

Hier erfährst du kurz, was diese Buchstaben und Symbole bedeuten:

Position Bedeutung

1

Dateityp: - = Datei, d = Verzeichnis, l = symbolischer Link, p = named pipe, c = Zeichengerät, b = Blockgerät

2-4

Berechtigungen für den Eigentümer der Datei: lesen (r), schreiben (w), ausführen (x) oder keine Berechtigung (-).

5-7

Berechtigungen für die Gruppe der Datei: r, w, x, -

8-10

Berechtigungen für alle anderen Benutzer: r, w, x, -

Mein Beispiel -rwxr-x--- bedeutet eine Datei, die vom Eigentümer gelesen, geschrieben und ausgeführt werden kann; von der Gruppe gelesen und ausgeführt, aber nicht geschrieben werden kann; und auf die andere Benutzer überhaupt nicht zugreifen können. Um den Besitzer, die Gruppe oder die Berechtigungen zu ändern, verwendest du die Befehle chown,chgrp , und chmod,, wie beschrieben in "Eigenschaften von Dateien".

Ausgewählte Funktionen der Bash

Eine Shell kann viel mehr als nur Befehle ausführen. Sie vereinfachtauch die Ausführung von Befehlen dank leistungsstarker Funktionen: Mustervergleiche für Dateinamen, eine "Befehlshistorie", um frühere Befehle schnell wieder aufzurufen, Pipes, um die Ausgabe eines Befehls an die Eingabe eines anderen zu senden, Variablen, um Werte zur Verwendung durch die Shell zu speichern, und vieles mehr. Wenn du dir die Zeit nimmst, diese Funktionen zu lernen, wirst du schneller und produktiver mit Linux arbeiten können.7 Wir wollen die Oberfläche überfliegen und dich mit diesen nützlichen Tools bekannt machen. (Die vollständige Dokumentation findest du unter info bash.)

Welche Shell benutzt du?

In diesem Buch wird davon ausgegangen, dass deine Shell die Bash ist. Um deine Shell zu identifizieren, führe aus:

echo $SHELL
/bin/bash

Wenn deine Shell nicht die Bash ist und du sie ausprobieren möchtest, führe den Befehlbash direkt aus, denn die Bash ist, wie alle Shells, nur ein Programm. (Es befindet sich unter/bin/bash.)

bash

Führe danach den Befehl exit aus, um zu deiner normalen Shell zurückzukehren. Um deine Standardshell in Bash zu ändern, findest du den Befehl chsh unter "Benutzerkontenverwaltung".

Musterabgleich

Das Muster , das in der Shell entspricht, wird manchmal auch als Wildcard bezeichnet und ist eine Abkürzung für die Arbeit mit Dateimengen. Das Muster a* bezieht sich zum Beispiel auf Dateien, deren Namen mit einem kleinen "a" beginnen. Die Shell expandiert ein Muster in die vollständige Menge der übereinstimmenden Dateinamen. Wenn du ausführst:

ls a* 
aardvark  adamantium  apple

expandiert die Shell das Muster a* unsichtbar in die Dateinamen, die mit "a" in deinem aktuellen Verzeichnis beginnen, als hättest du es eingegeben:

ls aardvark adamantium apple

ls weiß nie, dass du ein Muster verwendet hast: Sie sieht nur die endgültige Liste der Dateinamen nach der Expansion. Das bedeutet, dass jedes Linux-Programm, das du von einer Shell aus startest, unabhängig von seiner Herkunft, mit Mustern und anderen Shell-Funktionen "funktioniert". Dies ist ein sehr wichtiger Punkt. Überraschend viele Linux-Benutzer denken, dass Programme ihre eigenen Dateimuster auf der Kommandozeile erweitern. Das tun sie aber nicht. Die Shell macht das, bevor das zugehörige Programm überhaupt läuft.

Muster passen nie auf zwei Sonderzeichen: einen führenden Punkt und den Verzeichnisschrägstrich (/). Diese Zeichen müssen wörtlich angegeben werden. Ein Muster wie .bas* passt zu .bashrc, und /etc/*conf passt zu allen Dateinamen, die auf conf enden, im Verzeichnis /etc.

Muster Bedeutung

*

Null oder mehr aufeinanderfolgende Zeichen, außer einem führenden Punkt oder einem Schrägstrich im Verzeichnis.

?

Jedes einzelne Zeichen, außer einem führenden Punkt oder einem Schrägstrich im Verzeichnis.

[einstellen]

Jedes einzelne Zeichen in der angegebenen Menge. Es kann eine Folge von Zeichen sein, wie [aeiouAEIOU] für alle Vokale, oder ein Bereich mit einem Bindestrich, wie [A-Z] für alle Großbuchstaben, oder eine Kombination.

[!einstellen]

Ein einzelnes Zeichen , das nicht in der angegebenen Menge enthalten ist, z. B. [!0-9] für eine beliebige nicht-zifferige Zahl.

[^einstellen]

Dasselbe wie [!] .

Um einen Bindestrich in einem Zeichensatz zu finden, setze ihn an den Anfang oder an das Ende, damit er nicht Teil eines Bereichs ist. Um eine wörtliche schließende eckige Klammer in den Satz aufzunehmen, setze sie an den Anfang des Satzes oder schließe sie mit einem Backslash (\]) ab. Um ein ^ oder ! Symbol wörtlich einzuschließen, setze es an eine andere Stelle als die erste in der Menge oder entferne es.

Spange Erweiterung

Ähnlich wie bei Dateimustern können Ausdrücke mit geschweiften Klammern auch zu mehreren Argumenten für einen Befehl erweitert werden. Der kommagetrennte Ausdruck:

{bubble,quick,merge}

wird innerhalb einer Befehlszeile zuerst zu bubble, dann zu quick und schließlich zu merge erweitert, etwa so:

echo {bubble,quick,merge}sort.java
bubblesort.java quicksort.java mergesort.java
Hinweis

Der Hauptunterschied zwischen geschweiften und eckigen Klammern besteht darin, dass geschweifte Klammern mit jeder beliebigen Zeichenkette funktionieren, während Ausdrücke in eckigen Klammern nur mit bestehenden Dateinamen übereinstimmen.

Geschweifte Klammern können auch zu einer Folge von Werten in einem Bereich erweitert werden, wenn du die Endpunkte des Bereichs mit zwei Punkten trennst (..):

echo {3..12}
3 4 5 6 7 8 9 10 11 12
→ echo {A..E}
A B C D E
→ echo file{1..5}.py
file1.py file2.py file3.py file4.py file5.py

Shell-Variablen

Du kannst in einer Shell Variablen definieren und ihnen Werte zuweisen:

MYVAR=3      Assign the value 3 to variable MYVAR

Um auf einen Wert zu verweisen, stellst du einfach ein Dollarzeichen vor den Variablennamen:

echo $MYVAR
3

Die Shell definiert einige Standardvariablen, wenn du dich anmeldest:

Variabel Bedeutung

DISPLAY

Der Name deiner X-Fensteranzeige

HOME

Dein Heimatverzeichnis, zum Beispiel /home/smith

LOGNAME

Dein Login-Name, z. B. smith

MAIL

Dein Eingangspostfach, z. B. /var/spool/mail/smith

OLDPWD

Das vorherige Verzeichnis deiner Shell, vor dem letzten cd Befehl

PATH

Dein Shell-Suchpfad: Verzeichnisse durch Doppelpunkte getrennt

PWD

Das aktuelle Verzeichnis deiner Shell

SHELL

Der Pfad zu deiner Shell (z. B. /bin/bash)

TERM

Den Typ deines Terminals (z. B. xterm oder vt100)

USER

Dein Anmeldename

Variablen und ihre Werte sind standardmäßig auf die Shell beschränkt, die sie definiert. Um eine Variable und ihren Wert für andere Programme, die deine Shell aufruft (z. B. Unterprozesse), verfügbar zu machen, verwendet den Befehl export:

MYVAR=3export MYVAR

oder die Kurzschrift:

export MYVAR=3

Deine exportierte Variable wird nun als Umgebungsvariable bezeichnet. Wenn du noch weiter gehen und eine Variable nicht nur für Unterprozesse deiner aktuellen Shell, sondern für jede neu gestartete Shell verfügbar machen willst, musst du die Variablendefinition vorher in eine Shell-Konfigurationsdatei schreiben; siehe "Das Verhalten der Shell anpassen".

Um die Umgebungsvariablen einer Shell aufzulisten, führe aus:

printenv

Um eine Umgebungsvariable nur für die Dauer eines Befehls zu setzen, stellst du denWert der Variable= der Befehlszeile voran:

printenv HOME
/home/smith
→ HOME=/home/sally printenv HOME
/home/sally
→ printenv HOME
/home/smith            The original value is unaffected

Suchpfad

Die Programme können über das gesamte Linux-Dateisystem verstreut sein, meistens in Verzeichnissen wie /bin und/usr/bin. Wenn du einen Befehl ausführst, der ein Programm aufruft, muss die Shell das Programm irgendwie im Dateisystem finden:

who         The shell must locate the “who” program to run it

Die Shell findet das Programm, indem sie den Wert der Umgebungsvariablen PATH abfragt. Diese Liste ist eine Liste von Verzeichnissen, die durch Doppelpunkte getrennt sind. Diese Liste wird als Suchpfad der Shell bezeichnet.

echo $PATH
/usr/local/bin:/bin:/usr/bin    Search path with 3 directories

Die Shell sucht in jedem aufgelisteten Verzeichnis der Reihe nach nach einer ausführbaren Datei namens who. Wenn sie who findet (z. B. in /usr/bin/who), führt sie das Programm aus und speichert den Speicherort für das nächste Mal (siehe hash --help für weitere Informationen zum Zwischenspeichern). Andernfalls meldet es einen Fehler:

bash: who: command not found

Um die Position eines Befehls in deinem Suchpfad zu drucken, führe den Befehltype oder which aus:

type who                     The output may vary:
who is hashed (/usr/bin/who)   This means "who" is cached
who is /usr/bin/who            This means "who" isn't cachedwhich who
/usr/bin/who

Um Verzeichnisse vorübergehend zum Suchpfad deiner Shell hinzuzufügen, änderst du die VariablePATH. Füge zum Beispiel /usr/sbin an den Suchpfad deiner Shell an:

PATH=$PATH:/usr/sbinecho $PATH
/usr/local/bin:/bin:/usr/bin:/usr/sbin

Diese Änderung betrifft nur die aktuelle Shell. Damit sie bestehen bleibt, änderePATH in einer Bash-Konfigurationsdatei, wie in"Shell-Verhalten anpassen" beschrieben. Melde dich dann ab und wieder an oder führe die Konfigurationsdatei in jedem geöffneten Shell-Fenster von Hand aus. Zum Beispiel:

. $HOME/.bashrc    If you modified $HOME/.bashrc

Aliasnamen

Der Befehl alias definiert eine praktische Abkürzung für einen anderen Befehl. Zum Beispiel dieser Alias:

alias ll='ls -lG'

definiert einen neuen Befehl ll, der ls -lG ausführt:

ll
total 436
-rw-r--r--    1 smith     3584 Oct 11 14:59 file1
-rwxr-xr-x    1 smith       72 Aug  6 23:04 file2
⋮

Definiere Aliase in deiner ~/.bashrc-Datei (siehe "Anpassen des Shell-Verhaltens"), um sie für zukünftige Shells verfügbar zu machen.8 Um alle deine Aliasnamen aufzulisten, rufealias auf. Wenn du flexibler sein willst, als es Aliase bieten, lies"Programmieren mit Shell-Skripten", führe info bash aus und lies dich über "Shell-Funktionen" ein.

Eingebaute Befehle

Die meisten Linux-Befehle sind Programme im Linux-Dateisystem. Beispiele sindwc und who, die sich normalerweise im Verzeichnis /usr/bin befinden. Die Shell findet sie und führt sie mit Hilfe der Variable PATH aus, wie ich in "Suchpfad" beschrieben habe . Einige andere Befehle sind jedoch integrierte Funktionen der Shell, die so genannten eingebauten Befehle. Du hast in diesem Kapitel schon einige eingebaute Befehle gesehen, z. B. cd, alias und export. Um festzustellen, ob ein Befehl im Dateisystem, ein integrierter Befehl oder ein Alias ist, rufe den Befehl type auf:

type wc cd ll             Print the types of these commands
wc is /usr/bin/wc           A program in the filesystem
cd is a shell builtin       A built-in shell command
ll is aliased to `ls -lG'   An alias

Input, Output und Umlenkung

Die meisten Linux-Befehle akzeptieren Eingaben und/oder erzeugen Ausgaben. Die Tastatureingabe wird als Standardeingabe oder stdin bezeichnet. Die Ausgabe auf deinem Bildschirm wird als Standardausgabe oder stdout bezeichnet. Fehlermeldungen werden besonders behandelt und auf dem Standardfehler oderstderr ausgegeben, der normalerweise auch auf deinem Bildschirm erscheint, aber Linux trennt stderr und stdout intern.9

Die Shell kann die Standardeingabe, die Standardausgabe und den Standardfehler in und aus Dateien umleiten. Mit anderen Worten: Jeder Befehl, der von der Standardeingabe liest, kann mit dem Shell-Operator < seine Eingabe stattdessen aus einer Datei kommen lassen:

command < infile

Genauso kann jeder Befehl, der auf die Standardausgabe schreibt, stattdessen in eine Datei schreiben:

command > outfile      Create/overwrite outfilecommand >> outfile     Append to outfile

Bei einem Befehl, der in den Standardfehler schreibt, kann die Fehlerausgabe auch in eine Datei umgeleitet werden, ohne dass die Standardausgabe davon betroffen ist:

command 2> errorfile

Um sowohl die Standardausgabe als auch die Standardfehler auf die Dateien umzuleiten:

command > outfile 2> errorfile  Separate filescommand &> outfile              Single file (preferred)command >& outfile              Single file (less common)

Kombinierte Befehle

Bash kannst du über einfache Befehle hinausgehen, indem du mehrere Programme in einer einzigen Befehlszeile kombinierst.

Sequenzen von Befehlen

Um mehrere Befehle nacheinander in einer einzigen Befehlszeile aufzurufen, trennst du sie mit einem Semikolon:

command1 ; command2 ; command3

Um eine Folge von Befehlen wie zuvor auszuführen, aber die Ausführung zu stoppen, wenn einer von ihnen fehlschlägt, trennst du sie mit && ("und") Symbolen:

command1 && command2 && command3

Um eine Folge von Befehlen auszuführen und die Ausführung zu stoppen, sobald ein Befehl erfolgreich war, trennst du sie mit dem Symbol || ("oder"):

command1 || command2 || command3

Rohre

Du kannst die Standardausgabe eines Befehls in die Standardeingabe eines anderen umleiten, indem du den Pipe-Operator (|) der Shell verwendest. (Auf US-Tastaturen findest du dieses Symbol direkt über der Enter-Taste.) Zum Beispiel dieser Befehl:

who | sort

sendet die Ausgabe von who an den Befehl sort, der eine alphabetisch sortierte Liste der eingeloggten Benutzer ausgibt. Mehrere Pipes funktionieren auch. Wir sortieren die Ausgabe von who erneut, extrahieren die erste Spalte mit Informationen (mit awk) und zeigen die Ergebnisse seitenweise an (mit less):

who | sort | awk '{print $1}' | less

Befehlsersetzung

Wenn du einen Befehl mit Backquotes ("Backticks") umgibst, entfernt die Shell den Befehl und ersetzt die Ausgabe des Befehls.

date +%Y                 Print the current year
2024
→ echo This year is `date +%Y`
This year is 2024

Ein Dollarzeichen und Klammern sind gleichbedeutend mit Anführungszeichen:

echo This year is $(date +%Y)
This year is 2024

sind aber besser, weil sie verschachtelt werden können:

echo Next year is $(expr $(date +%Y) + 1)
Next year is 2025

Prozess-Substitution

Einige Programme funktionieren nicht gut mit Pipes, weil sie nicht von der Standardeingabe lesen, sondern nur von Dateien auf der Festplatte. Ein Beispiel dafür ist der Befehl diff, der zwei Dateien Zeile für Zeile vergleicht und die Unterschiede ausgibt.Process Substitution ist eine Möglichkeit, einen Befehl wie diff zu zwingen, von der Standardeingabe zu lesen. Er führt einen Befehl aus und lässt seine Ausgabe als Datei "tarnen", was Programme wiediff gerne akzeptieren. Mit demProzess-Substitutions-Operator<(), kannst du die Ausgabe von zwei Befehlen anstelle von zwei Dateien auf der Festplatte vergleichen.

Angenommen, du hast ein Verzeichnis voller JPEG- und Textdateien in Paaren:

ls jpegexample
file1.jpg  file2.jpg  file3.jpg  ...
file1.txt  file2.txt  file3.txt  ...

und du möchtest sicherstellen, dass zu jeder JPEG-Datei eine entsprechende Textdatei gehört und umgekehrt. Normalerweise könntest du zwei temporäre Dateien erstellen, eine mit den JPEG-Dateinamen und die andere mit den Textdateinamen, die Dateierweiterungen mit cut entfernen und die beiden temporären Dateien mit diff vergleichen:

cd jpegexamplels *.jpg | cut -d. -f1 > /tmp/jpegsls *.txt | cut -d. -f1 > /tmp/textsdiff /tmp/jpegs /tmp/texts
5a6
> file6       No file6.jpg was found
8d8
< file9       No file9.txt was found

Die Prozess-Substitution erledigt die gleiche Aufgabe mit einem einzigen Befehl und ohne temporäre Dateien:

diff <(ls *.jpg|cut -d. -f1) <(ls *.txt|cut -d. -f1)

Jeder <() Operator steht für einen Dateinamen in der Befehlszeile, als ob diese "Datei" die Ausgabe von ls und cut enthalten würde.

Verhinderung einer Bewertung

Die Shell wertet jedes Zeichen eines Befehls aus. Um die Auswertung zu verhindern, verwende Anführungszeichen oder Escaping.

Zitat

Normalerweise behandelt die Shell Leerzeichen als Trennzeichen für Zeichenketten in der Kommandozeile. Um eine Zeichenkette, die Leerzeichen enthält (z. B. einen Dateinamen mit einem Leerzeichen), mit einfachen oder doppelten Anführungszeichen zu umgeben, behandelt die Shell sie als eine Einheit. Einfache Anführungszeichen behandeln ihren Inhalt wörtlich, während doppelte Anführungszeichen die Auswertung von Variablen und anderen Shell-Konstrukten ermöglichen:

echo 'The variable HOME has value $HOME'
The variable HOME has value $HOME
→ echo "The variable HOME has value $HOME"
The variable HOME has value /home/smith

Die Flucht

Wenn ein Zeichen für die Shell eine besondere Bedeutung hat, du es aber wortwörtlich verwenden willst (z. B. * als wortwörtliches Sternchen und nicht als Dateimuster), stellst du dem Zeichen den Backslash "\" voran. Das nennt man " escapen" des Sonderzeichens:

echo a*                    A file pattern
aardvark  adamantium  apple
→ echo a\*                   A literal asterisk
a*
→ echo "I live in $HOME"     Print a variable value
I live in /home/smith
→ echo "I live in \$HOME"    Print a literal dollar sign
I live in $HOME

Du kannst auch Steuerzeichen (Tabulatoren, Zeilenumbrüche, ^D usw.) umgehen, damit sie wörtlich in der Befehlszeile verwendet werden, wenn du ihnen^V voranstellst. Dies ist besonders nützlich für Tabulatorzeichen, die die Shell sonst zur Vervollständigung von Dateinamen verwenden würde (siehe"Vervollständigung von Dateinamen").

echo "There is a tab between here^V    and here"
There is a tab between here      and here

Bearbeitung auf der Kommandozeile

Mit der Bash kannst du die Kommandozeile, an der du gerade arbeitest, mit Tastenkombinationen bearbeiten, die an die Texteditoren Emacs und Vim angelehnt sind (siehe"Erstellen und Bearbeiten von Dateien"). Um die Befehlszeilenbearbeitung mit Emacs-Tasten zu aktivieren, führe diesen Befehl aus (und füge ihn in eine Bash-Konfigurationsdatei ein, um ihn dauerhaft zu machen):

set -o emacs

Für vi (oder Vim) Tasten:

set -o vi
Emacs-Tastenkombination Vim-Tastenkombination (nach ESC) Bedeutung

^P oder Pfeil nach oben

k oder Pfeil nach oben

Zum vorherigen Befehl gehen

^N oder Pfeil nach unten

j oder Pfeil nach unten

Zum nächsten Befehl gehen

^R

Interaktiv nach einem vorherigen Befehl suchen

^F oder Pfeil nach rechts

l oder Pfeil nach rechts

Ein Zeichen vorwärts gehen

^B oder Pfeil nach links

h oder Pfeil nach links

Ein Zeichen rückwärts gehen

^A

0

Zum Anfang der Zeile gehen

^E

$

Gehe zum Ende der Zeile

^D

x

Nächstes Zeichen löschen

^U

^U

Bis zum Anfang der Zeile löschen

Befehl Geschichte

Eine Shell kann frühere Befehle abrufen und erneut ausführen, was als Befehlsverlauf bezeichnet wird. Probiere diese nützlichen Befehle und Ausdrücke aus, die sich auf den Verlauf beziehen:

Befehl Bedeutung

history

Drucke deine Geschichte

history N

Drucke die letzten N Befehle in deinem Verlauf

history -c

Deinen Verlauf löschen (löschen)

!!

Steht für deinen vorherigen Befehl. Um ihn erneut auszuführen:

!! <Enter>

!N

Steht für den Befehl Nummer N in deinem Verlauf

!-N

Steht für den Befehl, den du vor N Befehlen eingegeben hast

!$

Stellt das letzte Argument des vorherigen Befehls dar. Damit kannst du überprüfen, ob Dateien vorhanden sind, bevor du einen destruktiven Befehl wie rm ausführst:

ls z* 
zebra.txt  zipfile.zip  zookeeper
→ rm !$     Same as “rm z*”

!*

Stellt alle Argumente des vorherigen Befehls dar:

ls myfile emptyfile hugefile
emptyfile  hugefile  myfile
→ wc !* 
      18      211     1168 myfile
       0        0        0 emptyfile
  333563  2737540 18577839 hugefile
  333581  2737751 18579007 total

Dateiname Vervollständigung

während du einen Dateinamen eingibst, drückst du die Tabulator-Taste und die Shell vervollständigt den Dateinamen automatisch für dich. Wenn mehrere Dateinamen mit dem übereinstimmen, was du bisher eingegeben hast, piept die Shell und zeigt damit an, dass die Übereinstimmung mehrdeutig ist. Drücke sofort ein zweites Mal die Tabulatortaste und die Shell zeigt dir die Alternativen an. Probiere dies aus:

cd /usr/binls un<Tab><Tab>

Die Shell zeigt alle Dateien in /usr/bin an, die mit un beginnen, z. B. uniq und unzip. Gib noch ein paar Zeichen ein, um deine Auswahl zu verdeutlichen, und drücke erneut die Tabulatortaste.

Shell Job Control

jobs

Gib deine Aufträge an.

&

Nach einem Befehl platziert, wird dieser im Hintergrund ausgeführt.

^Z

Tastendruck, um den aktuellen (im Vordergrund befindlichen) Auftrag anzuhalten.

suspend

Eine Shell aussetzen.

fg

Einen Auftrag aussetzen: ihn in den Vordergrund bringen.

bg

Lasse einen angehaltenen Auftrag im Hintergrund laufen.

disown

Vergiss einen Auftrag.

Alle Linux-Shells haben eine Job-Steuerung: die Möglichkeit, Befehle im Hintergrund (Multitasking im Hintergrund) und im Vordergrund (der aktive Prozess an deiner Eingabeaufforderung) auszuführen. EinAuftrag ist einfach die Arbeitseinheit der Shell. Wenn du einen Befehl interaktiv ausführst, verfolgt deine aktuelle Shell ihn als Job. Wenn der Befehl abgeschlossen ist, verschwindet der zugehörige Auftrag. Aufträge befinden sich auf einer höheren Ebene als Linux-Prozesse; das Linux-Betriebssystem weiß nichts über sie. Sie sind lediglich Konstrukte der Shell. Hier findest du einige wichtige Begriffe zur Jobkontrolle:

Auftrag im Vordergrund

In einer Shell ein laufender Auftrag, der die Eingabeaufforderung der Shell belegt, sodass du keinen anderen Befehl ausführen kannst

Hintergrundjob

In einer Shell ein laufender Auftrag, der die Eingabeaufforderung nicht belegt, so dass du andere Befehle in der gleichen Shell ausführen kannst

aussetzen

Um einen Auftrag im Vordergrund vorübergehend anzuhalten

Lebenslauf

Um einen unterbrochenen Auftrag wieder in den Vordergrund zu bringen

Verleugne

Um der Shell mitzuteilen, dass sie die Verfolgung des Auftrags beenden soll; die zugrunde liegenden Prozesse laufen weiter


Aufträge

stdin

stdout

- Akte

-- opt

--help

--version

Der integrierte Befehl jobs listet die Aufträge, die in deiner aktuellen Shell laufen, nach Nummer und Name auf:

jobs
[1]-  Running         emacs myfile &    A background job
[2]+  Stopped         ssh example.com   A suspended job

Die Ganzzahl auf der linken Seite ist die Auftragsnummer, und das Pluszeichen kennzeichnet den Standardauftrag, der von den Befehlen fg (Vordergrund) und bg(Hintergrund) betroffen ist.


&

Das kaufmännische Und am Ende einer Befehlszeile bewirkt, dass der angegebene Befehl als Hintergrundauftrag ausgeführt wird:

emacs myfile &
[2] 28090

Die Antwort der Shell enthält die Auftragsnummer (2) und die Prozess-ID des Befehls (28090).


^Z

Wenn du in einer Shell ^Z eingibst, während ein Auftrag im Vordergrund läuft, wird dieser Auftrag angehalten. Er hört einfach auf zu laufen, aber sein Status wirderinnert:

sleep 10                  Waits for 10 seconds
^Z
[1]+  Stopped    sleep 10
→

Jetzt kannst du bg ausführen, um den Befehl sleep in den Hintergrund zu stellen, oder fg, um ihn wieder in den Vordergrund zu bringen. Du kannst ihn auch in der Schwebe lassen und andere Befehle ausführen.


aussetzen.

stdin

stdout

- Akte

-- opt

--help

--version

Der eingebaute Befehl suspend pausiert die aktuelle Shell, wenn möglich, als ob du^Z auf die Shell selbst angewendet hättest. Wenn du zum Beispiel mit sudo eine Superuser-Shell erstellst und zu deiner ursprünglichen Shell zurückkehren willst, hält suspend die Superuser-Shell an:

whoami
smith
→ sudo bash                  Run a superuser shell
[sudo] password: xxxxxxxx
# whoami
root
# suspend                    Suspend the superuser shell
[1]+  Stopped    sudo bash
→ whoami                     Back to the original shell
smith

bg

stdin

stdout

- Akte

-- opt

--help

--version

bg [%job]

Der integrierte Befehl bg lässt einen angehaltenen Auftrag im Hintergrund laufen. Wenn du keine Argumente angibst, arbeitet bg mit dem zuletzt unterbrochenen Auftrag. Wenn du einen bestimmten Auftrag angeben willst (der mit dem Befehl jobsangezeigt wird), gibst du die Auftragsnummer oder den Auftragsnamen mit einem vorangestellten Prozentzeichen an:

bg %2          Send job 2 to the backgroundbg %cat        Send job beginning with “cat” to the background

Einige Arten von interaktiven Aufträgen können nicht im Hintergrund bleiben - zum Beispiel, wenn sie auf Eingaben warten. Wenn du das versuchst, unterbricht die Shell den Auftrag und zeigt ihn an:

[2]+  Stopped      command line here

Nimm jetzt den Auftrag wieder auf (mit fg) und fahre fort.


fg

stdin

stdout

- Akte

-- opt

--help

--version

fg [%job]

Der integrierte Befehl fg holt einen angehaltenen oder im Hintergrund laufenden Auftrag in den Vordergrund. Ohne Argumente wählt er einen Auftrag aus, in der Regel den zuletzt angehaltenen oder im Hintergrund laufenden. Um einen bestimmten Auftrag anzugeben (wie beim Befehl jobs ), gibst du die Auftragsnummer oder den Auftragsnamen mit einem vorangestellten Prozentzeichen an:

fg %2      Bring job 2 into the foregroundfg %cat    Bring job beginning with “cat” into the foreground

verleugnen.

stdin

stdout

- Akte

-- opt

--help

--version

disown [-ar] [-h] [%job]

Der eingebaute Befehl disown weist deine aktuelle Shell an, einen Auftrag zu "vergessen". Die Linux-Prozesse hinter dem Auftrag laufen weiter - du kannst sie nur nicht mehr mit bg, fg, jobs und anderen auftragsbezogenen Befehlen steuern. Das ist nützlich für lange Aufträge, mit denen du nicht interagieren musst, oder für Aufträge, die weiterlaufen sollen, nachdem deine Shell beendet wurde . Siehe auch nohup unter "Prozesse kontrollieren".

disown %2         Forget job #2disown %cat       Forget job beginning with “cat”disown -h %2      Mark job #2 to keep running after shell exitsdisown -r         Forget all running jobsdisown -a         Forget all jobs

Mehrere Shells gleichzeitig ausführen

Job control kann mehrere Befehle gleichzeitig verwalten, aber es kann immer nur einer im Vordergrund laufen. Noch leistungsfähiger ist es, mehrere Shells gleichzeitig laufen zu lassen, jede mit einem Befehl im Vordergrund und einer beliebigen Anzahl von Befehlen im Hintergrund.

Wenn auf deinem Linux-Computer ein Fenstersystem wie KDE oder GNOME läuft, kannst du ganz einfach mehrere Shells gleichzeitig ausführen, indem du mehrere Shell-Fenster öffnest (siehe "Starten einer Shell"). Außerdem können bestimmte Shell-Fensterprogramme, wie z. B. konsole von KDE, mehrere Tabs in einem einzigen Fenster öffnen, in denen jeweils eine Shell läuft.

Auch ohne ein Fenstersystem - zum Beispiel über eine SSH-Netzwerkverbindung - kannst du mehrere Shells gleichzeitig verwalten. Der Befehl tmux simuliert mehrere Shell-Fenster in einem normalen ASCII-Terminal. Mit speziellen Tastenkombinationen kannst du nach Belieben von einem virtuellen Fenster zum anderen wechseln. (Ein weiteres Programm dieser Art ist screen,, aber tmux ist besser gepflegt und einfacher zu konfigurieren.) Um eine Sitzung mit tmux zu beginnen, führe aus:

tmux

Eine neue Shell wird mit einer zusätzlichen Statusleiste am unteren Rand des Terminals gestartet, die anzeigt, dass du ein virtuelles Fenster ausführst. Das Programmtmux bietet standardmäßig 10 solcher Fenster an, die von 0 bis 9 beschriftet sind und zwischen denen du wechseln kannst. Jedes Fenster führt zunächst nur eine einzige Shell aus, aber du kannst ein Fenster in mehrere "Fensterbereiche" unterteilen, um mehrere Shells gleichzeitig anzuzeigen. Probiere diese Tastenkombinationen aus, um dich mittmux vertraut zu machen:

  1. Führe im aktuellen tmux Fenster ls aus.

  2. Drücke ^Bc (Strg-B, dann c). tmux zeigt eine neue Eingabeaufforderung für die Shell in einem zweiten virtuellen Fenster an. Die Statusleiste ändert sich und zeigt zwei virtuelle Fenster mit den Nummern 0 und 1.

  3. In diesem zweiten Fenster führst du einen anderen Befehl aus (z.B. df).

  4. Drücke auf ^Bn und du wechselst zurück zu Fenster 0, wo deine Ausgabe von ls nun wieder sichtbar ist.

  5. Drücke ^Bn noch ein paar Mal, um zwischen den beiden virtuellen Fenstern zu wechseln.

  6. Drücke ^B%, um das aktuelle Fenster in zwei nebeneinander liegende Fenster zu teilen.

  7. Drücke ^B", um das aktuelle Fenster vertikal in zwei Teile zu teilen. Du siehst jetzt drei Muscheln in separaten Fenstern.

Die meisten Aspekte von tmux sind in der Datei ~/.tmux_conf konfigurierbar, sogar die Wahl von ^B als Präfixschlüssel. Hier sind gängige Tastenkombinationen:

Tastenanschlag Bedeutung

^B?

Online-Hilfe anzeigen. Drücke "q" zum Beenden.

^Bc

Erstelle ein Fenster.

^B0, ^B1... ^B9

Wechsle jeweils zu den Fenstern 0 bis 9.

^Bn

Wechsle zum nächsten Fenster, numerisch.

^Bp

Wechsle zum vorherigen Fenster, numerisch.

^Bl

Wechsle zu dem zuletzt verwendeten Fenster.

^B%

In zwei Scheiben nebeneinander aufteilen.

^B"

Oben und unten in zwei Scheiben geteilt.

^Bo

Springe zum nächsten Fenster.

^B Linkspfeil

Springe zu dem Fenster auf der linken Seite.

^B Rechtspfeil

Springe zum Fenster auf der rechten Seite.

^B Pfeil nach oben

Springe zu dem Fenster oben.

^B Abwärtspfeil

Springe zum unteren Fenster.

^Bq

Anzeige der Fensternummern als Referenz.

^Bx

Beende das aktuelle Fenster.

^B^B

Sende ein echtes Ctrl-B an deine Shell, das von tmux ignoriert wird.

^B^Z

tmux aussetzen.

^Bd

"Löse dich von einer tmux Sitzung und kehre zu deiner ursprünglichen Shell zurück. Um zu tmux zurückzukehren, führe tmux attach aus.

^D

Beende eine Shell in einem Fenster oder Bereich. Dies ist der gewöhnliche "Dateiende"-Tastendruck, der in "Beenden einer Shell" erklärt wird und mit dem jede Shell geschlossen wird.

^B:kill-session

Beende alle Fenster und beende tmux.

Ein paar Hinweise zum Betrieb von tmux:

  • Wenn in den Shells von tmux deine Aliase, Variablen oder andere Shell-Einstellungen fehlen, liegt das daran, dass tmux eine Login-Shell ausführt, die deine .bashrc-Initialisierungsdatei nicht liest. Sie bezieht nur deine Startup-Datei (.bash_profile, .bash_login oder .profile). Um dieses Problem zu beheben, füge diese Zeilen an deine Startup-Datei an:

    # Source my .bashrc file
    if [ -f ~/.bashrc ]; then
      . ~/.bashrc
    fi
  • Wenn du einen Texteditor verwendest, erfasst tmux alle Strg-B-Tastenanschläge, auch die, die als Bearbeitungsbefehle gedacht sind. Drücke ^B^B, um ein echtes Ctrl-B an deinen Editor zu senden.

  • Führe tmux nicht lokal auf einem grafischen Desktop aus; führe stattdessen mehrere Shell-Fenster aus. Das ist einfacher und vermeidet ein Problem: Wenn du deine Shell so konfiguriert hast, dass sie beim Abmelden Befehle ausführt (z. B. in der Datei ~/.bash_logout), werden die Shells von tmux diese Befehle beim Verlassen des Desktops ausführen, auch wenn du dich nicht abgemeldet hast. Das kann unerwünschte Auswirkungen auf deine Desktop-Anmeldung haben.

Beenden eines laufenden Befehls

Um einen Befehl im Vordergrund sofort zu beenden, drücke ^C. Hier beende ich den Befehl cat, da er eine große Datei druckt:

cat hugefile
Lorem ipsum dolor sit amet, consectetur adipiscing
odio. Praesent libero. Sed cursus ante dapibus diam.
quis sem at nibh elementum blah blah blah ^C

Um einen Hintergrundbefehl zu beenden, bringst du ihn mit fgin den Vordergrund und drückst dann ^C:

sleep 50 &
[1] 12752
→ jobs
[1]-  Running       sleep 50 &
→ fg %1
sleep 50
^C

oder führe den Befehl kill aus, der in"Prozesse steuern" beschrieben wird. Die Tastenkombination ^C ist eine Funktion der Shell. Sie hat keine Auswirkung auf Programme, die ^C "abfangen" und nicht beenden, wie Texteditoren und GUI-Anwendungen. Verwende für diese Programme kill.

Beenden einer Shell

Um eine Shell zu beenden, führe entweder den Befehl exit aus:

exit

oder drücke ^D in einer Zeile. Die Tastenkombination ^D sendet ein "Ende der Datei"-Signal an jedes Programm, das die Standardeingabe liest. Das gilt auch für die Shell selbst.

Shell-Verhalten anpassen

Mehrere Dateien in deinem Home-Verzeichnis steuern das Verhalten der Bash-Shells. Die Startdateien .bash_profile, .bash_login, und .profile enthalten Befehle, die jedes Mal ausgeführt werden, wenn du dich anmeldest. (Wähle nur eine Startdatei aus und bleibe bei ihr. Ich empfehle.bash_profile, weil einige andere Shells auch .profile verwenden.) Die Befehle in der Initialisierungsdatei .bashrc werden jedes Mal ausgeführt, wenn du eine interaktive Shell startest, und die Befehle in .bash_logout werden jedes Mal ausgeführt, wenn du dich abmeldest. All diese Dateien können Variablen setzen, Programme ausführen, dumme Nachrichten ausgeben oder was auch immer du willst. Andere Linux-Shells verwenden andere Konfigurationsdateien, wie in Tabelle 1-1 gezeigt.

Tabelle 1-1. Shell-Konfigurationsdateien in $HOME und wann sie gelesen werden
Shell Bei der Anmeldung Durch andere interaktive Shells Bei Abmeldung

bash

.bash_profile, .bash_login,
.profil

.bashrc

.bash_logout

Bindestrich

.profil

Fisch

.config/fish/config.fish

.config/fish/config.fish

ksha

.profile, .kshrc

.kshrc

tcsh

.tcshrc, .cshrc, .login

.tcshrc, .cshrc

zsha

.zshenv, .zprofile, .zlogin

.zshenv, .zshrc

.zlogout

a Um diese Dateipfade mit Umgebungsvariablen zu überschreiben, siehe die Manpage.

Andere Shell-Konfigurationsdateien befinden sich in /etc für die systemweite Steuerung; siehe die entsprechende Handbuchseite oder manpage für jede Shell. Alle diese Konfigurationsdateien sind Beispiele für Shell-Skripte: ausführbare Dateien, die Shell-Befehle enthalten. Auf diese Funktion gehe ich unter in"Programmieren mit Shell-Skripten" näher ein.

Hilfe bekommen

Wenn du mehr Informationen brauchst, als dieses Buch bietet, gibt es verschiedene Möglichkeiten, mehr Hilfe zu bekommen:

Führe den Befehl man aus

Der Befehl man zeigt die Dokumentation für ein bestimmtes Programm an. Um zum Beispiel zu erfahren, wie man mit wc die Wörter in einer Datei zählt, führe den Befehl aus:

man wc

Um nach Handbuchseiten (manpages) zu einem bestimmten Thema zu suchen, verwende die Option -kgefolgt von demStichwort:

man -k database

Wenn die Liste der Manpages länger ist als der Bildschirm, kannst du sie über die Pipeline an lesssenden, um sie seitenweise anzuzeigen (drücke q zum Beenden):

man -k database | less
Führe den Befehl info aus

Der Befehl info ist ein erweitertes Hypertext-Hilfesystem für viele Linux-Befehle.

info ls

Während info läuft, sind einige nützliche Tastenkombinationen möglich:

  • Um Hilfe zu erhalten, drücke h

  • Um zu beenden, drücke q

  • Um vorwärts und rückwärts zu blättern, benutze die Leertaste bzw. die Rücktaste

  • Um zwischen Hyperlinks zu springen, drücke Tab

  • Um einem Hyperlink zu folgen, drücke Enter

    Wenn info keine Dokumentation zu einem bestimmten Befehl hat, zeigt es die Manpage des Befehls an. Eine Liste der verfügbaren Dokumentation erhältst du, wenn duinfo eingibst. Um zu erfahren, wie du durch das Infosystem navigieren kannst, rufe info info auf.

Verwende die Option --help (falls vorhanden)

Viele Linux-Befehle reagieren auf die Option --help oder -h, indem sie eine kurze Hilfemeldung ausgeben. Versuche es:

wc --help

Wenn die Ausgabe länger als der Bildschirm ist, leite sie in less:

wc --help | less
Untersuche das Verzeichnis /usr/share/doc

Dieses Verzeichnis enthält unterstützende Dokumente für Programme, die normalerweise nach Name und Version geordnet sind. Dateien für den Editor Emacs Version 28 findest du zum Beispiel (je nach Distribution) in /usr/share/doc/emacs28.

Distro-spezifische Websites

Die meisten Linux-Distributionen haben eine offizielle Website mit Dokumentation, Diskussionsforen und anderen Ressourcen. Suche im Internet nach dem Namen deiner Distro (z.B. "Ubuntu"), um die Website zu finden. Das Arch Linux Wiki ist besonders informativ, unabhängig von deiner Distro.

Linux-Hilfeseiten

Stelle Linux-Fragen untercunix.stakexchange.org,linuxquestions.org,itsfoss.community,und nixcraft.com.

Websuche

Um eine Linux-Fehlermeldung zu entziffern, füge sie wortwörtlich in eine Suchmaschine ein, optional umgeben von doppelten Anführungszeichen.

Damit ist mein grundlegender Überblick über Linux und die Shell beendet. Wenden wir uns nun den Besonderheiten der Linux-Befehle zu. Der Rest des Buches listet und beschreibt die nützlichsten Befehle für die Arbeit mit Dateien, Prozessen, Benutzern, Netzwerken, Multimedia und mehr.

1 GNOME, KDE und andere Umgebungen basieren auf einem gemeinsamen Fenstersystem, das entweder X oder Wayland ist. Um zu sehen, welches System du verwendest, führe den Befehl echo $XDG_SESSION_TYPE aus.

2 Wenn du die Fehlermeldung "Befehl nicht gefunden" siehst, mach dir keine Sorgen: Ein Befehl ist wahrscheinlich nicht auf deinem System installiert. Siehe "Installieren von Softwarepaketen".

3 Der Benutzer "silver", der zweimal aufgeführt ist, führt zwei interaktive Shells gleichzeitig aus.

4 In Linux stammen alle Dateien und Verzeichnisse vom Stammverzeichnis ab. Das ist anders als bei Windows, wo der Zugriff auf verschiedene Geräte über Laufwerksbuchstaben erfolgt.

5 Bei Linux-Dateinamen wird zwischen Groß- und Kleinschreibung unterschieden, sodass Groß- und Kleinbuchstaben nicht gleichwertig sind.

6 Einige Distributionen machen diese Unterscheidung nicht mehr. Fedora zum Beispiel macht /bin zu einem symbolischen Link auf /usr/bin.

7 Lies auch mein Nachfolgebuch Efficient Linux at the Command Line, um deine Kenntnisse zu erweitern.

8 Einige Konfigurationen verwenden ~/.bash_aliases für diesen Zweck.

9 Du kannst zum Beispiel die Standardausgabe in einer Datei erfassen und trotzdem Standardfehlermeldungen auf dem Bildschirm erscheinen lassen.

Get Linux Pocket Guide, 4th Edition now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.