Bash-Befehle und -Operatoren

Abgeschlossen

Jede Shell-Sprache hat ihre am häufigsten verwendeten Befehle. Beginnen Sie mit dem Aufbau Ihres Bash-Repertoires, indem Sie sich die am häufigsten verwendeten Befehle ansehen.

Bash-Befehle

Es werden gängige Bash-Befehle und deren Nutzung vorgestellt.

ls-Befehl

ls listet den Inhalt des aktuellen Verzeichnisses oder des Verzeichnisses auf, das in einem Befehlsargument angegeben ist. Ohne Argumente listet der Befehl die Dateien und Verzeichnisse im aktuellen Verzeichnis auf:

ls

Dateien und Verzeichnisse, deren Namen mit einem Punkt beginnen, werden standardmäßig ausgeblendet. Wenn Sie diese Elemente in eine Verzeichnisliste einbeziehen möchten, verwenden Sie ein -a-Flag:

ls -a

Um noch mehr Informationen über die Dateien und Verzeichnisse im aktuellen Verzeichnis zu erhalten, verwenden Sie ein -l-Flag:

ls -l

Es folgt eine Beispielausgabe aus einem Verzeichnis, das einige JPEGs und PNGs sowie ein Unterverzeichnis namens gifs enthält:

-rw-rw-r-- 1 azureuser azureuser  473774 Jun 13 15:38 0001.png
-rw-rw-r-- 1 azureuser azureuser 1557965 Jun 13 14:43 0002.jpg
-rw-rw-r-- 1 azureuser azureuser  473774 Mar 26 09:21 0003.png
-rw-rw-r-- 1 azureuser azureuser 4193680 Jun 13 09:40 0004.jpg
-rw-rw-r-- 1 azureuser azureuser  423325 Jun 10 12:53 0005.jpg
-rw-rw-r-- 1 azureuser azureuser 2278001 Jun 12 04:21 0006.jpg
-rw-rw-r-- 1 azureuser azureuser 1220517 Jun 13 14:44 0007.jpg
drwxrwxr-x 2 azureuser azureuser    4096 Jun 13 20:16 gifs

In jeder Zeile werden ausführliche Informationen über die entsprechende Datei oder das entsprechende Verzeichnis bereitgestellt. Zu diesen Informationen gehören die jeweils zugewiesenen Berechtigungen, der jeweilige Eigentümer, die jeweilige Größe in Bytes, der jeweilige Zeitpunkt der letzten Änderung und der Datei- oder Verzeichnisname.

cat-Befehl

Angenommen, Sie möchten sehen, was sich in einer Datei befindet. Dazu können Sie den Befehl cat verwenden. Die Ausgabe wird nicht sinnvoll sein, es sei denn, die Datei ist eine Textdatei. Der folgende Befehl zeigt den Inhalt der Datei os-release, die im Verzeichnis /etc gespeichert ist:

cat /etc/os-release

Dies ist ein nützlicher Befehl, weil er Ihnen mitteilt, mit welcher Linux-Distribution Sie arbeiten:

NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

Das Verzeichnis /etc ist ein spezielles Verzeichnis unter Linux. Es enthält Systemkonfigurationsdateien. Sie sollten keine Dateien aus diesem Verzeichnis löschen, es sei denn, Sie wissen, was Sie tun.

sudo-Befehl

Einige Bash-Befehle können nur vom root-Benutzer – ein Systemadministrator oder Superuser – ausgeführt werden. Wenn Sie einen dieser Befehle ohne ausreichende Berechtigungen ausführen möchten, schlägt er fehl. Beispielsweise können nur Benutzer, die als Superuser angemeldet sind, mit cat den Inhalt von /etc/at.deny anzeigen:

cat /etc/at.deny

at.deny ist eine spezielle Datei, in der bestimmt wird, wer andere Bash-Befehle verwenden kann, um Aufträge zur späteren Ausführung zu übermitteln.

Sie sollten nicht den größten Teil der Zeit unter dem root-Konto arbeiten. Das ist zu gefährlich. Zum Ausführen von Befehlen, die Administratorrechte erfordern, ohne sich als Superuser anzumelden, setzen Sie sudo vor die Befehle:

sudo cat /etc/at.deny

sudo steht für „superuser do“. Wenn Sie diesen Befehl verwenden, sagen Sie der Shell, dass Sie für diesen einen Befehl mit den Berechtigungen des root-Benutzers arbeiten.

cd-, mkdir- und rmdir-Befehl

