Bash-Workshop

2021-10-14

Marcus Ganske - Fachschaft Informatik

Was wir machen

  • Navigation
  • Datei anlegen/löschen/umbenennen
  • Dateiinhalt ausgeben
  • Ein-/Ausgabeumlenkung
  • Suchen, Bytes zählen, sortieren und ausschneiden
  • Zugriffsrechte
  • Hilfe bekommen
  • Archive
  • Prozesse
  • inode
  • Aliasing
  • Quoting

Was wir nicht machen

  • Schleifen
  • Conditionals
  • Variablen
  • Bash-Skripting
  • alles andere was fancy ist

Das Wichtigste in unixartigen Systemen ist: alles ist eine Datei!

Wie ist das Dateisystem aufgebaut und wie komme ich von A nach B?

Vorspiel: Pfade

absolut relativ
vom Wurzelverzeichnis (root /) aus vom aktuellen Verzeichnis aus
  • / → Root /Wurzelverzeichnis
  • /bin → Grundlegende ausführbare Dateien und Befehle
  • /boot → Bootloader, statische Dateien
  • /dev → Gerätedateien
  • /etc → Systemkonfigurationsdateien
  • /home → Benutzerverzeichnis: Eigene Dateien, Konfigurationen
  • /lib → Kernel-Module und dynamische Bibliotheken
  • /media → Mountpoint für Datenträger
  • /opt → Optionale / Eigene Softwarepakete
  • /tmp → Temporäre Dateien
  • /var → Variable Daten (z.B. Logdaten, Spool-Verzeichnisse)

Wo bin ich eigentlich?

  • $ pwd
    • "print working directory"
    • gibt das aktuelle Verzeichnis als absoluten Pfad aus

Hilfe?

Hilfe

  • $ <Befehl> -h oder <Befehl> --help gibt meistens eine Übersicht über die Verwendung und Optionen an
  • Ausführlicher sind die Manpages
    • manual pages
    • man <Befehl>
    • von den Standardprogrammen hat so gut wie jedes eine Manpage

Ich weiß jetzt, wo ich bin, aber was gibt es hier?

  • $ ls [Optionen] [Datei]
    • list
    • gibt den Inhalt des angegebenen Verzeichnisses aus
    • ist kein Verzeichnis angegeben, wird das aktuelle Verzeichnis gewählt
    • nützliche Optionen:
      • -l: ausführliche Ausgabe
      • -a: zeigt auch versteckte Dateien an
      • -h: "human readable" - Zeigt Dateigrößen gerundet mit Suffix an

und wie komme ich jetzt in die Verzeichnisse, die ich so sehe?

  • $ cd <Verzeichnis>
    • "change directory"
    • wechselt in das angegebene Verzeichnis (duh!)
    • ohne Angabe eines Verzeichnisses wird in das eigene Homeverzeichnis gewechselt
    • $ cd .. wechselt ins Oberverzeichnis

Datei anlegen/löschen/umbenennen und so Zeugs

Was kann ich denn hier so machen?

Dann mach ich mal neues Zeug, wie geht das?

  • $ mkdir [Optionen] <Verzeichnisname>
    • "make directory"
    • erstellt ein neues Verzeichnis (duh!)
    • nützliche Optionen:
      • -p: "parent" - erzeugt ganze Vereichnisstruktur
  • $ touch [Optionen] [Datei]
    • ändert den Zugriffszeitstempel von Dateien
    • Ist die Datei nicht vorhanden, wird sie als leere Datei angelegt

Kann ich eine Datei kopieren?

  • $ cp [Optionen] <Quelldatei> <Zieldatei>
    • copy
    • nützliche Optionen:
      • -r: "recursive" - kopiert ein ganzes Verzeichnis

Ich hab' mich beim Dateinamen verschrieben, wie kann ich das umbenennen?

  • $ mv [Optionen] <Quelldatei> <Zieldatei>
    • move
    • "Wir nehmen die Datei und schieben sie woanders hin"

Ich bin grade auf einem Zerstörungstrip, wie kann ich Dinge löschen?

  • $ rm [Optionen] <Dateiname>
    • remove
    • "File begone!"
    • nützliche Optionen:
      • -r: "recursive" - löscht ein Verzeichnis
      • -f: "force" - löscht das Ziel ohne Nachzufragen

-f ist gefährlich! Wir sind hier nicht im Microsoft-Kindergarten wo 174516x nachgefragt wird, ob ihr die Datei wirklich löschen wollt. Sobald ihr <Enter> drückt, ist die Datei weg. Bemerkt ihr dann, dass es ein Fehler war, ist das Pech. So lässt sich super schnell das System unbrauchbar zerstören

Dateiinhalt ausgeben

Was steht denn in den Dateien drin?

