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.
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
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 myfilewc -lw myfile
Two individual options
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. -q
fü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/shadowwc: /etc/shadow: Permission denied → sudo wc -l /etc/shadow
This fails
[sudo] password: xxxxxxxx 51 /etc/shadow
Run with sudo
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
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→ cd ../mydir
Enter subdirectory d of my current directory
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
/home/smith → cd $HOME/linuxpocketguidePrint the directory name
Visit a subdirectory
~
-
Wenn du eine Tilde anstelle eines Verzeichnisses verwendest, wird sie von der Shell zum Namen deines Heimatverzeichnisses erweitert.
→ echo ~
/home/smith → cd ~/linuxpocketguidePrint the directory name
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
→ pwdVisit Fred's home directory, if it exists
/home/fredThe “print working directory” command
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.
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:
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:
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: |
2-4 |
Berechtigungen für den Eigentümer der Datei: lesen ( |
5-7 |
Berechtigungen für die Gruppe der Datei: |
8-10 |
Berechtigungen für alle anderen Benutzer: |
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.
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 |
---|---|
Dein Heimatverzeichnis, zum Beispiel /home/smith |
|
Dein Login-Name, z. B. |
|
Dein Eingangspostfach, z. B. /var/spool/mail/smith |
|
Das vorherige Verzeichnis deiner Shell, vor dem letzten |
|
Dein Shell-Suchpfad: Verzeichnisse durch Doppelpunkte getrennt |
|
Das aktuelle Verzeichnis deiner Shell |
|
Der Pfad zu deiner Shell (z. B. /bin/bash) |
|
Den Typ deines Terminals (z. B. xterm oder vt100) |
|
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=3 → export 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 whowho is hashed (/usr/bin/who)
The output may vary:
who is /usr/bin/who
This means "who" is cached
→ which who /usr/bin/who
This means "who" isn't cached
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/sbin → echo $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 llwc is /usr/bin/wc
Print the types of these commands
cd is a shell builtin
A program in the filesystem
ll is aliased to `ls -lG'
A built-in shell command
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→ command >> outfile
Create/overwrite 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→ command &> outfile
Separate files
→ command >& outfile
Single file (preferred)
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 jpegexample → ls *.jpg | cut -d. -f1 > /tmp/jpegs → ls *.txt | cut -d. -f1 > /tmp/texts → diff /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*aardvark adamantium apple → echo a\*
A file pattern
a* → echo "I live in $HOME"
A literal asterisk
I live in /home/smith → echo "I live in \$HOME"
Print a variable value
I live in $HOME
Print a literal dollar sign
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 |
---|---|---|
|
|
Zum vorherigen Befehl gehen |
|
|
Zum nächsten Befehl gehen |
|
Interaktiv nach einem vorherigen Befehl suchen |
|
|
|
Ein Zeichen vorwärts gehen |
|
|
Ein Zeichen rückwärts gehen |
|
|
Zum Anfang der Zeile gehen |
|
|
Gehe zum Ende der Zeile |
|
|
Nächstes Zeichen löschen |
|
|
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 |
---|---|
|
Drucke deine Geschichte |
|
Drucke die letzten N Befehle in deinem Verlauf |
|
Deinen Verlauf löschen (löschen) |
|
|
|
Steht für den Befehl Nummer N in deinem Verlauf |
|
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 → ls z*
zebra.txt zipfile.zip zookeeper
→ rm !$ |
|
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/bin → ls 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
|
Gib deine Aufträge an. |
|
Nach einem Befehl platziert, wird dieser im Hintergrund ausgeführt. |
|
Tastendruck, um den aktuellen (im Vordergrund befindlichen) Auftrag anzuhalten. |
|
Eine Shell aussetzen. |
|
Einen Auftrag aussetzen: ihn in den Vordergrund bringen. |
|
Lasse einen angehaltenen Auftrag im Hintergrund laufen. |
|
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
- 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 &[2]+ Stopped ssh example.com
A background job
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[sudo] password: xxxxxxxx # whoami root # suspend
Run a superuser shell
[1]+ Stopped sudo bash → whoami
Suspend the superuser shell
smith
Back to the original shell
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 jobs
angezeigt wird), gibst du die Auftragsnummer oder den Auftragsnamen mit einem vorangestellten Prozentzeichen an:
→ bg %2→ bg %cat
Send job 2 to the background
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→ fg %cat
Bring job 2 into the foreground
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→ disown %cat
Forget job #2
→ disown -h %2
Forget job beginning with “cat”
→ disown -r
Mark job #2 to keep running after shell exits
→ disown -a
Forget all running jobs
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:
-
Führe im aktuellen
tmux
Fensterls
aus. -
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. -
In diesem zweiten Fenster führst du einen anderen Befehl aus (z.B.
df
). -
Drücke auf
^Bn
und du wechselst zurück zu Fenster 0, wo deine Ausgabe vonls
nun wieder sichtbar ist. -
Drücke
^Bn
noch ein paar Mal, um zwischen den beiden virtuellen Fenstern zu wechseln. -
Drücke
^B%
, um das aktuelle Fenster in zwei nebeneinander liegende Fenster zu teilen. -
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 |
---|---|
|
Online-Hilfe anzeigen. Drücke "q" zum Beenden. |
|
Erstelle ein Fenster. |
|
Wechsle jeweils zu den Fenstern 0 bis 9. |
|
Wechsle zum nächsten Fenster, numerisch. |
|
Wechsle zum vorherigen Fenster, numerisch. |
|
Wechsle zu dem zuletzt verwendeten Fenster. |
|
In zwei Scheiben nebeneinander aufteilen. |
|
Oben und unten in zwei Scheiben geteilt. |
|
Springe zum nächsten Fenster. |
|
Springe zu dem Fenster auf der linken Seite. |
|
Springe zum Fenster auf der rechten Seite. |
|
Springe zu dem Fenster oben. |
|
Springe zum unteren Fenster. |
|
Anzeige der Fensternummern als Referenz. |
|
Beende das aktuelle Fenster. |
|
Sende ein echtes Ctrl-B an deine Shell, das von |
|
|
|
"Löse dich von einer |
|
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. |
|
Beende alle Fenster und beende |
Ein paar Hinweise zum Betrieb von tmux
:
-
Wenn in den Shells von
tmux
deine Aliase, Variablen oder andere Shell-Einstellungen fehlen, liegt das daran, dasstmux
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 vontmux
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 fg
in 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
.
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.
Shell | Bei der Anmeldung | Durch andere interaktive Shells | Bei Abmeldung |
---|---|---|---|
bash |
.bash_profile, .bash_login, |
.bashrc |
.bash_logout |
.profil |
|||
.config/fish/config.fish |
.config/fish/config.fish |
||
ksha |
.profile, .kshrc |
.kshrc |
|
.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 mitwc
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
-k
gefolgt von demStichwort:→ man -k database
Wenn die Liste der Manpages länger ist als der Bildschirm, kannst du sie über die Pipeline an
less
senden, um sie seitenweise anzuzeigen (drückeq
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, rufeinfo 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.