From f3cb2f1258cbe834dec64a1ab60c3403c29a6c0a Mon Sep 17 00:00:00 2001 From: Harald Geyer Date: Fri, 28 May 2010 21:44:23 +0200 Subject: [PATCH] Initial draft, way too long and many rough edges --- unix-shell.tex | 333 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 333 insertions(+) create mode 100644 unix-shell.tex diff --git a/unix-shell.tex b/unix-shell.tex new file mode 100644 index 0000000..7d461cf --- /dev/null +++ b/unix-shell.tex @@ -0,0 +1,333 @@ +\documentclass[a5paper,DIV=20]{scrartcl} +\usepackage[T1]{fontenc} +\usepackage[utf8]{inputenc} +\usepackage{ngerman} + +\setcounter{secnumdepth}{-1} +\newcommand{\myitem}[1]{\subparagraph{\texttt{#1}}} +\newcommand{\myitemx}[2]{\myitem{#1\textrm{,} #2}} +\newcommand{\example}[1]{\verb"#1"} +\newcommand{\key}[1]{\subparagraph{\textsf{#1}}} +\newcommand{\strg}[1]{\key{Strg-#1}} + +\newcommand{\dontshow}[1]{} + +\pagestyle{empty} + +\begin{document} +%# Die Welt der (Unix-)Shell +%oder +%# Eine Seite über die Unix-Shell + +\begin{center} +{\Large Die Welt der (Unix-)Shell} +\end{center} + +\section{Motivation} +Die Unix-Shell ist ein Konzept aus den 70er Jahren, dennoch gib es +auch heute noch viele Gründe sie zu verwenden: +\begin{itemize} +\item Ihre Mächtigkeit -- manche Aufgaben sind damit effizient + zu erledigen +\item Graphische Oberflächen können noch immer nicht alles +\item Auf vielen modernen Geräten (WLAN-Router, Drucker, Videorecorder, \ldots) + läuft im Hintergrund Linux und damit auch eine Shell, mit der vollständiger + Zugriff auf diese Geräte möglich ist. +\end{itemize} +Der vorliegende Text hat den Anspruch, die wichtigsten Grundlagen so kurz +und bündig zusammenzufassen, dass er leicht vollständig gelesen und überall +hin mitgenommen werden kann und das schnelle wiederfinden von Informationen +erleichtert. + +\section{Das Dateisystem} +Unter Unixsystemen gibt es keine Laufwerke. Alle Dateien sind in einer +abstrakten Hierarchie angeordnet, unabhängig davon auf welchem Gerät +die Daten tatsächlich gespeichert sind. Das mag für Umsteiger ungewohnt +wirken, hat aber den großen Vorteil, dass das Dateisystem auf allen +Unixsystemen sehr ähnlich aufgebaut ist. Dadurch ist es leicht sich auf +neuen Computern zurechtzufinden bzw. bei vielen Servern den Überblick +nicht zu verlieren. + +In einem Dateiort (Pfad) werden Verzeichnisnamen durch +Slash ("`\texttt{/}"') getrennt. +Das oberste Verzeichnis in der Hierarchie (sozusagen die Wurzel des +Dateisystembaums -- auch root-Verzeichnis genannt) wird nur mit einem +"`/"' bezeichnet. In den darunterliegenden Verzeichnissen befinden sich +die Systemdateien. Im Folgenden werden die wichtigsten Verzeichnisse +kurz angeführt: + +\myitem{/etc} +Hier befinden sich die Konfigurationsdateien des Systems. Das sind +üblicherweise kleine Textdateien, die mit einem beliebigen Editor +geöffnet werden können. + +\myitemx{/bin}{/sbin} +In diesen beiden Verzeichnissen befinden sich die wichtigsten +Programme, ohne die das System nicht starten kann. Die Programme +in /sbin sind nur für Benutzer mit Administratorrechten vorgesehen. + +\myitem{/dev} +Auf unixartigen Systemen werden auch Geräte wie z.B. Festplatten, Mäuse, +USB-Sticks, \ldots) als Dateien repräsentiert -- dafür ist dieses +Verzeichnis, in dem niemals normale Dateien liegen sollten, vorgesehen. +Grundsätzlich kann darauf auch ähnlich wie auf echte Dateien zugegriffen +werden, sofern das verwendete Programm etwas mit den Rohdaten anfangen kann. + +\myitem{/lib} +In diesem Verzeichnis befindet sich ausführbarer Code, der von verschiedenen +Programmen benötigt wird. +\dontshow{Z.\,B. Kernelmodule (entspricht ca. Treibern) + oder dynamisch ladbaren Bibliotheken (das sind die \texttt{.dll}-Dateien + unter Windows). +} + +\myitem{/home} +Der Ort für die Daten der Benutzer. Es gibt kein wirklich einheitliches +Format, aber am üblichsten ist, dass es für jeden Benutzer ein +Unterverzeichnis (sein sogenanntes HOME-Verzeichnis) +gibt, in dem alle seine (privaten) Daten liegen. + +\myitem{/var/log} +In \texttt{/var} speichern Programme ihre Betriebsdaten, um die sich +der Benutzer normalerweise nicht kümmern muss. Einzig das +Unterverzeichnis \texttt{/var/log} ist von Interesse: Hier liegen +zahlreiche Logfiles, das sind Dateien, in denen protokolliert wird, was das +System gerade macht. Wenn irgendetwas nicht funktioniert, dann finden +sich in den Logfiles oft wichtige Hinweise auf die Ursache. + +\myitem{/proc} +In diesem Verzeichnis sind keine normalen Dateien (vgl. mit \texttt{/dev}) +sondern "`virtuelle Dateien"', die das System beschreiben: Welche +Treiber sind geladen, welche Hardware wurde erkannt, welche Programme +laufen gerade, \ldots + +\myitem{/usr} +Der Großteil des Systems, also zum Beispiel alle +Programme die nicht zum Booten des Rechners notwendig sind. Der +Aufbau erinnert ein bisschen an das Wurzelverzeichnis selbst. + +\myitem{/usr/share} +Zusätzliche Daten, die die Funktionalität von Programmen Erweitern oder +Ergänzen; z.\,B. Schriften, Logos, Skripts, \ldots + +\myitem{/usr/share/doc} +Sofern vorhanden: Dokumentation. Hängt stark von der verwendeten +Distribution ab, wie das organisiert ist. + +\section{Befehle} +Die Shell führt jede eingegebene Zeile als Befehl aus. Eine typische +Befehlszeile beginnt mit dem Namen des Befehls. Optional können dem +Befehl auch Argumente mitgegeben werden. Argumente werden durch +Leerzeichen getrennt. Die Ausgabe eines Befehls wird normalerweise +am Bildschirm angezeigt, kann aber auch (mit einem größer Zeichen) +in eine Datei oder (mit einem Senkrechten Strich -- das sog. Pipe-Symbol) +als Eingabe +für einen weiteren Befehlt umgeleitet werden. + +Außerdem bietet die Shell auch ein paar einfache Programmierkonstrukte +wie z.B. Schleifen, mit denen gewisse Aufgaben (z.\,B. das Umbenennen +von vielen Dateien) automatisiert werden können. Ein paar Beispiele, +nach Komplexität geordnet: +\begin{verbatim} +help +man sh +ls -l /var/log >logfiles.txt +grep log logfiles.txt | wc +for i in *; do echo $i; done +for i in *.jpeg; do mv $i $(basename $i .jpeg).jpg; done +\end{verbatim} + +\subsection{Übersicht der wichtigsten Befehle} +\myitem{cd} +Wechselt das Verzeichnis. Es können absolute Pfade angegeben werden, +wie \example{cd /lib} oder relative \example{cd modules}. + +\myitem{ls} +Zeigt den Inhalt des Verzeichnis an. Die Optionen \texttt{-a} (versteckte +Dateien anzeigen) und \texttt{-l} (Details anzeigen) sind besonders +wichtig. + +\myitem{echo} +Gibt alle Argumente auf dem Standardausgabegerät aus. Für Umsteiger ist +es vielleicht befremdlich, dass es für so eine einfache Aufgabe ein +eigenes Programm gibt. Tatsächlich gehört \texttt{echo} aber zu den +wichtigsten Tools, die auf absolut jedem Linuxsystem installiert sind. + +\myitem{cat} +Alle Argumente werden als Dateien aufgefasst und eine nach der anderen +auf der Standardausgabe ausgegeben. Unter anderem praktisch um kleine +Textdateien am Bildschirm anzuzeigen. + +\myitemx{more}{less} +Ähnlich wie \texttt{cat} aber mit dem Unterschied, dass nur maximal +eine Bildschirmseite angezeigt wird. Mit der Leertaste kann man +weiterblättern. \texttt{less} erlaubt außerdem das Zurückscrollen +mit den Pfeiltasten. + +\myitem{man} +Auf Unixsystemen gibt es normalerweise zu jedem Programm eine +manual page (Handbuchseite). \texttt{man} mit einem Befehlsnamen als +Argument zeigt diese +Handbuchseite an. Dies ist meist der schnellste Weg, um herauszufinden, +welche Argumente ein Befehl versteht bzw. was eine bestimmte Option +bedeutet. + +\myitem{apropos} +Jede manual page hat eine einzeilige Kurzbeschreibung. +Die Argumente von \texttt{apropos} sind Suchwörter. Alle passenden +Kurzbeschreibungen werden ausgegeben. Das ist sehr praktisch, wenn man +für eine bestimmte Aufgabe einen Befehl sucht, dessen Namen man vergessen +hat. Aus der ausgegebenen Liste kann man dann die interessanten +Befehle auswählen und mit \texttt{man} genauer nachlesen. + +\myitem{whatis} +Gibt zu einem Befehl die Kurzbeschreibung aus. + +\myitem{ssh} +Über eine verschlüsselte Verbindung mit der Shell auf einem anderen +Rechner im Netzwerk oder Internet verbinden. Z.\,B. +\example{ssh root@192.168.0.1} + +\myitem{sudo} +Einen Befehl mit Administratorrechten ausführen. Es ist wesentlich +sicherer als normaler Benutzer zu arbeiten und nur ausgewählte +Befehle mit \texttt{sudo} zu starten anstatt immer als Administrator +zu arbeiten. + +\myitem{sudoedit} +Eine Datei, die nur der Administrator verändern darf, bearbeiten. + +\myitem{exit} +Die Shell beenden. + +\myitem{cp} +Kopieren von Dateien. + +\myitem{mv} +Eine Datei verschieben bzw. umbenennen. + +\myitem{rm} +Eine Datei löschen. Mit der Option \texttt{-r} werden Verzeichnisse +rekursiv gelöscht. Mit \texttt{-f} werden auch schreibgeschützte +Dateien gelöscht, ohne nachzufragen. + +\myitem{mkdir} +Verzeichnis anlegen. + +\myitem{chmod} +Zugriffsrechte einer Datei verändern. Unter Unix sind jeder Datei +Lese-, Schreib- und Ausführungsrechte zugeordnet und zwar getrennt für +den Besitzer einer Datei, die Gruppe des Besitzers und alle +anderen. + +\myitem{mount} +Wie schon erwähnt gibt es unter Unix keine Laufwerke, sondern alle +Dateien werden in einem gemeinsamen Hierarchie dargestellt. \texttt{mount} +bindet den Inhalt eines neuen Datenträgers ein. Beispiel für eine +Diskette: \example{mount /dev/fd0 /media/floppy0} + +\myitem{grep} +Durchsucht die Eingabe nach einem Textmuster und gibt alle passenden +Zeilen auf der Standardausgabe aus. Also Muster können reguläre +Ausdrücke verwendet werden -- siehe manpage. + +\myitem{gzip} +Das Standardkomprimierungstool unter Unix. Dateien werden komprimiert +und mit der Endung \texttt{.gz} versehen. Bereits komprimierte Dateien +werden wieder ausgepackt. \texttt{gzip} kann allerdings keine Archive +erzeugen, dafür wird meist \texttt{tar} verwendet. + +\myitem{tar} +Das Standardtool um Archive zu erzeugen und verwalten. Es gibt viele +Optionen, die wichtigsten sind \texttt{-x}, \texttt{-c}, \texttt{-f}, +\texttt{-z}. Beispiel: \example{tar -xzf archiv.tgz} + +\myitem{ps} +Zeigt (je nach Optionen) die gerade am System laufenden Prozesse an. +Mit \texttt{-A} werden alle Prozesse angezeigt. Nützlich zu sehen, +ob ein Prozess überhaupt noch läuft und wieviel CPU-Zeit er verbraucht. + +\myitem{kill} +Einen Prozess beenden. Die Option \texttt{-9} erzwingt das sofortige +Beenden, z.\,B. wenn der Prozess abgestürzt ist. Der Prozess wird als +PID (siehe Ausgabe von \texttt{ps}) angegeben. Beispiel: +\texttt{kill -9 1234} + +\section{Tastenkombinationen} +Je nach Arbeitsumgebung gibt es eine Vielzahl verschiedener Tastenbelegungen. +Hier soll nur auf die unmittelbar für die Shell wichtigsten eingegangen +werden. + +\strg{C} +Sendet an den momentan aktiven Prozess ein sog. Interrupt-Signal. Das +hat bei den meisten Programmen eine ähnliche Wirkung wie wenn es mit +\texttt{kill} beendet wird. + +\strg{Z} +Sendet an den momentan aktiven Prozess ein Stop-Signal. Dadurch wird +die Ausführung des Programms angehalten (und der Benutzer zurück +in die Shell geworfen) ohne den Prozess wirklich zu beenden. Der +Prozess kann dann z.\,B. mit dem Befehl \texttt{bg} im Hintergrund +fortgesetzt werden. + +\strg{S} +Bildschirmausgabe anhalten. Das ist auf modernen Systemen selten +nützlich, kann aber zu Verwirrung führen, wenn es unabsichtlich +gedrückt wurde und der Computer scheinbar nicht mehr reagiert. +mit \textsf{Strg-Q} kann die Sperre wieder aufgehoben werden. + +\strg{R} +Die meisten Shells haben eine Befehlshistory, über die z.\,B. mit +den Pfeiltasten die zuletzt verwendeten Befehle wieder aufgerufen +werden können. Mit \textsf{Strg-R} kann in dieser History rückwärts +inkrementell gesucht werden. Einfach ausprobieren und anfangen einen +alten Befehl eingeben \ldots + +\key{Tab} +Moderne Shells können Befehle automatisch vervollständigen. + +\section{Environment} +Unter Unix bekommt jeder Prozess beim Start ein sogenannten Environment, +das ist eine Liste von Variablen, die das Programm ähnlich wie +eine Konfigurationsdatei verwenden kann um Einstellungen zu lesen. +Da Umgebungsvariablen geändert werden können, ohne eine Datei bearbeiten +zu müssen, ist das eine beliebte Methode, um die Einstellungen in den +Konfigurationsdateien temporär zu überschreiben. Welche Umgebungsvariablen +ein bestimmtes Programm auswertet, ist nicht allgemein festgelegt, steht +aber meist in der manpage. Deshalb hier nur eine Liste der +allerwichtigsten Variablen: + +\myitem{PATH} +Wird von der Shell verwendet um die Programme zu finden. Diese Variable +ist einfach eine Liste von Verzeichnissen, in denen nach Programmen gesucht +werden soll. Soll ein Programm, das in einem anderen Verzeichnis liegt, +ausgeführt werden, dann muss der Pfad beim Befehlsnamen explizit +mit angegeben werden. + +\myitem{EDITOR} +Es gibt Befehle (z.\,B. \texttt{sudoedit}), die einen interaktiven Editor +starten. Sind mehrere Editoren installiert, so kann ein bestimmter +oft über diese Variable ausgewählt werden. + +\myitem{TERM} +Informationen über das Terminal, für das die Ausgabe formatiert werden +soll. Das ist wichtig, damit man, wenn man sich mit \texttt{ssh} auf +einen anderen Rechner verbindet, trotzdem eine passende Ausgabe für +das \emph{eigene} Terminal bekommt. Normalerweise funktioniert das +alles automatisch. Folgende Werte sind üblich: \texttt{xterm}, +\texttt{linux}, \texttt{ansi}, \texttt{vt100}, \ldots + +\myitem{LANG} +sagt welche Spracheinstellungen verwendet werden sollen. Wichtig ist das +vor allem, falls ein Programm mit deutschen Einstellungen fehlerhaft +funktioniert. Dann hilft es oft, temporär \example{LANG=C} zu setzen. + +\subsection{Das Environment verändern} +Der Befehl \texttt{env} zeigt das aktuelle Environment an. Mit dem +Befehl \texttt{export VAR=value} wird eine Variable für die Dauer +einer Shell-Sitzung gesetzt. Soll nur ein einziger Befehl mit einer +bestimmten Variable ausgeführt werden, so ist die Syntax +\example{LANG=C man env} um z.\,B. statt der deutschen die englische +manpage von \texttt{env} zu lesen, praktisch. + +\end{document} -- 2.11.4.GIT