======Einführung in die Linuxshell====== Die **Shell** (Terminal, Kommandozeile, Befehlszeile) ist ein Befehlsinterpreter im Linux-System. Befehle werden in Textform eingegeben und durch drücken der ENTER-Taste ausgeführt. Die Linuxshell ist vergleichbar mit der Eingabeaufforderung in Windows, aber weitaus mächtiger als diese. Viele Arbeiten in einem Linuxsystem lassen sich mit der Shell viel effektiver durchführen, als mit grafischen Tools. =====Basics===== ====Shell-Prompt==== Wenn man die Shell startet, steht vor dem Befehl dass Shell-Prompt, aus dem sich bestimmte Informationen ablesen lassen. user@linux:~$ * **user** Nutzername des angemeldeten Nutzers * @ - "auf" * **linux** - Recchnername * ~ gibt das Verzeichnis an (~ ist eine Abkürzung für das Homeverzeichnis /home/user) * $ - Es handelt sich um einen ganz normalen Nutzer ohne Administrator-Recchte Das Shell-Prompt für den Administrator (root) sieht so aus: root@linux:~# ====Kommandos==== **Kommandos** oder **Befehle** sind ausführbare Dateien (Programme, Scripte). Damit sie ausgeführt werden können müssen sie im Suchpfad liegen bzw. muss man den vollständigen Pfad angeben. Kommandos können Übergabeparameter und Optionen haben. Schauen wir uns das Kommando ls an: **ls** - listet die Dateien und Ordner in einem Verzeichnis auf //Optionen:// -l Langform, -a auch versteckte Dateien werden angezeigt //Parameter:// das Verzeichnis **Beispiele:** user@linux:~$ ls [] user@linux:~$ ls -l [] user@linux:~$ ls -a [] user@linux:~$ ls -la [] user@linux:~$ ls -la /home/ [] Um sich alle Optionen des Befehls des Befehls ls anzeigen zu lassen kann man den Befehl man benutzen: user@linux:~$ man ls **Autovervollständigung** Wenn man nicht genau weiß, wie der Befehl oder ein Pfad heißt, kann man sich mit der Tab-Taste den Befehl vervollständigen lassen. **Aufgabe 1** Teste alle Beispiele! \\ ====Suchmuster==== In der Shell kann man in den Namen von Parametern einen oder mehrere Zeichen ersetzen. Dadurch erhält man flexible Ausgaben. Der * ersetzt dabei mehrere Zeichen, das ? ein Zeichen. **Beispiele:** user@linux:~$ ls /etc/*tab [] user@linux:~$ ls -l /dev/sd? [] **Aufgabe 2** Teste die Beispiele! \\ ====History==== Alle Befehle, die von einem Benutzer in der Shell ausgeführt werden, werden in der Datei ''%%.bash_history%%'' gespeichert. Der Punkt vor dem Dateinamen gibt dabei an, dass es sich um eine versteckte Datei handelt. Mit den Pfeil nach oben bzw Pfeil nach unten Tasten kann man in diesen Befehlen blättern und sie (eventuell in abgeänderter Form) erneut ausführen. Durch den Befehl ''%%history%%'' kann man sich alle Befehle anzeigen lassen. **Aufgabe 3** Teste dass blättern und führe den Befeh ''%%history%%'' aus! \\ =====Hilfe auf der Kommandozeile===== In der Shell gibt es vielfältige Möglichkeiten, sich Hilfe zu holen. Das Kommando ''%%man%%'' haben wir bereits kennengelernt. **Hilfeoption im Befehl:** Mit user@linux:~$ befehl -h bzw. user@linux:~$ befehl --help kann man sich die Hilfe zu einen Befehl anzeigen lassen. //Beispiel:// user@linux:~$ ls -h [] user@linux:~$ ls --help [] \\ **Manpage** Mit user@linux:~$ man befehl ruft man die Manpage eines Befehls auf. Sie ist meistens ausführlicher als die interne Hilfe. //Beispiel:// user@linux:~$ man ls [] \\ **Infoseite** Noch ausführlicher als die Manpage ist die Infoseite zu einem Befehl: user@linux:~$ info befehl //Beispiel:// user@linux:~$ info ls [] \\ **Der Befehl apropos** Mit dem Befehl "aprops" kann man sich alle Befehle anzeigen lassen, die mit einem bestimmten Thema zu tun haben. Im Beispiel werden alle Befehle angezeigt, die mit kopieren zu tun haben. user@linux:~$ apropos ls [] \\ **Der Befehl whatis** Mit ''%%whatis%%'' kann man sich die Kurzbeschreibung eines Befehls anzeigen lassen. //Beispiel:// user@linux:~$ whatis ls [] **Aufgabe 4** Teste die Beispiele! \\ =====Das Linux-Dateisystem===== ====Aufbau==== Im Unterschied zu Windows gibt es unter Linux keine Laufwerksbuchstaben. Auf einen Datenträger (z.B. auf einer internen Festplatte) befindet sich das Wurzeldateisystem (root). In dieser Wurzel befinden sich die wichtigsten Systemordner. (Siehe Abbildung!) {{:profil:klasse9:dateisystem.png?600|}} Weitere Datenträger (Festplatten, USB-Sticks, DVD-Laufwerke) können in dieses Dateisystem eingehängt (gemountet) werden. Wechseldatenträger erscheinen dabei meist im Ordner /media. Im Ordner /home befinden sich die Nutzerverzeichnisse. In diesen Verzeichnissen haben die Nutzer jeweils alle Rechte. In den Übrigen Verzeichnissen (außer /var und /tmp) darf nur ein Systemadministrator Änderungen vornehmen. ====Relative und absolute Pfade==== Mit dem Befehl user@linux:~$ pwd /home/user kann man sich das aktuelle Verzeichnis Verzeichnis anzeigen lassen. **Der Befehl cd** Mit dem Befehl **cd** kann man in ein bestimmtes Verzeichnis des Dateisystems wechseln. Dabei sind Abkürzungen möglich. //Beispiele:// user@linux:~$ cd /home/user/Dokumente user@linux:~/Dokumente$ pwd /home/user/Dokumente Mit diesem Befehl wechselt man ins Verzeichnis ''%%/home/user/Dokumente%%''. Wie man sieht erscheint jetzt am Prompt ''%%~/Dokumente%%''. Die Tilde ''%%~%%'' ist eine Abkürzung für das Homeverzeichnis des Nutzers. user@linux:~/Dokumente$ cd ~ user@linux:~$ pwd /home/user Gehen wir nun in ein anderes Verzeichnis: user@linux:~$ cd /usr/bin user@linux:/usr/bin$ pwd /usr/bin Wie man sieht, wird jetzt im Prompt das vollständige Verzeichnis angegeben. Weitere Abkürzungen für Verzeichnisse sind der Punkt ''%%.%%'' für das aktuelle Verzeichnis und zwei Punkte für das übergeordnete Verzeichnis. user@linux:/usr/bin$ cd .. user@linux:/usr/$ pwd /usr user@linux:/usr/$ cd . user@linux:/usr/$ pwd /usr **Aufgabe 5** Teste die Beispiele! Ersetze ''%%user%%'' durch deinem Benutzernamen! \\ Unter einem **Pfad** versteht man den Weg von einem Punkt im Dateisystem zu einen anderen. Zu jedem Ort im Dateisystem kommt man, indem man den Pfad von der Wurzel aus angibt. Einen solchen Pfad nennt man einen **absoluten Pfad**. Wenn man von einem Punkt des Dateisystems in ein Unterverzeichnis dieses Punkts möchte, muss man nicht den vollständigen Pfad angeben. Eine solche Pfadangabe nennt man **relativen Pfad**. //Beispiel// user@linux:~$ cd /home/user/Dokumente user@linux:~/Dokumente$ pwd /home/user/Dokumente user@linux:~$ cd Dokumente user@linux:~/Dokumente$ pwd /home/user/Dokumente In relativen Pfaden kann man auch die Abkürzungen ''%%..%%'', ''%%.%%'' und ''%%~%%'' nutzen. //Beispiel// user@linux:~$ cd ./Dokumente user@linux:~/Dokumente$ pwd /home/user/Dokumente **Aufgabe 6** Teste die Beispiele! Ersetze ''%%user%%'' durch deinem Benutzernamen! **Aufgabe 7** Finde mindestens drei Möglichkeiten, um mit dem Befehl **cd** vom Verzeichnis ''%%/home/user%%'' ins Verzeichnis ''%%/home/user/Downloads%%'' zu kommen. Ersetze ''%%user%%'' durch deinem Benutzernamen! =====Erstellen, Löschen und Verschieben von Dateien===== ====Dateien und Verzeichnisse erstellen==== mit dem Befehl ''%%touch%%'' lässt sich der Zeitstempel einer Datei ändern. Man kann ihn aber auch nutzen, um eine neue Datei anzulegen. //Beispiel:// Zunächst soll mit ''%%ls%%'' eine Textdatei angezeigt werden, die noch nicht existiert: user@linux:~$ ls datei.txt ls: Zugriff auf 'datei.txt' nicht möglich: Datei oder Verzeichnis nicht gefunden Nun wird die Datei mit ''%%touch%%'' angelegt und mit ''%%ls%%'' angezeigt: user@linux:~$ touch datei.txt user@linux:~$ ls datei.txt datei.txt Mit dem Befehl ''%%mkdir%%'' kann man Verzeichnisse anlegen. Wenn dass Verzeichnis schon existiert, wird, im Gegensatz zu ''%%touch%%'' eine Fehlermeldung angezeigt. (Mit -ld wird der Inhalt des Verzeichnisses in Langform angegeben.) //Beispiel:// user@linux:~$ ls -ld dir ls: Zugriff auf 'dir' nicht möglich: Datei oder Verzeichnis nicht gefunden user@linux:~$ mkdir dir user@linux:~$ ls -ld dir drwxrwxr-x 2 user user 4096 Mär 9 10:50 dir user@linux:~$ mkdir dir mkdir: das Verzeichnis »dir“ kann nicht angelegt werden: Die Datei existiert bereits Wenn man bei ''%%mkdir%%'' die Option -p verwendet, kann man auch verschachtelte Verzeichnisse anlegen. user@linux:~$ mkdir -p dir1/dir2/dir3 user@linux:~$ ls -ld dir1 drwxrwxr-x 3 user user 4096 Mär 9 12:44 dir1 user@linux:~$ ls -ld dir1/dir2 drwxrwxr-x 3 user user 4096 Mär 9 12:44 dir1/dir2 user@linux:~$ ls -ld dir1/dir2/dir3 drwxrwxr-x 2 user user 4096 Mär 9 12:44 dir1/dir2/dir3 **Aufgabe 8** Teste die Beispiele! **Aufgabe 9** Lege in deinem Homeverzeichnis auf der Kommandozeile die folgende Ordnerstruktur an: {{ :profil:klasse9:inf1_au2.png?600 |}} Erstelle auf der Kommandozeile im Ordner Deutschland die Datei berlin.txt und im Ordner Frankreich die Datei paris.txt. ====Dateien und Verzeichnisse kopieren==== Mit dem Kommando ''%%cp%%'' kann man Dateien und Ordner kopieren. ''%%cp%%'' erfordert mindestens zwei Argumente "Quelle" und "Ziel". Wenn man ''%%cp%%'' ohne zusätzliche Argumente verwendet, muss die Quelle eine Datei (kein Verzeichnis) sein. Wenn das Ziel eine Datei ist, entstehen zwei identische Dateien mit unterschiedlichen Namen. Wenn das Ziel ein Verzeichnis ist, wird die Quelldatei unter denselben Namen in dem Verzeichnis abgespeichert. //Beispiele:// user@linux:~$ touch quelldatei.txt user@linux:~$ cp quelldatei.txt zieldatei.txt $\rightarrow$ Es entsteht eine zur Datei quelldatei.txt identische Datei zieldatei.txt. user@linux:~$ touch quelldatei.txt user@linux:~$ cp quelldatei.txt Dokumente $\rightarrow$ Die Datei quelldatei.txt wird in den Ordner Dokumente kopiert, der Name bleibt erhalten. Wenn man ''%%cp%%'' mit mehr als zwei Argumenten ohne Optionen verwendet, muss das letzte Argument ein Verzeichnis sein, alle anderen Argumente müssen Dateien sein. Die Dateien werden dann in das Verzeichnis kopiert. Ihre Namen ändern sich nicht. //Beispiel:// user@linux:~$ touch q1.txt user@linux:~$ touch q2.txt user@linux:~$ touch q3.txt user@linux:~$ cp q1.txt q2.txt q3.txt Dokumente $\rightarrow$ Die Dateien q1.txt, q2.txt und q3.txt werden in den Ordner Dokumente kopiert. Wenn man ganze Ordner kopieren möchte, muss man ''%%cp%%'' mit der Option ''%%-r%%'' aufrufen. //Beispiel:// user@linux:~$ mkdir kopierverzeichnis user@linux:~$ touch kopierverzeichnis/quelldatei.txt user@linux:~$ cp -r kopierverzeichnis Dokumente $\rightarrow$ Der Ordner kopierverzeichnis wird mit Inhalt in den Ordner Dokumente kopiert. **Aufgabe 10** Arbeite den Abschitt Dateien und Verzeichnisse kopieren durch und teste die Beispiele! **Aufgabe 11** * Kopiere die Datei berlin.txt aus Aufgabe 9 in den Ordner Dokumente! * Kopiere die Datei berlin.txt aus Aufgabe 9 unter den Namen peking.txt in den Ordner China. * Kopiere den Ordner Erde mit Inhalt in den Ordner Dokumente. ====Löschen von Dateien und Verzeichnissen==== Eine einzelne Datei kann man mit dem Befehl ''%%rm%%'' löschen. Ein leeres Verzeichnis löscht man mit dem Befehl ''%%rmdir%%''. Ein Verzeichnis mit Inhalt löscht man mit dem Befehl ''%%rm -r%%''. //Beispiele:// user@linux:~$ rm quelldatei.txt user@linux:~$ rmdir dir user@linux:~$ rm -r dir1 **Aufgabe 12** Teste die Beispiele! Lösche alle Dateien und Ordner, die du in den Aufgaben 8 bis 11 angelegt und kopiert hast möglichst geschickt. =====Weitere wichtige Befehle===== **find** Mit dem Befehl ''%%find%%'' kann man Verzeichnisse nach Dateien durchsuchen. find erwartet als Argument ein Verzeichnis, dass durchsucht werden soll und danch eine Option, was mit der Datei passieren soll. //Mögliche Optionen:// ''%%-name%%'' - listet die gefundenen Dateien auf ''%%-delete%%'' - löscht die gefundenen Dateien ''%%-exec%%'' - führt Programme aus, an die die gefundenen Dateinen übergeben werden. //Beispiele:// user@linux:~$ find /etc -name "fs*" ... **grep** ''%%grep%%'' filtert einzelne Zeilen aus Textdateien. //Beispiel:// user@linux:~$ grep root /etc/passwd root:x:0:0:root:/root:/bin/bash **less** Das Programm ''%%less%%'' gibt Text (z.B. eine Textdatei) seitenweise aus. Dabei kann man in den Text suchen und blättern. Mit ''%%q%%'' beendet man die Ausgabe. user@linux:~$ less /var/log/syslog **head und tail** Das Programm ''%%head%%'' gibt standardmäßig die ersten 10 Zeilen einer Textdatei aus. Mit der Option ''%%-n%%'' kann man auch eine andere Zeilenanzahl ausgeben. Das Programm ''%%tail%%'' gibt standardmäßig die letzten 10 Zeilen einer Textdatei aus. Mit der Option ''%%-n%%'' kann man auch eine andere Zeilenanzahl ausgeben. Mit der Option ''%%-f%%'' ändert sich die Ausgabe in Echtzeit. user@linux:~$ head -n 5 /etc/passwd ... user@linux:~$ tail -f /var/log/syslog ... **sort** Mit dem Programm ''%%sort%%'' kann man Eingaben, Ausgaben oder den Inhalt von Dateien sortiert ausgeben. Standartmäßig wird alphabetisch sortiert. Mit der Option ''%%-r%%'' kann man rückwärts sortieren. //Beispiel:// user@linux:~$ sort /etc/passwd ... **cut** Manche Textdateien haben auch einen spaltenartigen Aufbau. Mit dem Programm ''%%cut%%'' kann man bestimmte Spalten einer Textdatei ausgeben. //Beispiel:// user@linux:~$ cut -d: -f1 /etc/passwd ... Der Parameter ''%%-d%%'' gibt das Trennzeichen (in diesem Fall der Doppelpunkt) zwischen den Spalten an, der Parameter ''%%-f%%'' gibt die Nummer (in diesem Fall die 1. Spalte) der Spalte an. **wc** Das Programm ''%%wc%%'' ("word count) kann man zum Zählen von Wörtern (''%%-w%%''), Zeilen (''%%-l%%'') und Zeichen(''%%-m%%'') benutzen. //Beispiel:// user@linux:~$ wc -w /etc/passwd ... user@linux:~$ wc -l /etc/passwd ... user@linux:~$ wc -m /etc/passwd ... **Aufgabe 13** Teste die Beispiele! **Aufgabe 14** Gegeben ist eine Textdatei {{ :profil:klasse9:cbp19cd.zip |}} ((Quelle: https://danielpeters.eu/quellen-fuer-grosse-csv-dateien.html)). Lade Sie herunter und entpacke sie! * a) Gib alle Zeilen der Datei auf der Kommandozeile aus, in denen das Wort Alabama vorkommt. * b) Lass dir die Datei mit ''%%less%%'' anzeigen! * c) Gib die Datei sortiert aus! * d) Gib die zweite Spalte der Datei aus! (Trennzeichen ,) * e) Zähle Wörter, Zeilen und Zeichen der Datei! =====Ein- und Ausgabe-Umleitungen===== Einige Kommandos können ihre Ausgabe in eine Datei umleiten (>) oder Informationen aus einer Datei einlesen (<). Im folgenden wird die Ausgabe des Kommandos ''%%ls%%'' in die Datei test.txt umgeleitet. Anschließend wird die Datei test.txt vom Kommando ''%%wc%%'' eingelesen und die Zeichen werden gezählt. user@linux:~$ ls > test.txt user@linux:~$ wc -m < test.txt ... Wenn man an Stelle von einem größer als > zwei größer als >> benutzt, wir die Ausgabe an eine vorhandene Datei angehängt: user@linux:~$ date > datum.txt user@linux:~$ date >> datum.txt user@linux:~$ date >> datum.txt user@linux:~$ cat datum.txt ... =====Pipes===== Mehrere Befehle können durch das Pipe-Zeichen verknüpfen. Dabei wird die Ausgabe des einen Befehls als Eingabe für den zweiten Befehl verwendet. Im Beispiel wird die Ausgabe des Befehls ''%%ls%%'' als Eingabe für den Befehl ''%%wc%%'' verwendet. user@linux:~$ ls | wc -m ... **Aufgabe 15** * a) Leite die ersten 15 Zeilen der Datei cbp19cd.txt in eine Datei uebung.txt um! * b) Hänge an die Datei das aktuelle Datum an! * c) Gib mit ''%%cut%%'' die 3.Spalte der Datei aus und leite die Ausgabe über eine Pipe an ''%%wc%%'' weiter, so dass die Worte gezählt werden! * d) Leite die Ausgabe der ''%%history%%'' an den Befehl ''%%grep%%'' weiter und gib alle Zeilen aus, in denen der Befehl ''%%ls%%'' verwendet wurde!