schlecht, aber meist genutzt:

  • $ cat [Optionen] <Datei>
    • concatenate
    • gibt den Inhalt einer Datei auf dem Bildschirm aus
  • Problem: Die Bildschirmausgabe ist nicht gepuffert. Wenn überhaupt, kann nicht mehr als x Zeilen zurückgescrollt werden

besser:

  • $ less [Optionen] <Datei>
    • ist gepuffert, wir können die gesamte Datei vor- und zurückscrollen, wie wir wollen

Mich interessieren nur die ersten/letzten n Zeilen, gibt es da was?

  • head/tail [Optionen] <Dateiname>
    • gibt ohne Option die ersten/letzten 10 Zeilen aus
    • nützliche Optionen: --n <Zahl> oder kurz -<Zahl>: gibt die ersten/letzten \ Zeilen an
      • nur tail: -f "follow" - folgt der Datei und gibt neue letzte Zeilen aus, wenn etwas dazu kommt

Übung

Aufgabe 1:

  • schaut, in welchem Verzeichnis ihr gelandet seid, nachdem ihr euer Terminal geöffnet habt
  • Wechselt in euer Homeverzeichnis
  • lasst euch den Inhalt des Homeverzeichnisses in den verschiedenen Modi kurze/ausführliche Ausgabe bzw. mit und ohne "hidden files" anzeigen.

Aufgabe 2:

  • erstellt in eurem Homeverzeichnis die Verzeichnisstruktur ~/Workshop/test/test1 , ~/Workshop/test/test2
  • legt im Ordner ~/Workshop/test/test1 die Dateien 1, 2 und 3 an.
  • kopiert den Inhalt von ~/Workshop/test/test1 nach ~/Workshop/test/test2
  • löscht die Testordner

Musterlösung

Aufgabe 1:

  • pwd
  • cd ~ funktioniert immer, cd sollte aber auch funktionieren
  • kurze Ausgabe ls, ausführliche Ausgabe ls -l, mit hidden files ls -a mit den Links für . und .. oder ls -A ohne die beiden Links

Aufgabe 2:

Befehle sind vom Homeverzeichnis aus, wenn ihr wo anders seid, müsst ihr den relativen Pfad anpassen

  • mkdir -p Workshop/test/test{1,2}
  • touch Workshop/test/test1/{1,2,3}
  • cp -r Workshop/test/test1 Workshop/test/test2
  • rm -r Workshop/test/

Zugriffsrechte

bei ls -l wird so ein -rwxrwxrwx angezeigt

  • das sind die Zugriffsrechte für die Datei.
  • 3x für owner / group / all other
  • die Rechte sind read, write, execute
  • für Verzeichnisse haben die Zugriffsrechte eine besondere Bedeutung:
    • r: Inhalt anzeigen
    • w: Dateien anlegen und löschen
    • x: in das Verzeichnis wechseln

ich will, dass die Datei mir gehört!

  • $ chown [Optionen] [neuer Besitzer] <Dateiname>
    • change owner
    • ändert den Besitzer der Datei (duh!)
    • nützliche Optionen:
      • -R: "recursive" - für Ordner

ich will, dass niemand außer mir meine super geheime Datei lesen kann, wie schaffe ich das?

  • $chmod [Optionen] <Berechtigung> <Dateiname>
    • change file mode bits
    • Ändert die Zugriffsrechte (duh!)
    • nützliche Optionen:
      • -R: "recursive" - für Ordner und deren Inhalt
    • Berechtigung wird mit dem Buchstabenkürzel(r,w,x) und einem Vorzeichen(+,-) angegeben; Bsp: chmod +x foo.txt

Alternativ kann man auch eine kryptisch anmutende Zahl angeben, z.B. chmod 744 foo.txt

Das ist ein Oktalcode, wir können mit 3 Bit von 0 bis 7 zählen

4 2 1 r w x

Kann ich in Verzeichnissen, die nicht mir gehören was machen?

  • $ sudo [Optionen] <Rest vom Befehl>
    • superuser do oder substitue user do
    • kann Befehle als anderer Benutzer ausführen
    • meist für administrative Zwecke
    • es gibt eine 'sudoers'-Gruppe, in der alle Benutzer stehen, die sudo verwenden dürfen

sandwich.png

Inodes

speichern Metainformationen von Dateien

eine dieser Metainformationen ist der Linkcount.

Was ist ein Link? Kommt auf die Art des Links an.

Es gibt Hardlinks und Softlinks bzw symbolische Links oder Symlinks.

Hardlinks Softlinks
erhöhen Inode-counter erhöhen Inode-counter nicht
ist eine Referenz auf eine Inode ist eine Referenz auf einen Pfad
löschen der Basisdatei ist egal, solange der Inode-counter > 1 ist löschen der Basisdatei führt dazu, dass der Link ins Leere zeigt

