Zum Inhalt

Woche 1

Themen der Woche 1

  • Was ist Linux und was ist Unix?
  • Was bedeuten die Begriffe Terminal, Shell, Terminalemulator und Konsole?
  • Wie findet man sich in der Kommandozeile zurecht?
  • Wie ist ein Kommando aufgebaut?
  • Welche sind die wichtigsten Kommandos?

GUI Desktop Tastenkombinationen

Strg + C
Strg + D
Strg + Shift + C        in das Clipboard kopieren
Strg + Shift + V        aus dem Clipboard einfügen
Strg + L                Bildschirm leeren
Strg + Alt/Shift + T    Terminalfenster öffnen (Alt oder Shift sollte funktionieren)
Tab                     automatische Vervollständigung
Pfeiltasten oben/unten  zuletzt benutze Befehle
man <befehl>            öffnet das Manual für den entsprechenden Befehl

Beispiel für eine Package Installation

Das Programm sl (steam locomotive - Dampflokomotive) wird folgendermaßen installiert.

sudo apt install sl

Ruft man dann sl auf

/usr/games/sl

sieht man eine Lokomotive über den Bildschirm fahren:

sl

Hinweis: in der Regel ist das Verzeichnis /usr/games nicht im Suchpfad der Shell. Will man nur den Programmnamen ohne Pfad beim Aufruf angeben, gibt es zwei Möglichkeiten:

Den Suchpfad der Shell erweitern:

PATH=$PATH:/usr/games

Ein alias für das Programm anlegen

alias sl='/usr/games/sl'

Debian Paktetverwaltung

Weiß man nicht genau, in welchem Debian Paket ein Programm enthalten ist, kann man das Pakte mit Hilfe der Debian-Paketsuche

Warum gibt es die Einträge . und .. in einem Verzeichnis?

In jedem Verzeichnis gibt es die beiden Einträge . und .. :

.   verweist auf das aktuelle Verzeichnis
    cd .  :  es ändert sich nicht, ich befinde mich immer 
             noch im gleichen Verzeichnis
..  verweist auf das übergeordnete Verzeichnis (parent directory)
    cd .. : ich wechsele in das übergeordnete Verzeichnis

Verzeichniseintrag ..

Angenommen ich befinde mich derzeit im Verzeichnis /home/openhpi/linux_cli und gebe dort die folgenden Kommandos ein ($ ist das Prompt (Eingabeaufforderung) der Shell. Die Zeichen nach dem $ sind die Eingaben, die Zeilen ohne $ am Anfang sind die Ausgaben)

$ pwd
/home/openhpi/linux_cli
$ find week1-dir -type d -print
week1-dir
week1-dir/dir3
week1-dir/dir2
week1-dir/dir2/.hidden
week1-dir/dir1
$ cd week1-dir/dir1
$ pwd
/home/openhpi/linux_cli/week1-dir/dir1

Jetzt möchte ich in das Verzeichnis /home/openhpi/linux_cli/week1-dir. Die folgenden cd Kommandos kann man dazu nicht verwenden.

$ cd - : wechsele zurück in das letzte Verzeichnis (_/home/openhpi/linux_cli_)
$ cd   : wechsele in das Homeverzeichnis der Kennung  (_/home/openhpi_)

D.h. ich muss das folgende eingeben:

$ cd /home/openhpi/linux_cli/week1-dir

Mit Hilfe des Verzeichniseintrags .. kann ich aber kurz schreiben

$ cd ..

Vorteil: erstens ist diese Schreibweise kürzer - aber viel wichtiger: ich brauche dabei den Namen des Verzeichnisses, in das ich wechseln will, nicht kennen.

Kuriose Ausnahme

Das Rootverzeichnis / eines Dateisystems enthält auch die Einträge . und .. In diesem Fall verweisen sowohl . als auch .. auf /

Verzeichniseintrag .

Der nutzen von .. sollte einigermaßen klar sein.

Frage: warum braucht man den Eintrag . ?

Beispiel: in meinem aktuellen Verzeichnis gibt es die ausführbare Datei hallo, die beider Ausführung Hallo ausgibt.

Wenn ich den Namen einfach als Kommando in die Shell eingebe, passiert das Folgende:

$ hallo
-bash: hallo: command not found

Warum ist das so?
Die Shell interpretiert hallo als auszuführendes Kommando. Das es kein in die Shell eingebautes Kommando ist, muss sie wissen, wo im Dateisystem die Datei zu finden ist. Dazu benutzt die Shell die Variable PATH

$ echo $PATH
/usr/local/bin:/usr/bin:/bin

Hier kann man mehrere durch : getrennte Verzeichnisse angeben. Im obigen Beispiel würde die Shell in der folgenden Reihenfolge nach der Datei hallo suchen:

  • /usr/local/bin/hallo
  • /usr/bin/hallo
  • /bin/hallo