cd steht für „change directory“, und dieser Befehl tut genau das, was der Name vermuten lässt: Er wechselt aus dem aktuellen Verzeichnis in ein anderes Verzeichnis. Er ermöglicht es Ihnen, aus einem Verzeichnis in ein anderes zu wechseln, genau wie sein Gegenstück in Windows. Der folgende Befehl wechselt in das Unterverzeichnis des aktuellen Verzeichnisses, das den Namen orders hat:

cd orders

Sie können in das jeweils übergeordnete Verzeichnis wechseln, indem Sie .. als Verzeichnisnamen angeben:

cd ..

Dieser Befehl wechselt in Ihr Stammverzeichnis, also in das Verzeichnis, in dem Sie nach der ersten Anmeldung landen:

cd ~

Sie können Verzeichnisse mit dem Befehl mkdir erstellen. Mit dem folgenden Befehl wird ein Unterverzeichnis namens orders im aktuellen Arbeitsverzeichnis erstellt:

mkdir orders

Wenn Sie ein Unterverzeichnis und darunter ein weiters Unterverzeichnis mit einem Befehl erstellen möchten, verwenden Sie das Flag --parents:

mkdir --parents orders/2019

Mit dem Befehl rmdir wird ein Verzeichnis gelöscht (entfernt), jedoch nur, wenn es leer ist. Wenn es nicht leer ist, erhalten Sie stattdessen eine Warnung. Verzeichnisse, die nicht leer sind, können Sie mit dem Befehl rm in Kombination mit dem Flag -r (rekursiv) löschen. Der Befehl würde dann wie folgt aussehen: rm -r.

rm-Befehl

Der Befehlsname rm ist die Abkürzung für „remove“. Wie erwartet, werden mit rm Dateien gelöscht. Somit löscht dieser Befehl die Datei 0001.jpg:

rm 0001.jpg

Und mit diesem Befehl werden alle Dateien im aktuellen Verzeichnis gelöscht:

rm *

Seien Sie vorsichtig mit rm. Dieser Befehl ist ein gefährlicher Befehl.

Wenn Sie rm mit dem Flag -i ausführen, haben Sie Gelegenheit zum Überlegen, bevor Sie löschen:

rm -i *

Machen Sie es sich zur Gewohnheit, -i in jeden rm-Befehl einzufügen. So lässt sich vermeiden, dass Sie einer der größten Fehlerquellen von Linux zum Opfer zu fallen. Der gefürchtete Befehl rm -rf / löscht alle Dateien auf einem gesamten Laufwerk. Er geht so vor, dass alle Unterverzeichnisse des Stammverzeichnisses (root) und deren Unterverzeichnisse rekursiv gelöscht werden. Das Flag -f (für „force“) verschlimmert das Problem, indem es Eingabeaufforderungen unterdrückt. Verzichten Sie auf dieses Flag.

Wenn Sie ein Unterverzeichnis namens orders löschen möchten, das nicht leer ist, können Sie den Befehl rm auf folgende Weise verwenden:

rm -r orders

Hiermit werden das Unterverzeichnis orders und alle darin enthaltenen Elemente, einschließlich anderer Unterverzeichnisse, gelöscht.

cp-Befehl

Der Befehl cp kopiert nicht nur Dateien, sondern ganze Verzeichnisse (und Unterverzeichnisse), wenn Sie dies möchten. Um eine Kopie von 0001.jpg unter dem Namen 0002.jpg zu erstellen, verwenden Sie diesen Befehl:

cp 0001.jpg 0002.jpg

Wenn die Datei 0002.jpg bereits vorhanden ist, wird sie ohne Warnung von Bash ersetzt. Das ist großartig, wenn es Ihrer Absicht entspricht, aber nicht so schön, wenn Sie sich nicht darüber im Klaren waren, dass die alte Version überschrieben wurde.

Wenn Sie das Flag -i (für „interactive“) verwenden, werden Sie von Bash glücklicherweise gewarnt, bevor vorhandene Dateien gelöscht werden. Dies ist sicherer:

cp -i 0001.jpg 0002.jpg

Sie können Platzhalterzeichen verwenden, um mehrere Dateien gleichzeitig zu kopieren. Um alle Dateien im aktuellen Verzeichnis in ein Unterverzeichnis namens photos zu kopieren, führen Sie folgenden Befehl aus:

cp * photos

Um alle Dateien in einem Unterverzeichnis namens photos in ein Unterverzeichnis namens images zu kopieren, führen Sie folgenden Befehl aus:

