-
Notifications
You must be signed in to change notification settings - Fork 2
Kommandozeilen Basics
- Warum ist das wichtig?
- Navigation
- Verzeichnisoperationen
- Dateioperationen
- Weitere Operationen
- Datenströme
- Pipeline
- Weitere Literatur
- 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.
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.
???
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.
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.
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 backup
hochgegangen 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 /
.
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.
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 ~
Neben der Möglichkeit durch Verzechnise zu navigieren, können Verzeichnisse über die Konsole genauso gut erstellt und/oder gelöscht werden.
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.
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.
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/.
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
Befehl | steht für | in Deutsch |
---|---|---|
cp -R | copy (-R = recursive) | Kopiere rekursiv |
Beispiel:
cp -R ./musik ../ron/musik
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.
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.
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.
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.
mv krabbenburgerformel.txt ./abfalleimer/krabbenburgerformel.txt
mv managment.txt management.txt
cp krabbenburgerformel.txt ../safe/krabbenburderformel_duplikat.txt
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.
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
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
Standardeingabe In einer Konsole, geschieht die Eingabe für gewöhnlich über eine Tastatur, die ein Programm über den stdin abfragt.
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.)
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.
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
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
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
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
(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
- UNIX-Umdruck des ADV-Labors