Skip to content
This repository has been archived by the owner on Apr 6, 2021. It is now read-only.

Kommandozeilen Basics

cnoss edited this page Oct 16, 2017 · 1 revision

Übersicht

Warum ist das wichtig?

  • Früher oder später, tritt man mit der Konsole in Kontakt
  • Viele Programme und Tools im Bereich der Entwicklung von (Web-)Applikationen verfügen ausschließlich über ein CLI (Command Line Interface; Schnittstelle zur Kommandozeile), wie z. B. node, npm, mvn, rails usw.
  • In manchen Situationen, kommt man mit der Konsole um einiges schneller ans Ziel
  • Mit der Konsole einigt man sich auf einen gemeinsamen Nenner, wenn man gegebene Plattformen betrachtet. Für gewöhnlich wird die Nutzung einer Konsole durch Betriebssysteme unterstützt (sei es auch nur per Emulation).
  • Die Nutzung spezieller Programme ( z. B. mit einer GUI ) kann einen Nutzer möglicherweise an eine Umgebung und/oder Dienst binden, wodurch eine plattformunabhängige Nutzung erschwert wird.
  • Der Zugriff auf externe Systeme (für Deployment-, Bearbeitungs- und Wartungsarbeiten) geschieht sehr oft über eine per Konsole aufgebaute Verbindung zwischen lokalem und externen Rechner (Telnet, SSH, ...), wodurch der geübte und sichere Umgang mit der Konsole unabdingbar ist.

^ top

Navigation

Wo bin ich?

Befehl steht für in Deutsch
pwd print working directory Gib Arbeitsverzeichnis aus

Alternativ wird das aktuelle Arbeitsverzeichnis meist auch direkt mit der Eingabeaufforderung ausgegeben.

<benutzername>@<computername>:~/quellcode $ ▓

Das Tilde-Zeichen ist die Kurzschreibweise für das eigene Benutzerverzeichnis. Somit befindet man sich in einem Verzeichnis quellcode innerhalb des eigenen Benutzerverzeichnis. Aufgelöst, könnte der absolute Pfad wie folgt aussehen:

OS Pfad
Unix /home/<benutzername>/quellcode
macOS /Users/<benutzername>/quellcode
Win c:/Users/<benutzername>/quellcode

<benutzername> steht hier als Platzhalter für den Benutzernamen, mit dem sich angemeldet wurde. Der Benutzername kann sich zudem auch über über den Befehl whoami ausgegeben werden.

^ top


Was hat das mit meinem System zu tun?

???

^ top


Wo kann ich hin?

Um eine Auflistung des aktuellen Arbeitsverzeichnisinhalts zu erhalten, wird der Befehl ls verwendet. Darüber erhält man Informationen über im Verzeichnis befindliche Dateien un/oder Unterverzeichnisse, in die man ggf. wechseln kann.

Befehl steht für in Deutsch
ls list Auflisten
Parameter Bedeutung
-l Längere Ausgabe (Zugriffsrechte, Besitzer, Größe, letztes Änderungsdatum, ...)
-a Alle Dateien ausgeben (auch Dateien, die mit einem Punkt anfangen; wie z. B. versteckte Datein in der UNIX-Welt, oder auch die Kurzschreibweisen . und .., die das aktuelle und das Elternverzeichnis referenzieren )

Beispiele

Befehl Ausgabe
ls -l -a o. ls -la Gib zu allen Dateien (-a) im aktuellen Arbeitsverzeichnis, ausführliche Informationen aus (-l), wobei jeder Eintrag eine eigene Zeile einnimmt (-l)
ls -l -i -s -a o. ls -lisa Gib zu allen Dateien (-a) im aktuellen Arbeitsverzeichnis, ausführliche Informationen aus (-l) und zusätzlich die Datei- /Verzeichnis- (-s) sowie Inode-Größe (-i) aus

Für gewöhnlich hat jeder Benutzer ein eigenes Verzeichnis, auf dessen Inhalt standardmäßig nur er zugreifen kann (lesen, schreiben, ausführen), der über die Angabe einer Tilde ~ referenziert wird.

^ top


Wie komme ich dahin?

