Im ersten Teil habe ich den grundsätzlichen Umgang mit Befehlen und den Umgang mit Vorder- und Hintergrundprozessen geschildert. In diesem Teil soll es um die Hilfeseiten, der Vervollständigung in der Shell und der Shell-History, die Umgebungsvariable PATH, der Ausgabe von Programmen gehen und deren Umlenkungen in andere Programme und Dateien gehen. Als Letztes wird noch die Funktion von Alias und eine Reihe Bash-Shortcuts beschrieben. Der dritte Teil dieser Serie wird dann eine Reihe grundlegender Shellbefehle gehen die für einen Linuxbenutzer irgendwann essentiell sind.
Hilfeseiten
Jedes komplexere System braucht Hilfeseiten um bedienbar zu bleiben. So hat auch die Shell eine Hilfesystem. Der Aufruf einer Hilfeseite erfolgt mit dem Befehl man und daher auch der gebräuchliche Name für diese Seiten: „Manpages“. Praktisch jedes Programm für die Konsole hat eine oder mehrere dieser Seiten. Je nach Komplexität werden diese thematisch aufgeteilt. Folgende Aufzählung zeigt die thematische Unterteilung auf. Nicht jede dieser Seiten muss jedoch auch existieren.
- Benutzerkommandos (1)
- Systemaufruf (2)
- Funktionen der Programmiersprache C (3)
- Dateiformate (4)
- Konfigurationsdateien (5)
- Spiele (6)
- Diverses (7)
- Kommandos zur Systemadministration (8)
- Kernelfunktionen (9)
- Neue Kommandos (n)
In Klammern hinter den Themen steht die Option mit der man diese Seiten aufrufen kann. Normalerweise wird jedoch nur die Manpage 1 gebraucht und die ist voreingestellt. Der Aufruf für den Befehl ls wäre beispielsweise:
man 1 ls
oder einfacher:
man ls
Häufig findet man auch einen Befehl mit einem (Zahl) dahinter als Kurzschreibweise für eine Manpage wie z.B. ls (1). Mit der Option -k oder dem Befehl apropos kann man gezielt nach Manpages suchen. Beides führt zum gleichen Ergebnis.
$ apropos gzip gzip (1) - Dateien komprimieren und expandieren zforce (1) - Gzip-Dateien mit der entsprechenden Namenserweiterung ».gz« versehen IO::Compress::Gzip (3perl) - Write RFC 1952 files/buffers IO::Uncompress::AnyInflate (3perl) - Uncompress zlib-based (zip, gzip) file/buffer IO::Uncompress::AnyUncompress (3perl) - Uncompress gzip, zip, bzip2 or lzop file/buffer MIME::Decoder::Gzip64 (3pm) - decode a "base64" gzip stream PerlIO::gzip (3pm) - Perl extension to provide a PerlIO layer to gzip/gunzip
Die Option -f liefert eine Kurzinfo zurück:
$ man -f gzip gzip (1) - Dateien komprimieren und expandieren
Oft bekommt man auch mit den Optionen -h oder –help bei einem Befehl eine Kurzhilfe angezeigt.
Die Linux-Community ist zwar oft sehr hilfsbereit bei Problemen zu helfen aber sie reagiert auch gerne recht mürrisch wenn sie merken, dass man die manpage nicht gelesen hat und oft nur mit einem rtfm was eine Abkürzung für „read the fucking manual“ ist. Das Gleiche gilt übrigens auch für das Unterlassen von Suchmaschinen-Recherchen.
Vervollständigung in der Shell und die Shell-History
Dieses Kapitel ist von der verwendeten Shell abhängig und hier wird die bash als verbreitetste Shell unter Linux benutzt. Die Shell zeichnet eine History der eingegebenen Befehle auf und die bislang benutzten werden in eine Datei geschrieben. So kann man über die Pfeiltaste hoch und Pfeiltaste runter in der History blättern und alte Befehle neu aufrufen – was im Alltag sehr nützlich ist. Die gespeicherte Shell-History kann mit dem Befehl history abgerufen werden. Dabei wird eine laufende Nummer vor den Einträgen angezeigt. Nun gibt es den einfachsten Fall und wir wissen dass man kürzlich einen Befehl benutzt hat – beispielsweise dd dann wird mit der Eingabe von !dd der letzte Befehl der mit „dd“ beginnt noch einmal ausgeführt. Aus der History kann man den Befehl dann durch !<laufende Nummer> auswählen ohne, dass es der letzte eingegebene Befehl sein muss. Mit der Tastenkombination Strg-r kann man die History durchsuchen:
(reverse-i-search)`c': cat /etc/resolv.conf
Die Shellhistory ist im Benutzer-Homeverzeichnis in der Datei .bash_history im Klartext abgelegt.
Ebenfalls nützlich ist die Vervollständigung der Shell (Completion). Hier kommt der Tab-Taste eine besondere Funktion zu. Dabei können sowohl Befehle als auch Pfade und teilweise auch Optionen vervollständigt werden. Die Eingabe von less /et[Tab]ss[Tab]sshd[Tab] wird sicher zu /etc/ssh/sshd_config führen da der Rest durch die Tab-Taste vervollständigt wird. Auch ein ls[Tab][Tab] zeigt alle Befehle im Suchpfad des Benutzers an die mit ls beginnen. Das wären neben dem ls-Befehl auch lspci oder auch lsusb und andere je nachdem was installiert ist. Wenn eine Vervollständigung nicht zu einem eindeutigen Ergebnis führt zeigt die Shell nach doppelter Tabulatortaste die möglichen Alternativen an.
Umgebungsvariablen PATH
Die Umgebungsvariablen selbst werde ich mal anderweitig behandeln. Bedeutsam für die Shell ist vor allem zunächst einmal die Umgebungsvariable PATH. dort sind die Suchpfade für den jeweiligen Benutzer abgelegt. Normalerweise, wenn man die Variable nicht angepasst hat, ist sie für alle Benutzer eines Systems gleich mit Ausnahme des Benutzers root. Der administrative Benutzer root hat noch zusätzlich zu den Inhalten der normalen Benutzer administrative Befehle in seinem Suchpfad. Der normale Benutzer kann durchaus auch solche Befehle aufrufen muss jedoch den Pfad dazu eingeben während root diese ohne Eingabe des Pfades aufrufen kann:
Unveränderter Suchpfad eines normalen Benutzeraccounts: /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
Suchpfad von root: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Systemweit wird die Umgebungsvariable, wie auch andere, in der Datei /etc/login.defs gespeichert. Benutzer können sich ihre eigenen Suchpfad beispielsweise in ihrem Homeverzeichnis in der Datei .profile setzten. Temporär kann der Suchpfad auch durch die Eingabe von:
PATH=$PATH:/usr/local/progdir # neues Verzeichnis zuletzt durchsuchen PATH="/usr/local/progdir:$PATH" # neues Verzeichnis zuerst durchsuchen
für die aktuelle Shell gesetzt werden.
Anders als bei DOS oder Windows kann man Programme im aktuellen Verzeichnis nicht ohne Eingabe eines Pfades aufrufen (abgesehen man ist tatsächlich in einem Verzeichnis des Suchpfades) sondern man ruft dies durch Voranstellen von ./ auf – z.B. durch ./configure wenn man in einem Verzeichnis mit Quellcode ist und das Programm compilieren möchte.
Bei Cron-Jobs wird eine Shell ohne gesetzte Variable PATH gestartet und daher muss man den Pfad in den Scripten immer komplett ausschreiben oder PATH zu Beginn des Scriptes setzten.
Ausgabeumlenkungen in andere Programme und Dateien
Linux kennt drei Kanäle bzw. Standard-Datenströme – zwei Ausgabekanäle und einen Eingabekanal. Der Eingabekanal ist normalerweise die Tastatur und die Ausgabekanäle ist der Monitor. Die beiden Ausgabekanäle sind stdout und stderr – also der Ausgabekanal für reguläre Ausgaben (stdout) und der Ausgabekanal für Fehlermeldungen (stderr), Der Eingabekanal wird als stdin bezeichnet.
Wenn man recht simple anfängt dann begegnet einem die Pipe (|). Dieser senkrechte Strich bewirkt, dass die Ausgabe eines Befehls an stdin des nächsten übergeben wird. So wird bei im folgendem Beispiel die Ausgabe von ls an grep übergeben und nur die gefundenen Zeilen mit todo als Teil des Dateinamens ausgegeben:
$ ls | grep todo todo todo 1 todo2 todo hvf
Man kann das Ergebnis zwar auch nur mit dem Befehl „ls *todo*“ erzeugen aber dies hier ist nur zur Veranschaulichung.
Eine andere Art der Aus- bzw. auch Eingabeumlenkung wird mit den beiden Zeichen < und > erzeugt. Diese Zeichen lesen bzw. schreiben aus oder in Dateien.
Der kleine Zusatz „>Dateiname“ hinter einem Befehl leitet stdout in eine Datei Dateinamen im aktuellen Verzeichnis um und der Fehlerkanal würde von „2>“ dahinter umgeleitet. Allerdings wird dabei eine schon bestehende Datei mit gleichem Namen überschrieben. Man kann das Überschreiben von Dateien mit der Shelloption noclobber verhindern:
$ date > test $ cat test Fr 20. Nov 14:28:20 CET 2020 $ nslookup google.de > test $ cat test Server: 192.168.8.101 Address: 192.168.8.101#53 Non-authoritative answer: Name: google.de Address: 172.217.18.3 Name: google.de Address: 2a00:1450:4001:803::2003 $ set -o noclobber $ date > test bash: test: Kann existierende Datei nicht überschreiben.
Die Option wird mit set -o noclobber gesetzt und mit set +o noclobber wieder aufgehoben,
Ein doppeltes > hängt wie z.B. bei ls >> beispieldatei an eine Bestehende an und wenn sie nicht existiert dann wird eine neue Datei angelegt.
Will man beide Ausgabekanäle in eine Datei umlenken so kann man das mit dem Nachstellen von >/dev/null 2>&1 tun. Besonders beliebt ist die Kombination in Scripten und Cron-Jobs bei denen die komplette Ausgabe (stdout und stderr) nach /dev/null umgeleitet wird – also jede Ausgabe verhindert wird.
So wie man die Ausgabe eines Befehls in einer Datei umlenken kann, so kann man auch eine Datei zur Eingabe für einen Befehl benutzen. Das Zeichen dafür ist < und hat den Syntax Befehl < Datei.
$ wc -l < test.txt 6
Im vorangegangenen Beispiel wird die Datei test.txt als Standardeingabe für wc -l benutzt und dieser zählt die Zeilen in der Datei (Option -l).
Aliases
Man kann in der Bash eigene Befehle definieren. Dabei werden natürlich keine Befehle an sich erzeugt sondern ein Befehl mit gesetzten Optionen einer bestimmten Buchstabenkombination zu geordnet. Auch kann man direkt ein Befehl mit einer bestimmten Option versehen. Dies wird von Distributionen oft direkt vorinstalliert und z.B. ls direkt mit alias ls=’ls –color=auto‘ farblich unterlegt. Mit dem einfachen Befehl alias können die gesetzten alias-Funktionen abgerufen werden. Die alias-Funktionen werden in der Datei .bashrc im Homeverzeichnis des Benutzers definiert und oft sind von den Distributoren dort auskommentierte alias-Funktionen vordefiniert:
$ grep alias .bashrc # enable color support of ls and also add handy aliases alias ls='ls --color=auto' #alias dir='dir --color=auto' #alias vdir='vdir --color=auto' #alias grep='grep --color=auto' #alias fgrep='fgrep --color=auto' #alias egrep='egrep --color=auto' # some more ls aliases #alias ll='ls -l' #alias la='ls -A' #alias l='ls -CF' […]
Für den administrativen Benutzer root ist es ratsam ohne alias auszukommen um Bedienfehler zu vermeiden. Wie man oben sieht ist die Definition eines alias recht einfach und gehorcht dem Syntax „alias <Kürzel>='<Befehl -Option>'“.
Shortcuts in der Bash
Für die Shell gibt es eine Reihe Shortcuts. Diese werden durch Ctrl-Taste und weitere Taste erreicht. Die wichtigsten Shortcuts sind:
Ctrl+c: Löst ein SIGINT-Signal aus – d.h. der laufende Prozess wird beendet wenn das möglich ist.
Ctrl-z: Der laufende Vordergrundprozess wird gestoppt und man erhält einen Prompt. Fortgesetzt wird der Prozess entweder durch den Befehl bg (background) oder fg (forground) in Kombination mit der Prozessnummer.
Ctrl-d: Schliesst die Shell. Ähnlich wie exit.
Ctrl+l: Löscht den Bildschirminhalt – ähnlich wie der Befehl clear.
Ctrl+s: Stoppt die Bildschirmausgabe ohne den Prozess zu beenden.
Ctrl+q: Setzt die Bildschirmausgabe eines mit Ctrl-s gestoppten Prozesses fort.