cp photos/* images

Hierfür wird davon ausgegangen, dass das Verzeichnis images bereits vorhanden ist. Wenn dies nicht der Fall ist, können Sie es erstellen und den Inhalt des Verzeichnisses photos kopieren, indem Sie den folgenden Befehl verwenden:

cp -r photos images

-r steht für „rekursiv“. Ein zusätzlicher Vorteil des Flags -r besteht darin, dass auch Unterverzeichnisse, die in photos enthalten sind, in das Verzeichnis images kopiert werden.

ps-Befehl

Mit dem Befehl ps erhalten Sie eine Momentaufnahme aller derzeit aktiven Prozesse. Wird der Befehl ohne Argumente ausgeführt, werden alle Ihre Shell-Prozesse angezeigt – also nicht viel. Dies sieht aber ganz anders aus, wenn Sie ein -e-Flag angeben:

ps -e

-e listet alle aktiven Prozesse auf, und davon gibt es in der Regel viele.

Wenn Sie einen umfassenderen Blick auf die Prozesse wünschen, die im System ausgeführt werden, verwenden Sie das Flag -ef:

ps -ef 

Dieses Flag zeigt die Namen aller aktiven Prozesse, deren Prozessidentifikationsnummern (PIDs), die PIDs ihrer übergeordneten Elemente (PPIDs) und den Zeitpunkt an, zu dem sie gestartet wurden (STIME). Außerdem zeigt das Flag Folgendes für die Prozesse an: das Terminal (sofern vorhanden), dem sie zugeordnet sind; die CPU-Zeit, die sie beansprucht haben (TIME); und ihre vollständigen Pfadnamen. Es folgt ein gekürztes Beispiel:

UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 13:35 ?        00:00:03 /sbin/init
root          2      0  0 13:35 ?        00:00:00 [kthreadd]
root          3      2  0 13:35 ?        00:00:00 [rcu_gp]
root          4      2  0 13:35 ?        00:00:00 [rcu_par_gp]
root          5      2  0 13:35 ?        00:00:00 [kworker/0:0-cgr]
root          6      2  0 13:35 ?        00:00:00 [kworker/0:0H-kb]
root          8      2  0 13:35 ?        00:00:00 [mm_percpu_wq]
root          9      2  0 13:35 ?        00:00:01 [ksoftirqd/0]
root         10      2  0 13:35 ?        00:00:02 [rcu_sched]

Nebenbei bemerkt, finden Sie vielleicht Dokumentation, in der dargestellt ist, dass ps auf diese Weise verwendet wird:

ps aux

ps aux sind ps -ef gleich. Diese Dualität geht auf historische Unterschiede zwischen POSIX-Unix-Systemen (zu denen Linux gehört) und BSD-Unix-Systemen (das am häufigsten verwendete ist macOS) zurück. Zu Beginn wurde in POSIX -ef verwendet, während BSD aux erforderte. Heute akzeptieren beide Betriebssystemfamilien beide Formate.

Dies ist eine ausgezeichnete Erinnerung daran, warum Sie sich das Handbuch für alle Linux-Befehle genau anschauen sollten. Bash zu lernen ist ähnlich wie Englisch als zweite Sprache zu lernen. Es gibt viele Ausnahmen zu den Regeln.

w-Befehl

Benutzer kommen, Benutzer gehen, und manchmal haben Sie es mit Benutzern zu tun, die Sie gar nicht möchten. Wenn ein Mitarbeiter das Unternehmen verlassen hat, um sich neuen Aufgaben zu stellen, wird der Systemadministrator aufgefordert, dafür zu sorgen, dass sich der Mitarbeiter nicht mehr bei den Computersystemen des Unternehmens anmelden kann. Es wird auch erwartet, dass Systemadministratoren wissen, wer angemeldet ist und wer nicht angemeldet sein sollte.

Um festzustellen, wer auf Ihren Servern angemeldet ist, stellt Linux den Befehl w (für „who“) bereit. Der Befehl zeigt Informationen über die Benutzer, die derzeit beim Computersystem angemeldet sind, und über die Aktivitäten dieser Benutzer an. w zeigt die Namen der Benutzer, deren IP-Adressen, wann sie sich angemeldet haben, welche Prozesse sie derzeit ausführen und wie viel Zeit diese Prozesse beanspruchen. Der Befehl ist ein wertvolles Tool für Systemadministratoren.

Bash-E/A-Operatoren

Sie können in Linux viele Aufgaben erledigen, indem Sie Bash-Befehle samt deren zahlreichen Optionen ausführen. Aber Sie können noch weitaus produktiver sein, wenn Sie Befehle kombinieren, indem Sie E/A-Operatoren verwenden:

  • < zum Umleiten von Eingabe aus einer Quelle, die nicht die Tastatur ist
  • > zum Umleiten von Ausgabe an ein Ziel, das nicht der Bildschirm ist
  • >>, um dasselbe zu erledigen, allerdings mit Anfügen statt Überschreiben
  • | zum Weiterleiten (Piping) der Ausgabe eines Befehls in die Eingabe eines anderen Befehls

Angenommen, Sie möchten alle Elemente im aktuellen Verzeichnis auflisten, aber die Ausgabe in einer Datei namens listing.txt erfassen. Der folgende Befehl erledigt genau das:

ls > listing.txt

Wenn listing.txt bereits vorhanden ist, wird sie überschrieben. Wenn Sie stattdessen den Operator >> verwenden, wird die Ausgabe von ls an den Inhalt angehängt, der sich bereits in listing.txt befindet:

ls >> listing.txt

Der Weiterleitungsoperator ist leistungsfähig (und wird häufig verwendet). Er leitet die Ausgabe des jeweils ersten Befehls in die Eingabe des jeweils zweiten Befehls weiter. Angenommen, Sie verwenden cat, um den Inhalt einer großen Datei anzuzeigen, aber der Inhalt wird so schnell gescrollt, dass Sie ihn nicht lesen können. Sie können die Ausgabe handhabbarer gestalten, indem Sie die Ergebnisse über den Weiterleitungsoperator an einen anderen Befehl wie more weiterleiten. Mit dem folgenden Befehl werden alle derzeit aktiven Prozesse aufgelistet. Sobald der Bildschirm jedoch voll ist, wird die Ausgabe angehalten, bis Sie EINGABE gedrückt haben, um die nächste Zeile anzuzeigen:

ps -ef | more

Sie können Ausgabe auch an head weiterleiten, um nur einige der ersten Zeilen anzuzeigen:

ps -ef | head

Oder nehmen Sie an, Sie möchten die Ausgabe so filtern, dass nur die Zeilen einbezogen werden, die das Wort „daemon“ enthalten. Eine Möglichkeit dazu besteht darin, die Ausgabe von ps an das nützliche Linux-Tool grep weiterzuleiten:

ps -ef | grep daemon

Die Ausgabe könnte folgendermaßen aussehen:

azureus+  52463  50702  0 23:28 pts/0    00:00:00 grep --color=auto deamon
azureuser@bash-vm:~$ ps -ef | grep daemon
root        449      1  0 13:35 ?        00:00:17 /usr/lib/linux-tools/4.18.0-1018-azure/hv_kvp_daemon -n
root        988      1  0 13:35 ?        00:00:00 /usr/lib/accountsservice/accounts-daemon
message+   1002      1  0 13:35 ?        00:00:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
daemon     1035      1  0 13:35 ?        00:00:00 /usr/sbin/atd -f
root       1037      1  0 13:35 ?        00:00:00 /usr/bin/python3 -u /usr/sbin/waagent -daemon
root       1039      1  0 13:35 ?        00:00:00 /usr/lib/linux-tools/4.18.0-1018-azure/hv_vss_daemon -n
azureus+  52477  50702  0 23:28 pts/0    00:00:00 grep --color=auto daemon

Sie können auch Dateien als Eingabe verwenden. Üblicherweise kommt die Standardeingabe von der Tastatur, aber auch diese Eingabe kann umgeleitet werden. Um Eingabe aus einer Datei statt von der Tastatur zu erhalten, verwenden Sie den Operator <. Eine häufige Aufgabe eines Systemadministrators ist das Sortieren des Inhalts einer Datei. Wie der Name vermuten lässt, sortiert sort Text in alphabetischer Reihenfolge:

sort < file.txt

Um die sortierten Ergebnisse in einer neuen Datei zu speichern, können Sie die Eingabe und die Ausgabe umleiten:

sort < file.txt > sorted_file.txt

Sie können E/A-Operatoren verwenden, um Linux-Befehle nach Bedarf zu verketten. Betrachten Sie den folgenden Befehl:

cat file.txt | fmt | pr | lpr

Die Ausgabe von cat wird an fmt weitergeleitet, die Ausgabe von fmt an pr und so weiter. fmt formatiert die Ergebnisse in einem ordentlichen Absatz. pr paginiert die Ergebnisse. Und lpr sendet die paginierte Ausgabe an den Drucker. Alles in einer einzigen Zeile!