Dabei gilt: der erste Treffer wird ausgeführt. Man kann natürlich das akutelle Verzeichnis, in dem man sich befindet, zur Variabeln PATH hinzufügen:

$ PATH="$PATH:$(pwd)"
Aber das ist natürlich nicht immer sinnvoll.

Will man wissen, wo im Pfad ($PATH) das Kommando gefunden wurde, kann man das Kommando type nutzen:

$ type ls
ls is hashed (/bin/ls)

Nächster Versuch:

$ bash hallo
Hallo

Sieht gut aus, es kann aber auch das Folgende passieren:

bash hallo
hallo: hallo: cannot execute binary file

Warum?
Beim Aufruf

$ bash hallo

erwartet die Bash, das die Datei hallo ein Bash Skript enthält.

Von welchem Typ meine ausführbare Datei ist (Shell Skript oder Programm), sieht man mit dem folgenden Kommando:

$ file hallo
hallo: Bourne-Again shell script, ASCII text executable
$ file hallo
hallo: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=1dc10461ed0684ca195d2712ba9a0205d2989543, for GNU/Linux 3.2.0, not stripped

Ohne den Typ zu kennen, müsste man das Skript/Programm folgendermaßen aufrufen:

$ /home/openhpi/linux_cli/week1-dir/dir1/hallo
Hallo

Mit Hilfe des builtin Kommandos pwd in der Shell geht das auch so:

$ $(pwd)/hallo
Hallo

Da . auf das aktuelle Verzeichnis verweist, kann man aber auch einfach das Folgende aufrufen:

$ ./hallo
Hallo

Sollen immer alle ausführbaren Dateien im aktuellen Verzeichnis von der Shell gefunden werden, kann man die Variable PATH folgendermaßen erweitern:

$ PATH="$PATH:."

Bleibt noch die Frage, warum

$ ./hallo

als Bash Skript ausgeführt wird.

Lösung: die Datei Datei sieht folgendermaßen aus:

$ cat hallo
#!/bin/bash
#
echo "Hallo"

Wichtig ist hierbei die erste Zeile:

#!/bin/bash

Diese Zeile wird als Shebang bezeichnet.

Die Shell nimmt in diesem Fall an, dass die Zeichenkette nach "#!" ein Kommando ist. Die Shell ruft dieses Kommando auf und übergibt den Rest der Datei an das Kommando.

Weitere Informationen

Daten für die Praktische Übung 1.9

Die Daten für die Praktische Übung 1.9 habe ich hier abgelegt:

Auspacken der TAR Datei:

tar xvf week1-dir.tar.gz
finden.

Zusammenfassung der Woche 1

Linux verwendet, ähnlich wie Windows, ein Dateisystem mit Verzeichnissen und Dateien.

Loggt man sich and der Console ein, oder öffnet in einer GUI ein Terminalfenster befindet man sich im sogenannten Homeverzeichnis der Kennung. Das Verzeichnis, in dem man sich gerade befindet, kann man sich mit dem Kommando pwd ansehen:

$ pwd
/home/openhpi

Mit dem Kommando cd kann man das Verzeichnis wechseln.

$ cd linux_cli
$ pwd
/home/openhpi/linux_cli

Es gibt 3 spezielle Möglichkeiten, das Kommando cd zu nutzen:

cd   : wechsel in das Homeverzeichnis
cd ~ : wechsel in das Homeverzeichnis
cd - : wechsel in das letzte Verzeichnis

Beispiel:

$ pwd
/home/openhpi
$ cd linux_cli
$ pwd
/home/openhpi/linux_cli
$ cd
$ pwd
/home/openhpi
$ cd linux_cli
$ pwd
/home/openhpi/linux_cli
$ cd ~
$ pwd
/home/openhpi
$ cd linux_cli
$ pwd
/home/openhpi/linux_cli
$ cd week1-dir
$ pwd
/home/openhpi/linux_cli/week1-dir
$ cd -
/home/openhpi/linux_cli
$ pwd
/home/openhpi/linux_cli

Die in einem Verzeichns vorhandenen Verzeichnisse/Dateien kann man sich mit dem Kommando ls ansehen.

In Linux gibt es eine Reihe von Rechte im Dateisystem. Diese Rechte kann man mit dem Kommando chmod verändern.

Zur Installation von Programmen benötigt man eine Administratorberechtigung. In einer Desktop Linux Umgebung ist in der Regle mindestens ein Benutzer so konfiguriert, dass er das Programm sudo aufrufen kann. Dieser Benutzer kann das Software auf dem Rechner installieren.

Beispiel:

sudo apt install fortune

Letztes Update: 2022-02-16