und was mach ich jetzt damit?

meistens Pfade abkürzen

  • ln [Optionen] <Ziel> <Linkname>
    • link
    • erstellt einen Hardink zur Zieldatei
    • nützliche Optionen:
      • -s: "symbolic" - macht einen Softlink anstatt eines Hardlinks

Exkurs: Wildcards und Expansions

Wildcards

  • es gibt 3 Wildcards, die hauptsächlich benutzt werden:
    • *
    • ? -[]

* sucht nach beliebigen Zeichen beliebig oft. Es gibt mehrere Möglichkeiten, * zu verwenden.

  1. nach einem bestimmten Dateinamen suchen, bsp. ls -l s* gibt alle Dateien aus, die im aktuellen Verzeichnis mit s beginnen
  2. nach einer bestimmen Endung suchen, bsp. ls -l *.png gibt alle png-Bilder im aktuellen Verzeichnis aus
  3. nach einem bestimmten Schnipsel im Dateinamen suchen, bsp. ls -l *img* gibt alle Dateien aus, bei denen irgendwo im Dateinamen der String "img" vorkommt.

? sucht nach beliebigen Zeichen, und zwar genau einmal pro ?. Auch hier wieder die Möglichkeiten, ? zu verwenden.

  1. ich weiß genau, wie lang der Dateiname ist. Bsp. ls ??pic.jpg gibt alle jpg-Bilder aus, bei denen 2 beliebige Zeichen kommen und dann der String "pic.jpg"
  2. ich weiß, wie die Datei heißt und wie viele Zeichen die Endung hat. Bsp. ls mypic.??? zeigt mir alle Dateien an, die "mypic" heißen und eine Endung mit 3 Zeichen haben
  • [...] geben eine Reihe oder Gruppe von Zeichen an
     - "[xyz]" matcht auf alles, was mit x, y, oder z anfängt
     - "[c-n]" matcht auf alles, was in der Reichweite c bis n anfängt
     - "[B-Pk-y]" matcht auf alles, was in der Reichweite B is P und k bis y anfängt
     - "[a-z0-9]" matcht einen beliebigen Kleinbuchstaben oder eine Ziffer
     - "[^b-d]" matcht auf alles, was **nicht** mit b, c oder d anfängt

Expansion

{} kann für Parameter expansion verwendet werden, wenn Mensch faul ist

  • Bsp Aufgabe 2: mkdir -p Workshop/test/test{1,2} geht schneller
    • wird von der shell auf mkdir -p Workshop/test/test1 mkdir -p Workshop/test/test2 erweitert
  • wenn LaTeX kompiliert wird, wird viel Clutter angelegt
    • rm Vortrag.{aux,log,out,toc} wird von der Shell auf rm Vortrag.aux Vortrag.log Vortrag.out Vortrag.toc erweitert

Übung

Aufgabe 3

  • Erstellt in eurem Workshop-Verzeichnis ein Unterverzeichnis Programme. Setzt die Zugriffsrechte auf dieses Verzeichnis so, dass nur ihr als Besitzer dort Lese-, Schreib- und Ausführungsrechte habt.
  • Erzeugt in eurem Workshop-Verzeichnis einen Verweis (symbolischen Link) mit dem Namen "bin", der auf das Systemverzeichnis /usr/bin verweist.
  • Kopiert aus dem Systemverzeichnis /usr/bin alle Programme, die mit dem Buchstaben l oder z beginnen, in das neu angelegte Verzeichnis hinein. Ermittelt nun die Anzahl der Dateien im Verzeichnis Programme.

Aufgabe 4

  • Legt das Verzeichnis abc und darin die Datei x an. Legt einen symlink „sym“ und einen hardlink „hard“ auf x an.
  • Schreibt einen beliebigen kurzen Text in die Datei x. Löscht x und gebt den Inhalt von hard und sym aus.

Musterlösung

Aufgabe 3

  • mkdir -p Workshop/Programme
    • chmod 700 Workshop/Programme
  • ln -s /usr/bin Workshop/bin
  • cp usr/bin/[lz]* Workshop/Programme/ oder cp Workshop/bin/[lz]* Workshop/Programme/
    • ls -lA Workshop/Programme | wc -l

Aufgabe 4

  • mkdir Workshop/abc -touch Workshop/abc/x
    • ln -s Workshop/abc/x Workshop/sym
    • ln Workshop/abc/x Workshop/hard
  • echo "Hello World" >> Workshop/abc/x
    • rm Workshop/abc/x
    • cat Workshop/abc/hard
    • cat Workshop/abc/sym

Ein- und Ausgabeumlenkung

Datenströme

