Select Git revision
unix-20250324.tex
Peter Gerwinski authored
unix-20250324.tex 19.05 KiB
% unix-20250324.pdf - Lecture Slides on Unix Fundamentals
% Copyright (C) 2013, 2015-2018, 2021-2024, 2025 Peter Gerwinski
%
% This document is free software: you can redistribute it and/or
% modify it either under the terms of the Creative Commons
% Attribution-ShareAlike 3.0 License, or under the terms of the
% GNU General Public License as published by the Free Software
% Foundation, either version 3 of the License, or (at your option)
% any later version.
%
% This document is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this document. If not, see <http://www.gnu.org/licenses/>.
%
% You should have received a copy of the Creative Commons
% Attribution-ShareAlike 3.0 Unported License along with this
% document. If not, see <http://creativecommons.org/licenses/>.
\documentclass[10pt,t]{beamer}
\usepackage{pgslides}
\usepackage{rotating}
\usepackage{pdftricks}
% \usepackage[obeyfamily=false,mathrm=mathsf,textrm=sffamily]{siunitx}
\usepackage{eurosym}
\title{Einführung in Unix}
\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
\date{24.\ März 2024}
\begin{document}
\maketitleframe
\sectionnonumber{U\quad Einführung in Unix}
\begin{frame}
\showsectionnonumber
% \begingroup
% \large\color{structure}%
% \textbf{Angewandte Informatik: wichtiges Werkzeug}
% \par\smallskip
% \textbf{Grundlagen Rechnertechnik: Beispiel für Skriptsprache}
% \par\bigskip
% \endgroup
% \begin{itemize}
% \item[\textbf{U}] \textbf{Einführung in Unix}
\begin{itemize}
\item[U.1] \color{red}Grundkonzepte
\item[U.2] Die Kommandozeile: Grundlagen
\item[U.3] Dateisysteme
\item[U.4] Ein- und Ausgabeströme
\item[U.5] Pipes
\item[U.6] Verzweigungen und Schleifen
% \item[\dots]
\end{itemize}
% \end{itemize}
\end{frame}
\subsectionnonumber{U.1\quad Grundkonzepte}
\begin{frame}
\begin{minipage}[b]{6.5cm}
\showsectionnonumber
\vspace{-\medskipamount}
\showsubsectionnonumber
\end{minipage}
\begin{description}
\addtolength{\leftskip}{-1cm}
\item[1965]
Vorgänger: Multics (Multiplexed Information and Computing Service)\\
"`überladen"'
\item[1970]
Unix: Einfachheit als Grundkonzept
\item[1972]
Umstellung auf neu entwickelte Programmiersprache C
\item[1975]
AT\&T: Unix inkl.\ Quelltext für Universitäten
\item[1977]
Berkeley Software Distribution (BSD)
\item[1983]
GNU-Projekt
\item[1987]
Minix
\item[1991]
Linux
\item[1993]
FreeBSD, NetBSD
\item[1994]
OpenBSD
\item[2000]
Darwin (Mac OS X, Mach-Kernel, BSD-User-Space)
\item[2008]
Android (Linux-basiert)
\end{description}
\end{frame}
\begin{frame}[fragile]
\begin{minipage}[b]{6.5cm}
\showsectionnonumber
\vspace{-\medskipamount}
\showsubsectionnonumber
Unix und C: Einfachheit als Grundkonzept
% \vspace{-\bigskipamount}
\begin{itemize}
\item
Vermeiden von Ausnahmen
\item[\color{lightgray}$\bullet$]
\color{lightgray}Baukastensystem
\end{itemize}
\medskip
\end{minipage}\hspace*{0.5cm}%
\begin{minipage}[b]{5cm}
C: Hauptprogramm\\
= "`normale"' Funktion
\medskip
\begin{lstlisting}[gobble=6]
int main (int argc, char **argv)
{
printf ("Hello, world!\n");
return 0;
}
\end{lstlisting}
\vspace{-\bigskipamount}
\end{minipage}
\bigskip
\bigskip
Unix: übergeordnetes Verzeichnis = "`normales"' Verzeichnis
\medskip
\begin{lstlisting}[style=terminal]
cassini/home/peter/foo> ¡ls -la¿
insgesamt 24
drwxr-xr-x 2 peter peter 4096 Okt 6 13:30 .
drwxr-xr-x 172 peter peter 20480 Okt 6 13:30 ..
cassini/home/peter/foo> ¡cd ..¿
cassini/home/peter>
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\begin{minipage}[b]{6.5cm}
\showsectionnonumber
\vspace{-\medskipamount}
\showsubsectionnonumber
Unix und C: Einfachheit als Grundkonzept
% \vspace{-\bigskipamount}
\begin{itemize}
\item
Vermeiden von Ausnahmen
\item
Baukastensystem
\end{itemize}
\end{minipage}\hspace*{0.3cm}%
\begin{minipage}[b]{6cm}
C: Bibliotheken
\begin{itemize}
\item
Grundfunktionen: \file{libc}
\item
3d-Grafik -- Kernfunktion: \file{libGL}
\item
3d-Grafik -- Utilities: \file{libGLU}
\item
3d-Grafik -- Utility Toolkit: \file{libglut}
\item
\dots
\end{itemize}
\vspace*{-0.5cm}
\end{minipage}
\bigskip
\bigskip
Unix: Programme arbeiten zusammen
\medskip
\begingroup\small
\begin{lstlisting}[style=terminal]
cassini/home/peter/bo> ¡find . -name "*klausur*.tex" \
| grep -v "fig" | less¿
./2013ss/net/script/slides/net-probeklausur-20120712.tex
./2013ss/net/20130924.0/net-klausur-20130924.tex
./2011ws/rarch/20120322.0/rarch-klausur-20120322.tex
...
./2012ss/hs/20130318.0/hs-klausur-20130318.tex
./2012ss/hs/20120715.0/hs-probeklausur-20120715.tex
./2012ss/hs/20120720.0/hs-klausur-20120720.tex
\end{lstlisting}
\endgroup
\end{frame}
\subsectionnonumber{U.2\quad Die Kommandozeile: Grundlagen}
\begin{frame}[fragile]
\showsubsectionnonumber
\begin{itemize}
\item
Programm aufrufen: Namen eingeben, z.\,B.: \lstinline[style=cmd]{ls}
\item
Optionen: \lstinline[style=cmd]{ls -l}
\item
Lange Optionen (GNU-Konvention): \lstinline[style=cmd]{ls --help}
\medskip
\item
Text schreiben: \lstinline[style=cmd]{echo "Hello, world!"}
\item
(String-)Variable setzen: \lstinline[style=cmd]{FOO=bar}
\item
Variable einlesen: \lstinline[style=cmd]{read FOO}
\item
Variable abrufen: \lstinline[style=cmd]{echo $FOO}
\item
Aus Sicherheitsgründen: \lstinline[style=cmd]{echo "$FOO"}
\end{itemize}
\pause
\begin{lstlisting}[style=terminal]
cassini/home/peter/bo> ¡FOO=ls¿
cassini/home/peter/bo> ¡echo "$FOO"¿
ls
cassini/home/peter/bo> ¡$FOO¿
2011ws 2012ws 2013ws doc misc projekte
2012ss 2013ss briefe material orga
cassini/home/peter/bo>
\end{lstlisting}
\end{frame}
\begin{frame}
\showsubsectionnonumber
\begin{itemize}
\item
Befehl zurückholen: Pfeiltasten $\uparrow$, $\downarrow$
\item
Befehl bearbeiten: Pfeiltasten $\leftarrow$, $\rightarrow$ usw.
\item
Befehl vervollständigen: TAB
\item
Befehl rückwärts suchen: Ctrl+R
\item
Bildschirm löschen: Ctrl+L
\item
Befehl abbrechen: Ctrl+C
\bigskip
\pause
\item
Hilfe-Option: \lstinline[style=cmd]{ls --help}
\item
Unix-Handbuch -- \emph{manual\/}: \lstinline[style=cmd]{man ls}\\
(Beenden mit \lstinline[style=cmd]{q})
\end{itemize}
\end{frame}
\begin{frame}
\showsubsectionnonumber
\begin{itemize}
\item
Verzeichnisse für Programme: \lstinline[style=cmd]{echo $PATH}
\item
Programm in explizitem Verzeichnis aufrufen: \lstinline[style=cmd]{/bin/ls -l}
\item
Programm im aktuellen Verzeichnis aufrufen: \lstinline[style=cmd]{./hello}
\bigskip
\addtolength{\leftskip}{1cm}
\item[MS-DOS:]
Ausführbare Programme werden gefunden,\\
wenn sie im \lstinline[style=terminal]{PATH} stehen\\
\emph{oder\/} sich im aktuellen Verzeichnis befinden.
\smallskip
\item[Unix:]
Ausführbare Programme werden gefunden,\\
wenn sie im \lstinline[style=terminal]{PATH} stehen.
\smallskip
\textarrow\ Vermeiden von Ausnahmen
\pause
\smallskip
Das aktuelle Verzeichnis (\lstinline[style=terminal]{.})
\emph{kann\/} im \lstinline[style=terminal]{PATH} stehen,\\
muß dies aber nicht\only<2>{ --\\
und sollte es aus Sicherheitsgründen auch nicht}.
\end{itemize}
\end{frame}
\subsectionnonumber{U.3\quad Dateisysteme}
\begin{frame}
\showsubsectionnonumber
\begin{itemize}
\item
Dateien listen: \lstinline[style=cmd]{ls}\\
langes Listenformat: \lstinline[style=cmd]{ls -l}\\
rückwärts nach Zeit sortiert: \lstinline[style=cmd]{ls -lrt}
\item
Datei ausgeben: \lstinline[style=cmd]{cat hello.c}
\item
Datei anzeigen: \lstinline[style=cmd]{less hello.c}
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\showsubsectionnonumber
\begin{itemize}
\item
Arbeitsverzeichnis anzeigen: \lstinline[style=cmd]{pwd}\\
\item
Arbeitsverzeichnis wechseln: \lstinline[style=cmd]{cd script}\\
(\emph{kein\/} Programm, sondern Shell-Befehl)
\item
übergeordnetes Verzeichnis: \lstinline[style=cmd]{cd ..}
\item
eigenes \newterm{Home-\/}Verzeichnis: \lstinline[style=cmd]{cd}
\item
Wurzelverzeichnis: \lstinline[style=cmd]{cd /}
\item
wieder zurück: \lstinline[style=cmd]{cd -}
\end{itemize}
\pause
\begin{lstlisting}[style=terminal]
cassini/home/peter/bo/2013ss/net/script> ¡cd /usr/bin¿
cassini/usr/bin> ¡cd ../lib¿
cassini/usr/lib> ¡cd¿
cassini/home/peter>
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\showsubsectionnonumber
\begin{itemize}
\item
Dateien kopieren (\emph{copy\/}): \lstinline[style=cmd]{cp}
\item
Dateien verschieben/umbenennen (\emph{move\/}): \lstinline[style=cmd]{mv}
\item
Dateien löschen (\emph{remove\/}): \lstinline[style=cmd]{rm}
\end{itemize}
\begin{lstlisting}[style=terminal,xleftmargin=-3pt]
cassini/home/peter> ¡cp -p foo/test.txt¿
cp: missing destination file operand after `foo/test.txt'
Try `cp --help' for more information.
cassini/home/peter> ¡cp -p foo/test.txt .¿
cassini/home/peter> ¡mv test.txt bla.txt¿
cassini/home/peter> ¡cat bla.txt¿
Dies ist ein Test.
cassini/home/peter> ¡rm bla.txt¿
cassini/home/peter>
\end{lstlisting}
\medskip
Aktuelles Verzeichnis: \lstinline[style=cmd]{.}
\end{frame}
\begin{frame}[fragile]
\showsubsectionnonumber
\begin{itemize}
\item
\lstinline[style=cmd]{grep}: Dateien durchsuchen
\end{itemize}
\begin{lstlisting}[style=terminal,xleftmargin=-3pt]
cassini/.../ainf/20131031.0> ¡grep printf *.c¿
philosophy.c: printf ("The answer is %d.\n", answer ());
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\showsubsectionnonumber
\begin{itemize}
\item
Datenträger in Verzeichnis \newterm{einhängen\/}: \lstinline[style=cmd]{mount}
\end{itemize}
\begin{lstlisting}[style=terminal]
cassini/home/peter> ¡ls /media/sd-card/¿
cassini/home/peter> ¡mount /media/sd-card¿
cassini/home/peter> ¡ls /media/sd-card/¿
DCIM NIKON001.DSC
cassini/home/peter> ¡umount /media/sd-card¿
cassini/home/peter> ¡ls /media/sd-card/¿
cassini/home/peter>
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\showsubsectionnonumber
\begin{itemize}
\item
\newterm{Zugriffsrechte}
\end{itemize}
\begingroup
\small
\begin{lstlisting}[style=terminal,gobble=6,xleftmargin=-3pt]
phoenix/home/peter/bo/2013ws/ainf/20131031.0> ¡ls -l¿
...
-rw-r--r-- 1 peter peter 1539 Nov 29 2012 pruzzel-1.c
\end{lstlisting}
\endgroup
\begin{onlyenv}<2>
\begin{picture}(0,1)
\color{red}
\put(0.3,0){\vector(0,1){1.0}}
\put(0.3,0){\vector(2,1){2.1}}
\put(0,-0.1){\makebox(0,0)[tl]{Benutzer (u -- \emph{user\/}) darf lesen und schreiben}}
\end{picture}
\end{onlyenv}
\begin{onlyenv}<3>
\begin{picture}(0,1)
\color{red}
\put(0.77,0){\vector(0,1){1.0}}
\put(0.77,0){\vector(3,1){3.1}}
\put(0,-0.1){\makebox(0,0)[tl]{Gruppe (g -- \emph{group\/}) darf lesen}}
\end{picture}
\end{onlyenv}
\begin{onlyenv}<4>
\begin{picture}(0,1)
\color{red}
\put(1.37,0){\vector(0,1){1.0}}
\put(0,-0.1){\makebox(0,0)[tl]{alle anderen (o -- \emph{other\/}) dürfen lesen}}
\end{picture}
\end{onlyenv}
\medskip
\pause[5]
\begin{itemize}
\item
Zugriffsrechte ändern:\\
\lstinline[style=cmd]{chmod o-r pruzzel-1.c} -- Lesezugriff entziehen\\
\lstinline[style=cmd]{chmod g+w pruzzel-1.c} -- Schreibzugriff gewähren\\
\lstinline[style=cmd]{chmod 640 pruzzel-1.c} -- auf \lstinline[style=terminal]{-rw-r-----} setzen
\end{itemize}
\pause
\begin{picture}(0,0)
\color{red}
\put(6.275,0.5){\makebox(0,0)[tl]{%
\begin{math}%
\underbrace{\rule{0.7em}{0pt}}_{\textstyle 6}%
\underbrace{\rule{0.7em}{0pt}}_{\textstyle 4}%
\underbrace{\rule{0.7em}{0pt}}_{\textstyle 0}
\end{math}}}
\end{picture}
\end{frame}
\begin{frame}[fragile]
\showsubsectionnonumber
\begin{itemize}
\item
\newterm{ausführbare\/} Dateien
\end{itemize}
\begingroup
\small
\begin{lstlisting}[style=terminal,gobble=6,xleftmargin=-3pt]
cassini/home/peter/bo/2013ws/systech/20131008.0> ¡cat test¿
ls -l systech-20131008.*
cassini/home/peter/bo/2013ws/systech/20131008.0> ¡chmod +x test¿
cassini/home/peter/bo/2013ws/systech/20131008.0> ¡ls -l test¿
-rwxr-xr-x 1 peter peter 25 Okt 6 16:45 test
cassini/home/peter/bo/2013ws/systech/20131008.0> ¡./test¿
-rw-r--r-- 1 peter peter 4120 Okt 6 16:44 systech-20131008.aux
...
\end{lstlisting}
\endgroup
\pause
\begin{itemize}
\item
ausführbare Textdateien: \newterm{Skripte}
\pause
\smallskip
hier: ausführbare Textdatei mit Shell-Befehlen\\
(ohne spezielle Kennung): Shell-Skript
\pause
\smallskip
Kennung: 1.\ Zeile enthält \lstinline[style=terminal]{#!} und den Interpreter,\\
z.\,B.\ \lstinline[style=terminal]{#!/bin/bash}\\
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\showsubsectionnonumber
\begin{itemize}
\item
\newterm{Symbolische Verknüpfungen -- symbolic links}
\smallskip
Verweis auf die eigentliche Datei\\
\textarrow\ Wenn man die Datei löscht, zeigt der Link ins Leere.
\smallskip
Verknüpfung anlegen: \lstinline[style=cmd]{ln -s datei link}\\
(Richtung: wie bei \lstinline[style=cmd]{cp})
\smallskip
Beispiel: \lstinline[style=cmd]{ln -s opengel-magic-double.c opengl-magic.c}
\medskip
\item
\newterm{Harte Verknüpfungen -- hard links}
\smallskip
Dieselben Daten auf dem Datenträger\\
sind unter mehreren Namen verfügbar.\\
\textarrow\ Wenn man einen löscht, sind die Daten noch da.
\smallskip
Anwendungsbeispiel: Snapshot-Backup
\smallskip
Bei Verzeichnissen: \newterm{hard links\/} halten die Verzeichnisstruktur zusammen
\begin{itemize}
\item eigentlicher Name
\item \lstinline{.} von sich selbst aus
\item \lstinline{..} von Unterverzeichnissen aus
\end{itemize}
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\showsubsectionnonumber
\begin{itemize}
\item
\lstinline[style=cmd]{find}: Dateien anhand ihrer Eigenschaften suchen
\end{itemize}
\small
\begin{lstlisting}[style=terminal,xleftmargin=-7pt]
$ ¡find . -name "*orbit-x*"¿
./20131031.0/orbit-x.c
./20131031.0/orbit-x1.c
./20131031.0/orbit-x
./20131107.0/orbit-x.c
./20131107.0/orbit-x1.c
./20131107.0/orbit-x
$ ¡find . -name "*orbit-x*" -perm /u+x¿
./20131031.0/orbit-x
./20131107.0/orbit-x
$ ¡find . -name "*orbit-x*" -perm /u+x -exec ls -l {} \;¿
-rwxr-xr-x 1 peter peter 15831 Okt 31 13:19 ./20131031.0/orbit-x
-rwxr-xr-x 1 peter peter 15831 Okt 31 13:19 ./20131107.0/orbit-x
\end{lstlisting}
\end{frame}
\subsectionnonumber{U.4\quad Ein- und Ausgabeströme}
\begin{frame}[fragile]
\showsubsectionnonumber
\begin{itemize}
\item
Standard-Ausgabe in Datei umleiten
\end{itemize}
\begin{lstlisting}[style=terminal]
$ ¡echo "Dies ist ein Test." > test.txt¿
$ ¡cat test.txt¿
Dies ist ein Test.
\end{lstlisting}
\pause
\smallskip
\begin{itemize}
\item
Standard-Ausgabe an Datei anhängen
\end{itemize}
\begin{lstlisting}[style=terminal]
$ ¡echo "Dies ist noch ein Test." >> test.txt¿
$ ¡cat test.txt¿
Dies ist ein Test.
Dies ist noch ein Test.
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\showsubsectionnonumber
\begin{itemize}
\item
Fehler-Ausgabe in Datei umleiten
\end{itemize}
\begin{lstlisting}[style=terminal]
$ ¡cat gibtsnicht.txt > fehler.txt¿
cat: gibtsnicht.txt: No such file or directory
$ ¡cat fehler.txt¿
$ ¡cat gibtsnicht.txt 2> fehler.txt¿
$ ¡cat fehler.txt¿
cat: gibtsnicht.txt: No such file or directory
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\showsubsectionnonumber
\begin{itemize}
\item
Standard-Eingabe aus Datei lesen
\end{itemize}
\begin{lstlisting}[style=terminal]
$ ¡bc¿
bc 1.06.95
Copyright [...] 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
¡2 + 2¿
4
$ ¡echo "2 + 2" > test.bc¿
$ ¡bc < test.bc¿
4
\end{lstlisting}
\end{frame}
\subsectionnonumber{U.5\quad Pipes}
\begin{frame}[fragile]
\showsubsectionnonumber
Standard-Ausgabe von Programm A\\
wird zu Standard-Eingabe von Programm B
\smallskip
\begin{lstlisting}[style=terminal]
$ ¡echo "2 + 2" | bc¿
4
\end{lstlisting}
\smallskip
\textarrow\ sehr mächtiger "`Baukasten"'
\end{frame}
\begin{frame}[fragile]
\showsubsectionnonumber
\begin{itemize}
\item
\lstinline[style=cmd]{sed}: \emph{stream editor}\\
Suchen und Ersetzen (und noch viel mehr)
\end{itemize}
\begin{lstlisting}[style=terminal]
$ ¡echo "Schlimmer geht nimmer." | sed -e 's/nim/im/g'¿
Schlimmer geht immer.
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\showsubsectionnonumber
\begin{itemize}
\item
\lstinline[style=cmd]{grep}: Standard-Eingabe durchsuchen
\end{itemize}
\begin{lstlisting}[style=terminal]
$ ¡ls | grep slides¿
pgslides.sty
$ ¡ls *.pdf | grep -v fig¿
logo-hochschule-bochum-cvh-text.pdf
logo-hochschule-bochum.pdf
NPN_transistor_basic_operation.pdf
rtech-20131002.pdf
$ ¡ls -l $(ls *.pdf | grep -v fig)¿
-rw-r--r-- 1 peter peter 14488 Sep 2 21:02 logo-hochschule-bochum-cvh-text.pdf
-rw-r--r-- 1 peter peter 31581 Dez 26 2011 logo-hochschule-bochum.pdf
-rw-r--r-- 1 peter peter 8538 Okt 2 2012 NPN_transistor_basic_operation.pdf
-rw-r--r-- 1 peter peter 6753149 Okt 1 22:59 rtech-20131002.pdf
\end{lstlisting}
\end{frame}
\subsectionnonumber{U.6\quad Verzweigungen und Schleifen}
\begin{frame}[fragile]
\showsubsectionnonumber
\begin{lstlisting}[style=terminal]
$ ¡if grep Pipes test.txt; then echo "gefunden"; \
else echo "nicht gefunden"; fi¿
nicht gefunden
$ ¡for x in foo bar baz; do echo $x; done¿
foo
bar
baz
\end{lstlisting}
\end{frame}
\end{document}