~~NOTOC~~ ====== Kommandozeile (= bash = git-bash) ====== Auf der Kommandozeile (auch Terminal oder Konsole oder bash genannt), können **per Tastatureingaben** Programme gestartet werden, kann im Dateisystem navigiert werden, können Dateien manipuliert werden (kopieren, umbenennen, verschieben) und kann eigentlich alles gemacht werden, was auf einem Computer möglich ist. Das mag auf den ersten Blick kompliziert erscheinen, hat aber einige Vorteile: * Mit der Tabulator-Taste können Dateinamen vervollständigt werden. * Kommandos können einfach wiederholt werden (z.B. mit Pfeiltaste nach oben, durch Definition mit ''alias'', oder man speichert die Kommandozeile gleich in eine Datei). * Es kann mit vielen Dateien auf einmal gearbeitet werden, z.B. durch Verwendung von **Wildcards** wie ''*'', ''?'', etc. * Nachhaltiges Lernen: ''bash'' (die Kommandozeile, die wir einsetzen) und die gängigsten Kommandos haben sich in den letzten 30 Jahren kaum verändert und werden es auch in Zukunft nicht tun. * Sieht aus wie im Hacker-Film ;-) ===== Grundlegende Struktur eines Kommandos ===== Die Struktur eines bash-Kommandos ist folgende: ''command'' ''arg1'' ''arg2'' ''arg3'' ... wobei * ''command'' der Name eines Befehls (z.B. ''cd'') oder eines Programms ist (wie z.B. ''python'' oder ''ls''). * ''arg1'' etc. die **Argumente** sind. Je nach Befehl können unterschiedlich viele (oder auch keine) Argumente angegeben werden. * Typischerweise sind Argumente Datei- oder Ordnernamen oder zusätzliche Optionen. * Der Befehl bzw. das Programm werden im aktuellen Verzeichnis (**working directory**) ausgeführt. Alle Datei- und Verzeichnisangaben, die nicht mit ''/'' beginnen, beziehen sich auf das aktuelle Verzeichnis. bash-Kommandos werden mit der Return-Taste abgeschickt. Beispiele: cd /c/ofi4XXX/ unzip adventurequest.zip python guide.py Kommandozeilenargumente werden durch **Leerschläge** getrennt. Das ist ein Problem, wenn Dateinamen Leerschläge enthalten. Diese müssen dann entweder durch Backslashes geschützt werdem oder der ganze Dateinamen muss zwischen Anführungszeichen (doppelte oder einfache) geschrieben werden. Z.B. cd "OneDrive - xyz Blabla" cd OneDrive\ -\ xyz\ Blabla Die Tabulatortaste kann zur Ergänzung benutzt werden, wandelt dabei aber immer in die zweite Version mit Backslashes um ===== Auswahl einiger Befehle und Programme ===== ==== ls (list files) ==== ''ls'' zeigt die Dateien im aktuellen Verzeichnis an. Nützliche Optionen: * ''ls -a'' alle Dateien anzeigen (auch versteckte) * ''ls -l'' Zusätzliche Informationen anzeigen. * ''ls -ltr'' Dateien nach Datum/time (-t) in umgekehrter Reihenfolge/reverse (-r) anzeigen. So wird die neueste Datei zuunterst angezeigt. * ''ls -lhSr'' Dateien nach Grösse/size (-S) in umgekehrter Reihenfolgen (-r) in «human readable format» (-h) anzeigen. Damit erscheinen die grössten Dateien zuunterst (praktisch zum Aufräumen). ==== cd (change directory) ==== ''cd'' wechselt das aktuelle Verzeichnis. * Ohne Argument (einfach ''cd'' alleine) wechselt ins **Home-Verzeichnis**, unter Windows typischerweise ''/c/Users/benutzername/'', unter Linux/MacOS ''/home/benutzername''. * ''cd ..'' wechselt ins Elternverzeichnis (eine Ebene zurück). * ''cd informatik'' wechselt ins Unterverzeichnis ''informatik'' (falls dieses existiert). * ''cd informatik/jokerchain'' wechselt zwei Verzeichnisse auf einmal. ==== mkdir (make directory) ==== ''mkdir'' legt ein neues Verzeichnis an: * ''mkdir test'' Legt im aktuellen Verzeichnis ein neues Verzeichnis ''test'' an. * ''mkdir -p alles/auf/einmal'' Legt verschachtelte Verzeichnisse auf einmal an (anstatt ''mkdir alles'', ''cd alles'', ''mkdir auf'', ''cd auf'', ''mkdir einaml'', ''cd ../..'') ==== rmdir (remove directory) ==== ''rmdir'' löscht ein leeres Verzeichnis * ''rmdir test'' Löscht das leere Verzeichnis test im aktuellen Verzeichnis. Schlägt fehl und tut nichts, wenn das Verzeichnis nicht leer ist. ==== pwd (print working directory) ==== ''pwd'' zeigt das aktuelle Verzeichnis an. Dieses wird normalerweise schon automatisch auf der Kommandozeile angezeigt. ==== python ==== * ''python'' started den interativen Python-Interpreter * ''python hello.py'' startet das Pythonprogramm ''hello.py'', falls dieses **im aktuellen Verzeichnis** existiert. ==== cp (copy) ==== ''cp'' kopiert Dateien. * ''cp orignal.txt kopie.txt'' kopiert die Datei ''original.txt'' und speichert die Kopie unter dem Namen ''kopie.txt''. * ''cp test.txt foo/bar/.'' kopiert die Datei ''test.txt'' unter gleichem Namen in den Ordner ''bar'', der sich im Ordner ''foo'' befindet. * ''cp *.md backup/.'' kopiert alle Dateien, die mit ''.md'' aufhören in den Ordner ''backup''. * ''cp -r meinordner /c/backup/.'' kopiert den Ordner ''meinordner'' rekursiv (d.h. mit allen Dateien und Ordnern, die darin sind) in den Ordner ''/c/backup'' * ''cp -vrau meinordner /c/backup/.'' zeigt den Vorgang an (-v für verbose), (-r für rekursiv), (-a für archiv) (d.h. die Zieldatei erhält die gleichen Attribute, wie die Quelldatei. Insbesondere werden die Datumsangaben übernommen), -u für update, d.h. nur neuere bzw. im Ordner ''backup'' nicht existierende Dateien werden kopiert. Das eignet sich sehr gut für wiederholte schnelle Backups. ==== mv (move) ==== ''mv'' verschiebt Dateien (bzw. benennt diese um). * ''mv alt neu'' benennt die Datei ''alt'' in ''neu'' um. * ''mv datei ordner/.'' verschiebt die Datei ''datei'' in den Ordner ''ordner''. * ''mv jocker-chain2022*.md backup/.'' verschiebt alle Dateien, die mit ''jocker-chain2022'' beginnen und mit ''.md'' aufhören in den Ordner ''backup''. * ''mv ordner1 ordner2/.'' verschiebt den Ordner ''ordner1'' mitsam allem Inhalt in den Ordner ''ordner2''. ==== rm (remove) ==== ''rm'' löscht Dateien. Mit Vorsicht zu gebrauchen. Die Dateien werden dabei **nicht in den Papierkorb verschoben**, d.h. die Löschung ist unwiderruflich. ==== unzip (zip-Datei entpacken) ==== unzip dateiname.zip Entpackt die Datei in ''dateiname.zip'' ins aktuelle Verzeichnis. ==== zip (Verzeichnis inklusive Unterverzeichnisse in eine zip-Datei zusammenpacken) ==== zip -r paeckchen.zip verzeichnisname Packt das Verzeichnis '''verzeichnisname'' inklusive aller Unterverzeichnisse (wegen ''-r'' für rekursiv) in eine Zip-Datei namens ''paeckchen.zip''. ACHTUNG: Das Verzeichnis (= die Quelle) steht hier am Ende des Befehls (als letztes Argument), das Ziel ist das erste Argument. ==== notepad (Text-Editor) ==== Normalerweise startet ''notepad'' den Windows Text-Editor "Notepad", der aber sehr limitiert ist. Wir haben ein ''alias'' definiert, damit mit diesem Befehl ''notepad++'' gestartet wird. Damit können auch gleich Dateien geöffnet werden, indem diese auf der Kommandozeile als Argumente angegeben werden. Z.B. * ''notepad .bashrc'' öffnet die Datei .bashrc im aktuellen Ordner (und bietet an, diese anzulegen, falls sie nicht existiert) * ''notepad *.txt'' öffnet alle Dateien, deren Namen mit ''.txt'' enden. ===== alias (Kurznamen für Befehle) ===== Der Befehl ''alias'' bietet sich an, um eigene Kommandos zusammenzustellen. * ''alias'' ohne Argumente zeigt alle definierten Aliases an. * ''alias ofi='cd /c/ofi4XXX/' '' definiert den Befehl ''ofi'' als den Wechsel ins Verzeichnis ''/c/ofi4XXX''. Ergänzen Sie das obige ''ofi''-Alias wie folgt am Ende der Datei ''~/.bashrc'': * Öffnen Sie die Datei aus der bash per ''notepad ~/.bashrc'' in NotePad++. * Ergänzen Sie am Ende der Datei die Zeile ''alias ofi='cd /c/ofi4XXX' ''. * Speichern Sie die Datei und schliessen Sie NotePad++. * Mit ''source ~/.bashrc'' (in der bash) laden Sie die neue Datei (statt eines Neustarts). Das alias ''ofi'' sollte jetzt definiert und einsatzbereit sein. Probieren Sie es aus. ====== Adventure auf der bash Kommandozeile ====== * Speichern Sie die folgende Zip-Datei in ''C:\ofi4XXX\'' (mit Link speichern unter){{lehrkraefte:blc:informatik:glf22:adventurequest.zip}}. * Öffnen Sie git-bash und navigieren Sie in dieses Verzeichnis mit dem Alias ''ofi'' oder ausführlich per ''cd /c/ofi4XXX''. * Überprüfen mit dem Kommando ''ls'', ob die zip-Datei auch dort liegt. * Entpacken Sie das zip-Archiv mit ''unzip adventurequest.zip'' * Überprüfen Sie wieder mit ''ls'', ob auch ein neues Verzeichnis entstanden ist. * Wechseln Sie in das neue Verzeichnis mit ''cd adventurequest'' Tab Enter. * Starten Sie den Guide mit ''python guide.py''. * Nach jeder erledigten Aufgabe: Kehren Sie in das Verzeichnis ''adventurequest'' zurück und starten Sie den Guide mit ''python guide.py'', bis alle Aufgaben erledigt sind. Versuchen Sie die gestellten Aufgaben zu lösen. Schauen Sie sich ruhig mit ''ls'' um. Verwenden Sie ''cd ordnername'', um in einen Unterordner zu wechseln, und ''cd ..'' um wieder zurückzugelangen (also in den übergeordneten "Eltern-Ordner"). **Hinweis**: Die letzte Aufgabe (alle Bibliotheken ausrüsten) ist sehr anspruchsvoll. Folgendes Script ruft den Befehl ''echo'' (einfach ausgeben, was danach folgt) für jedes Verzeichnis auf: for verzeichnis in */; do echo "Etwas mit $verzeichnis machen"; done * Ändern Sie zuerst das Suchmuster ''*/'' so ab, dass nur die relevanten Verzeichnisse durchlaufen werden. * Ändern Sie dann das, was ''echo'' ausgibt, so ab, dass ''echo'' das gewünschte Kommando ausgibt. * Ersetzen Sie dann ''echo "..."'' durch das Kommando.