Heute einmal eine andere Form von „Der unbekannte Befehl“ denn ich habe festgestellt, dass ich zwar hier Befehle behandele die mehr oder minder exotisch sind aber hier noch niemals was zu der ein paar Handvollen die man ständig braucht geschrieben habe. Daher nun eine Abhandlung zu den gängigen Befehlen die man in der Konsole ständig nutzt.
Einleitung
Man braucht hier vor allem Dateioperationen wie das Auflisten von Verzeichnissen oder das Anzeigen und Bearbeiten von Dateiinhalten aber auch das Ändern von Dateirechte und vieles mehr. Hier unterscheidet sich Linux zunächst einmal wenig von der Eingabeaufforderung von (MS-)DOS, Windows, CPM oder sonstige Konsolen. Die größten Unterschiede sind die Bezeichnung der Befehle und die grundlegende Bedeutung der Konsole. Während z.B. unter Windows die Eingabeaufforderung meist nur noch von Systemadministratoren benutzt wird hat sie unter Linux eine deutlich höhere Bedeutung. Das liegt zum Einen daran, dass Linuxbenutzer oft Computer-affinier sind aber vor allem auch daran, dass die Konsole deutlich mächtiger ist als es eine GUI sein kann. Zum Anderen liegt es aber auch daran, dass Linux oft über Netzwerk, ohne das Benutzen einer grafischen Oberfläche sondern über SSH, benutzt wird. Einen Windows-Server, ja so etwas gibt es tatsächlich, kann man ohne grafische Oberfläche nicht installieren und man kann ihn komplett über diese administrieren. Bei Linux-Servern wird eine grafische Oberfläche jedoch als Sicherheitsproblem gesehen da sie oft auf Port 6000 lauscht aber auch weil so eine Software, unter Linux ist die grafische Oberfläche streng genommen kein Teil des Betriebssystems, recht komplex ist und daher sicherheitsrelevante Bugs recht wahrscheinlich sind.
Unter Linux wird die Gesamtheit der Konsolenbefehle als Shell (von englisch für Hülle, Schale) bezeichnet. Zu allem Überfluß gibt es eine ganze Reihe von mehr oder minder gebräuchlichen Shells. Welche im speziellen benutzt wird steht in der Umgebungsvariable SHELL die man mit:
$ echo $SHELL /bin/bash
auslesen kann. In diesem Fall wird die unter Linux sehr gebräuchliche bash benutzt. Die einfachste Shell ist sh und zu der versucht wird eine Abwärtskompatiblität zu erreichen. Es gibt daneben auch die csh, tcsh oder ksh um ein paar der Bekannteren zu nennen. Sie unterscheiden sich aber alle eher im Detail und in ihren Eigenschaften bei Schreiben von Shellscripten. Was unter DOS die batch-Files sind, das sind unter Linux die Shellscripte und die haben, aufgrund ihrer Leistungsfähigkeit, traditionell eine extrem höhere Bedeutung als Batch-Dateien in MS-Betriebssystemen. In diesem Beitrag soll es jedoch nicht um das Schreiben von Scripten gehen sondern um die interaktive Konsole. Wobei die Übergänge hier auch fließend sein können.
Befehle und kombinierte Befehle
Shellbefehle in der Konsole werden normalerweise einfach in dem Prompt eingegeben und ein Ergebnis wird ausgegeben. Man kann jedoch auch Befehle kombinieren womit wir in der Nähe von Scripting sind. Die einfachste Variante ist Befehle in einer Reihe abzuhandeln:
Befehl1; Befehl2; Befehl3
hier werden einfach drei Befehle nacheinander ausgeführt und das Ergebnis ausgegeben. Das folgende Beispiel zeigt so etwas in einem realen Beispiel:
$ ls; date file1 file2 file3 file4 file5 So 15. Nov 16:35:13 CET 2020
Hier wird der ls-Befehl (kleiner Vorgriff auf später – zeigt den Inhalt eines Verzeichnisses an) und der date-Befehl (zeigt die Systemzeit an) kombiniert. Das Semikolon ; trennt die beiden Befehle voneinander denn unter Linux ist es möglich, dass hinter dem Befehl eine oder mehrere Parameter folgen können.
Man kann jedoch auch Befehle kombinieren und die Ausführung vom Erfolg des vorhergehenden abhängig machen. In diesem Fall wird statt des Semikolon ein doppeltes kaufmännische Und-Zeichen (&) benutzt:
Befehl1 && Befehl2
Oft wird das z.B. beim Update des Systems benutzt
apt-get update && apt-get dist-upgrade
apt-get update liest dabei die Liste der verfügbaren Updates ein und wenn das erfolgreich war dann wird der Upgrade-Prozess mit apt-get dist-upgrade angestoßen.
Den umgekehrten Fall trennt man mit zwei Pipe-Zeichen (|). Hier wird der nachfolgende Befehl nur ausgeführt wenn der vorangegangene erfolglos war:
Befehl1 || Befehl2
Vordergrund- versus Hintergrundprozesse
Die Shell kennt sowohl Vordergrund- als auch Hintergrundprozesse. Der Unterschied ist, dass man bei einem Hintergrundprozess bereits während der Laufzeit des Prozesses einen Shellprompt erhält. Technisch wird hier eine neue Shell gestartet und man erhält sofort die Startshell zurück. Einen Befehl kann man mit dem einfachen Nachstellen vom kaufmännischen Und-Zeichen & starten:
Befehl1 &
Hintergrundprozesse machen nur einen Sinn, wenn keine Eingabe erwartet wird denn dann wartet der Hintergrundprozess ohne Ausgabe einer Eingabeaufforderung auf diese Eingabe ewig.
Als Beispiel für einen Hintergrundprozess würde ich folgende einfache Ausgabe aufführen:
$ sleep 1000 & [1] 7890 $ ps aux | grep sleep max 7890 0.0 0.0 5260 740 pts/0 S 17:26 0:00 sleep 1000 max 7892 0.0 0.0 6088 820 pts/0 S+ 17:26 0:00 grep sleep
Der Befehl sleep lässt einfach den Prozess für die angegebene Sekundenzahl schlafen und wird dann beendet. Die Ausgabe der Prozesse mit ps und die Suche nach sleep zeigt die PID des Prozesses an (der zweite Fund ist der Suchprozess mit ps selber). Nach dem Starten des von sleep als Hintergrundprozess wird auch die PID angezeigt und eine Prozessnummer, die sich mit dem Starten von mehreren Hintergrundprozessen immer weiter erhöht. Über diese Prozessnummer kann der Prozess selber angesprochen werden. Das behandeln von Vordergrund- und Hintergrundprozessen kann man an den beiden folgenden Beispielen sehen. Im Ersten wird ein Hintergrundprozess gestartet und mit fg in der Vordergrund geholt. Nun ist der Cursor verschwunden. Um ihn wieder in den Hintergrund zu schicken wird er mit CTRL-z gestoppt und dann mit bg 1 wieder in den Hintergrund geschickt.
$ sleep 1000 [1] 7890 $ fg 1 sleep 1000 ^Z [1]+ Angehalten sleep 1000 $ bg 1 [1]+ sleep 1000 & $ jobs [1]+ Läuft sleep 1000 &
Das zweite Beispiel zeigt das starten einen Vordergrundprozesses der wieder mit CTRL-z angehalten wird und mit bg 2 in den Hintergrund geschickt wird. Der Befehl jobs zeigt nun beide Hintergrundprozesse mit der Prozessnummer an.
$ sleep 2000 ^Z [2]+ Angehalten sleep 2000 $ bg 2 [2]+ sleep 2000 & $ jobs [1]- Läuft sleep 1000 & [2]+ Läuft sleep 2000 &
2 Gedanken zu „Der unbekannte Befehl – Die Konsole für Dummies (Teil I)“
Kommentare sind geschlossen.