Um sich durch eine Verzeichnis-Hierarchie bewegen zu können, wird auf den Befehl cd gesetzt.

Befehl steht für in Deutsch
cd Change Directory Wechsel Verzeichnis

Angenommen folgende Verzeichnisstruktur liegt vor:

/
├── home/
│   ├── harry/
│   │   ├── bilder/
│   │   ├── musik/
│   │   └── videos/
│   ├── hermione/
│   └── ron/
└── sharing/
    ├── hobbies/
    └── school/
        └── classes/

Und als Arbeitsverzeichnis wäre /home/harry gegeben.

Ein ls würde uns folgende Ausgabe geben:

drwxrwxr-x 5 harry harry 4096 Jul 31 19:05 .
drwxrwxr-x 5 harry harry 4096 Jul 31 18:58 ..
drwxrwxr-x 2 harry harry 4096 Jul 31 19:05 bilder
drwxrwxr-x 2 harry harry 4096 Jul 31 19:05 musik
drwxrwxr-x 2 harry harry 4096 Jul 31 19:05 videos

Um in das Unterverzeichnis musik zu wechseln, sieht der Befehl wie folgt aus:

cd ./musik

Auf das ./ kann auch verzichtet werden, da es das aktuelle Arbeitsverzeichnis referenziert, in dem sich der Benutzer befindet (hier /home/harry). Nach dem Wechsel in das Unterverzeichnis musik, würde der Befehl pwd folgendes ausgeben:

/home/harry/musik

Um zurück zum Benutzerverzeihnis zu gelangen bzw. eine Ebene in der Verzeichnis-Hierarchie hochzugehen, ist das .. sehr hilfreich, das das Elternverzeichnis bzw. das übergeordnete Verzeichnis referenziert. Um dorthin zu gelangen, sieht der Befehl demnach so aus:

cd ..

Dadurch wäre das das aktuelle Arbeitsverzeichnis wieder /home/harry.

Um zu einem Verzeichnis zu wechseln, welches in einem anderen Hierarchiestrang vorliegt, wie hier z. B. das Verzeichnis sharing, gibt es zwei Möglichkeiten.

relative Pfadangabe

Bei einer relativen Pfadangabe, geht man vom aktuellen Arbeitsverzecihnis aus. Ein Wechsel vom Verzeichnis /home/harry zu /sharing, würde mit einer relativen Pfadangabe so aussehen:

cd ../../sharing

Mit dem ../.. wird die Verzeichnis-Hierarchie zwei Ebenen hochgegangen, bis man zum Wurzelverzeichnis / ankommt. Von dort aus, wird mit der weiteren Angabe von sharing, das Verzeichnis sharing adressiert, welches auf oberster Ebene im Wurzelverzeichnis liegt.

Ein Vorteil von relativen Pfaden, ist die Möglichkeit, ganze Verzeichnisstrukturen verschieben zu können, ohne relative Pfadangaben danach anpassen zu müssen. Würde z. B. der Inhalt des Wurzelverzeichnis / in ein neues Verzeichnis backup verschoben werden, wäre die obere relative Pfadangabe ../../sharing noch korrekt.

/
└── backup/
    ├── home/
    │   ├── harry/
    │   │   ├── bilder/
    │   │   ├── musik/
    │   │   └── videos/
    │   ├── hermione/
    │   └── ron/
    └── sharing/
        ├── hobbies/
        └── school/
            └── classes/

Nun ausgehend von /backup/home/harry als aktuelles Arbeitsverzeichnis, würde mit dem Befehl cd ../../sharing erstmal zwei Hierarchieebenen zum Verzeichnis backuphochgegangen werden, und im letzten Schritt von dort in das Zielverzeichnis sharing gewechselt werden. Im Vergleich zur vorherigen Verzwichnishierarchie, erreicht man mit ../.. nicht mehr das Wurzelverzeichnis /.

^ top

absolute Pfadangabe

Eine absolute Pfadangabe geht im Vergleich zu einer relativen Pfadangabe stets vom Wurzelverzeichnis / aus.

Ein Verzeichniswechel von /home/harry zu /sharing, könnte somit mit folgendem Befehl erreicht werden:

cd /sharing

Dabei spielt es keine Rolle, wie das aktuelle Arbeitsverzeichnis lautet, da stets vom Wurzelverzeichnis ausgegangen wird.

^ top


Wie komme ich zu meinem Benutzerverzeichnis?

Neben . und .., die das aktuelle und übergeordnete Verzeichnis referenzieren, gibt es eine weitere Kurzschreibweise, um ein anderes wichtiges Verzeichnis zu referenzieren.

Mit ~ (Tilde), kann von überall aus auf das eigene Benutzerverzeichnis referenziert werden.

cd ~

^ top

Verzeichnisoperationen

Neben der Möglichkeit durch Verzechnise zu navigieren, können Verzeichnisse über die Konsole genauso gut erstellt und/oder gelöscht werden.


Ich will ein Verzeichnis anlegen.

Befehl steht für in Deutsch
mkdir make directory Erstelle Verzeichnis

Soll im aktuelle Arbeitsverzeichnis ein Verzechnis mit dem Namen hagrid erstellt werden, sieht der BEfehl dazu wie folgt aus:

mkdir ./hagrid

Hier kann das ./ auch weg gelassen werden. Die Angabe von relativen und absoluten Pfaden ist möglich.

^ top


Ich will ein Verzeichnis löschen.

Befehl steht für in Deutsch
rmdir remove directory Entferne Verzeichnis
rm -R remove (-R = recursive) Entferne rekursiv

Neben mkdir existiert mit rmdir der Gegenbefehl, um Verzeichnisse wieder zu löschen. Anzumerken ist, dass mit rmdir nur das Entfernen von leeren Verzeichnissen möglich ist.

Soll ein nichtleeres Verzeichnis entfernt werden, muss auf rm -R zurückgegriffen werden.

Mit rm können neben Verzeichnissen auch Dateien entfernt werden. Der Parameter -R ist für das Entfernen von Verzeichnisen nötig, um vorher alle enthaltenen Dateien zu löschen (egal wie tief in der Verzeichnis-Hierarchie), bevor dann endgültig das angegebene Verzeichnis gelöscht wird.

ACHTUNG 1: Der Befehl rm, speziell in Komnination mit dem Parameter -R, sollte stets mit Bedacht genutzt werden. Unter der Annahme, dass Administrator-Rechte (bzw. Root-Rechte) gegeben sind, können mit einem rm -R / alle Verzeichnisse und Dateien im Wurzelverzeichnis gelöscht werden. Der angegebene Pfad sollte somit stets vor jeder Ausführung penibel überprüft werden.

ACHTUNG 2: rm löscht Dateien und Verzeichnisse direkt, ohne den Umweg über einen Papierkorb zu gehen.

^ top


Ich will ein Verzeichnis verschieben.

Soll ein Verzeichnis (oder eine Datei) verschoben werden, kann dazu auf den Befehl mv zurückgegriffen werden.

Befehl steht für in Deutsch
mv move Verschiebe / Bewege

Auch bei diesem Befehl können relative und absolute Pfade angegeben werden.

mv erwartet zwei Angaben, nämlich das Quell- und das Zielverzeichnis (oder auch -datei). Dabei ist es wichtig, dass das Zielverzeichnis nicht bereits existiert.

Beispiel:

mv ./musik /home/ron/musik

Die erneute Angabe des Verzeichnisnamens für das Ziel, kann sich auch gespart werden, wenn ein . anstelle angegeben wird.

mv ./musik /home/ron/.

^ top


Ich will ein Verzeichnis umbenennen.

Für das Umbenennen von Verzeichnissen (aber auch Dateien), kann ebenfalls mv verwendet werden. Dabei verhält sich das Umbenennen sehr ähnlich wie das Verschieben von Verzeichnissen und Dateien. Wird ein Verzeichnis verschoben, kann in der zweiten Angabe (wohin ein Verzeichnis verschoben werden soll), ein neuer Name vergeben werden.

Beispiel:

mv ./musik /home/ron/musik_von_harry

Das Umbenennen eines Verzeichnisses (oder einer Datei) ist somit nichts anderes als ein Verschieben innerhalb eines Verzeichnisses.

mv ./musik ./musik_alt

^ top


Ich will ein Verzeichnis kopieren.

Befehl steht für in Deutsch
cp -R copy (-R = recursive) Kopiere rekursiv

Beispiel:

cp -R ./musik ../ron/musik

Dateioperationen

^ top

Neben Verzeichnissen, sollte auch der Umgang mit Dateien auf dem Dateisystem gekonnt sein. Hierzu gibt ebenfalls diverse Befehle, die den Einblick in eine Datei ermöglichen oder für die Bearbeitung dieser herangezogen werden können.

^ top


Ich will den Inhalt einer Datei sehen.

Sofern es sich um eine Datei mit menschenlesbaren Inhalt handelt, können diese relativ einfach auf der Konsole ausgegeben werden.

Eine Möglichkeit, Einblick in eine Datei zu erhalten, ist es, diese mit einem Editor zu öffnen. Ein bekanntes und weit verbreitetes Programm in diese Richtung, ist vim.

vim pfad/zur/datei.txt

Alternativ kann sich der Inhalt auch einfach direkt auf der Konsole ausgegeben werden, sofern die Notwendigkeit nicht gegeben ist, den Inhalt zu editieren. Dazu kann der Befehl cat verwendet werden.

Befehl steht für in Deutsch
cat concatenate Verbinde / Verkette

Die Hauptaufgabe von cat ist es, den Inhalt von mehrere Dateien in einer bestimmten Reihenfolge zu verbinden.

Beispiel:

cat namen1.txt namen2.txt ../namen3.txt ./old/namen4.txt

Wird nur eine Pfad zu einer Datei angegeben, wird folgich auch nur der Inhalt dieser Datei ausgegeben.

Hinweis: Das Zusammenführen von mehreren Dateien zu einer Datei ist sehr einfach mit möglich, wenn cat in Zusammenspiel mit der Möglchkeit der Umleitung von Datenströmen verwendet wird. Dazu sei weiter unten auf Datenströme > Umleitung verwiesen.

^ top


Ich will eine Datei anlegen.

Um eine Datei anzulegen, gibt es auch hier mehrere Ansätze.

Befehl steht für in Deutsch
touch touch Anfassen

Mit dem Befehl touch und einem Dateinamen (oder einer Pfadangabe), kann eine leere Datei erstellt werden.

Alternativ kann eine Datei auch direkt mit Inhalt versehen werden, wenn man die Möglichkeit nutzt, Datenströme umzuleiten. In diesem Beispiel, eignet sich der Befehl echo (Ausgabe einer Zeichenkette auf der Konsole) sehr, für das initiale Befüllen einer Datei mit recht wenig Zeichen.

echo "Hallo Welt" > freundlich.txt 

Auch hier sei weiter unten auf Datenströme > Umleitung verwiesen.

Ein weiterer Ansatz um Dateien zu erstellen, ist die Nutzung von Editoren (hier z. B. vim), und ihrer Fähigkeit, noch nicht existierende Dateien mit Hilfe der Speichern-Funktion zu erstellen.

vim freundlich.txt

Nach dem Speichern (:wq), sollte die Datei durch vim erstellt worden sein.

Dieser Ansatz ist sinnvoll, wenn man um einiges mehr an Text per Tastatur in eine Datei schreiben möchte.

^ top


Ich will eine Datei löschen.

Neben dem Löschen von Verzeichnissen per rm -R verzeichnisname, wird rm auch genutzt , um Dateien zu entfernen.

rm krabbenburgerformel.txt

ACHTUNG: rm löscht Dateien und Verzeichnisse direkt, ohne den Umweg über einen Papierkorb zu gehen.

^ top


Ich will eine Datei verschieben.

mv krabbenburgerformel.txt ./abfalleimer/krabbenburgerformel.txt

^ top


Ich will eine Datei umbenennen.

mv managment.txt management.txt

^ top


Ich will eine Datei kopieren.

cp krabbenburgerformel.txt ../safe/krabbenburderformel_duplikat.txt

^ top

Weitere Operationen

Ich will eine Datei oder ein Verzeichnis finden.

Befehl steht für in Deutsch
find find FInde
Parameter Bedeutung
-name Muster, zu dem der Dateiname einer zu findende Datei passen muss

Beispiel:

find . -name "krabbenburgerformel.txt"

Hier wird eine Datei mit dem Dateinamen krabbenburgerformel.txt innerhalb der aktuellen Verzeichnisses . und allen Unterverzeichnissen gesucht.

Weiß man nur grob wie der Name einer Datei lautete, kann man auch das Asterisk-Zeichen als Wildcard nutzen.

find . -name "*.txt"

Dieser Befehl würde im aktuellen Verzeichnis und allen Unterverzeichnissen nach Dateien suchen, die im Namen die Dateierweiterung txt aufweisen.

Angenommen folgende Verzeichnisstruktur und Dateien sind gegeben:

meer/
├── krosse_krabbe/
│   ├── krabbenburgerformel.txt
│   └── logo.jpg
└── safe/
    └── krabbenburgerformel_duplikat.txt

Hier würde find . -name ".txt" nur die Dateien /meer/krosse_krabbe/krabbenburgerformel.txt und /meer/safe/krabbenburgerformel_duplikat.txt finden. logo.jpg hingegen würde nicht aufgelistet werden, da es nicht mit .txt endet.

^ top


Ich will ein Verzeichnis in ein Archiv verpacken.

In der Unix-Welt gibt es mit tar ein Standardwerkzeug für das Packen und Archivieren von Dateien.

Befehl steht für in Deutsch
tar tape archiver Band-Archivierer
Parameter Bedeutung
-z Archiv soll komprimiert werden
-c Neues Archiv erzeugen (create)
-x Archiv extrahieren (extract)
-f Datei auswählen (Beim Erstellen, muss die Datei noch nicht existieren)

Beispiel:

tar -zcf archivname.tar.gz verzeichnisname

Der obere Befehl nimmt das Verzeichnis verzeichnisname und alle seine enthaltenen Dateien sowie Verzeichnisse und komprimiert diese zu einer Archivdatei mit dem Namen archivname.tar.gz. Die Erweiterung .tar.gz ist nötig, damit direkt gesehen werden kann, dass das Archiv ein tar-Archiv ist, dass komprimiert wurde gz.

Alternativ kann ein Verzeichnis auch gezipped werden.

zip archivname.zip verzeichnisname

^ top


Ich will ein Archiv entpacken.

Um ein komprimiertes tar-Archiv wieder zu entpacken bzw. zu extrahieren, muss folgender Befehl mit Parametern ausgeführt werden:

tar -xzf archivname.tar.gz

Das x in -xzf steht hierbei für extract. Mit z wird angegeben, dass es sich um ein komrimiertes Archiv handelt, wodurch es zuerst wieder dekomprimiert werden muss. Komprimierte tar-Archive sind an der zusätzlichen Endung .gz zu erkennen. Zuletzt wird über f der Dateiname des Archivs angegeben. In diesem Fall, würde die komprimierte Archivdatei archivname.tar.gz entpackt werden.

Um eine Zip-Datei zu entpacken, reicht folgender kurze Befehl:

unzip archivname.zip

^ top


Datenströme

^ top

Standard

stdin (Kanal 0)

Standardeingabe In einer Konsole, geschieht die Eingabe für gewöhnlich über eine Tastatur, die ein Programm über den stdin abfragt.

^ top

stdout (Kanal 1)

Standardausgabe Die Ausgabe, die ein Programm über den stdout-Strom abwickelt (In der Programmiersprache C würde die Ausgabe z. B. per printf über den stdout geschehen. In Java wäre dies über die Funktionen in System.out.* möglich.)

^ top

stderr (Kanal 2)

Standardfehlerausgabe Für die Ausgabe von Fehlern, können Programme auf den stderr-Datenstrom zurückgreifen, der getrennt vom stdout geführt wird. In einer Konsole, werden alle über stderr ausgegeben Fehler, auch in der Konsole ausgegeben.

^ top

Hinweise

Durch die Trennung von Standardausgabe und Standardfehlerausgabe, wird die gesonderte Behandlung beider Datenströme möglich. Ein mögliches und häufig anzutrefendes Szenario ist, die Fehlerausgabe in Dateien umzulenken, während die Standardausgabe weiterhin in der Konsole geschieht. Dazu mehr unter dem Punkt Umleitungen > Umleitung von Datenströmen

^ top


Umleitungen

Umleitung der Ausgabe von Programmen in Dateien, oder den Inhalt von Dateien als stdin für Programme heranziehen.

>

Beispiel:

echo "Hallo Welt" > nice.txt Leitet die Ausgabe von echo (stdout) (hier "Hallo Welt") in die Datei "nice.txt" um. Sofern die Datei nicht existiert, wird sie erzeugt und mit dem Text befüllt. Sollte die Datei bereits existieren, wird der aktuelle Inhalt durch den Text ersetzt.


>>

Beispiel:

echo "Mein Name ist 'Er, dessen Namen nicht genannt werden darf.' >> nice.txt Leitet die Ausgabe von echo (stdout) in die Datei "nice.txt" um. Sofern die Datei nicht existiert, wird sie erzeugt und mit dem Text befüllt. Sollte die Datei bereits existieren, wird der Text angefügt.


<

Beispiel:

sort < names.txt Den Inhalt einer Datei als Eingabe eines Programms (stdin) nutzen. "Simuliert" die Eingabe per Tastatur.


<<KONSTANTE ... KONSTANTE

Beispiel:

uniq <<DOC
Hans
Hans
Peter
Torsten
Peter
Peter
Hans
DOC

Ergibt

Hans
Peter
Torsten
Peter
Hans

^ top


Umleitung von Datenströmen

Mit >, wird nur die Standardausgabe umgeleitet. Die Standardfehlerausgabe hingegen geschieht weiterhin über die Konsole. Es kann aber manchmal sinnvoll sein, bestimmte Datenströme bzw. Kanäle explizit umzuleiten. Als Beispiel sei die Umleitung der Standardfehlerausgabe in eine Log-Datei genannt, wobei die Standardausabe unangetastet bleibt.

commando 2> err.log

Durch die zusätzliche Angabe der Kanalnummer (2 = stderr), kann explizit angeben werden, welcher Datenstrom in die Datei "err.log" umgeleitet werden soll. Die Standardausgabe geschieht hier dabei weiterhin über die Konsole.

Möchte man hingegen die Datenströme stdout und stderr zusammenführen, kann dies wie folgt realisiert werden:

commando > out.txt 2>&1

Die Angabe 2>&1 gibt ab, dass der Datenstrom der Fehlerausgabe (Kanal 2) in den der Standardausgabe (Kanal 1) umgeleitet werden soll. Die Umleitung beider Datenströme in jeweils eigene Dateien, geschieht hingegen wie folgt:

commando > out.txt 2> err.log

Zu beachten ist, dass der Inhalt der beiden Dateien out.txt und err.log jedes Mal ersetzt wird. Möchte man die Ausgaben eines Programms oder eines Kommandos an die Dateien anfügen, muss das doppelte Größer-als-Zeichen verwendet werden.

commando >> out.txt 2>> err.log

^ top


Pipeline

Was ist eine Pipeline?

Ausgabe eines Programms, dient als Eingabe eines anderen Programms. Eine Verkettung aus mehreren Programmen ist möglich.

Genauer: Der stdout eines Programms, wird als stdin eines anderen Programms genommen. (Keine Eingabe der Daten über die Tastatur)

|

Ein simples Pipeline-Beispiel sieht wie folgt aus:

cat planeten.txt | sort

^ top


Nützliche Pipeline-Kombinationen

sort < names.txt | uniq | wc -l

(alternativ auch cat names.txt | sort | uniq | wc -l )

Inhalt von names.txt:

Hans
Hans
Peter
Torsten
Peter
Peter
Hans

Nach sort:

Hans
Hans
Hans
Peter
Peter
Peter
Torsten

Nach uniq:

Hans
Peter
Torsten

Nach wc -l (word count; -l = lines):

3

^ top


Weitere Literatur

^ top

Clone this wiki locally