In Unixartigen OS gibt es 3 Datenströme, die auch durchnummeriert sind:

  • 0 - Standardeingabe stdin (normalerweise Tastatur)
  • 1 - Standardausgabe stdout (normalerweise der Bildschirm)
  • 2 - Standardfehlerausgabe stderr (normalerweise auch Bildschirm)

Datenstromumleitungen

  • Ausgaben können mit > umgeleitet weden, z.B. in eine Datei ( echo foo > bar oder echo foo 1> bar leitet stdout in bar um)
    • oder in einen anderen Datenstrom (cat foo 2>&1 leitet stderr dahin um wo stdout jetzt grade hinzeigt).
  • Die Eingabe kann mit < umgeleitet werden, z.B. der Inhalt einer Datei in ein Programm (cat < bar).
  • Mit >> kann an eine Datei angehängt werden, anstatt sie wie bei > zu überschreiben.
  • Die Pipe | erhält eine Ausgabe eines Programms und leitet diese als Eingabe für ein anderes Programm weiter.
    • Beispiel von meinem lokalen System: ps ax | grep neomutt
  • Die Pipe kann auch durchaus öfter angewendet werden, also Programm1 | Programm2 | Programm3 (...).

suchen, sortieren und ausschneiden

Ich suche Datei xy, wie finde ich die?

  • $ find [Optionen] <Startpfad> <Ausdruck>
    • wir suchen nicht, wir finden
    • find ist sehr mächtig, Manpage anschauen

Ich suche einen bestimmten Text, aber weiß nicht, in welcher Datei oder an welcher Stelle er steht. Muss ich jetzt jede Datei öffnen?

  • $ grep [Optionen] <Muster> <Dateinamen>
    • zeigt Zeilen an, die auf das Muster matchen
    • Manpage ansehen
    • wird oft zusammen mit find verwendet -> Pipe

ich brauche nur einen Teil einer Datei, muss ich das von Hand abtippen?

  • $ cut <Optionen> [Dateinamen]
    • Schneidet aus Zeilen aus
    • Ohne Datei oder wenn die Datei - ist, wird von stdin gelesen
    • nützliche Optionen: -d, --delimiter=DELIM nimmt DELIMITER anstatt TAB zur Feldbegrenzung

die Daten sind ja völlig durcheinander, kann ich die sortieren lassen?

  • $ sort[Optionen] <Dateinamen>
    • sortiert den Inhalt aller angegebenen Dateien und gibt ihn auf stdout aus
    • Ohne Datei oder wenn die Datei - ist, wird von stdin gelesen
    • nützliche Optionen:
      • -u: "unique" - gibt mehrfach vorkommende Zeilen nur einmal aus

Ich muss mindestens x Wörter für eine Übung schreiben, muss ich das von Hand zählen?

  • $ wc [Optionen] <Dateiname>
    • word count
    • zählt Zeilen, Wörter und Zeichen in Dateien
    • nützliche Optionen:
      • -c: zählt Bytes
      • -m: zählt nur Zeichen
      • -l: "lines" - zählt nur Zeilen
      • -w: "words" - zählt nur Wörter

Übung

Aufgabe 5

  • Generiert durch eine geeignete E/A -Umleitung in Ihrem Workshop Verzeichnis eine Datei namens index, welche das Inhaltsverzeichnis des Verzeichnisses Programme (aus Aufg. 3) enthält. Erzeugt analog eine weitere Datei index2, welche das komplette Inhaltsverzeichnis von /usr/bin enthält.
  • Die Inhaltsverzeichnisse index und index2 sollen jeweils nur einen Programmnamen pro Zeile enthalten.
  • Hängt den Inhalt der Datei index2 an die Datei index an. Sortiert die Datei index nach Programmnamen, wobei ihr eine neue Datei index.sortiert erzeugt, die keine Duplikate mehr enthält.
  • Sucht in der Datei index2 nach allen Zeilen, die den Teilstring "ch" enthalten.

  • Gebt aus der /etc/passwd nur den jeweils zweiten und dritten Buchstaben der Home-Verzeichnisse aus, sortiert sie alphabetisch und speichert die ersten 5 Zeilen des Ergebnisses in eine Datei "top5"

Musterlösung

Aufgabe 5

  • ls -1 Workshop/Programme > Workshop/index das in der Option ist eine Eins
    • ls -1 /usr/bin > Workshop/index2 das in der Option ist eine Eins
  • cat Workshop/index2 >> Workshop/index
  • sort -u Workshop/index > Workshop/index.sortiert
  • grep "ch" Workshop/index.sortiert
  • grep "/home" /etc/passwd | cut -d: -f6 | cut -d/ -f3 | cut -b2-3 > Workshop/top5
In [ ]: