Benutzer-Werkzeuge

Webseiten-Werkzeuge


users:werner:wkdv:shell

Schulungsunterlagen für Linux-Anwender: Umgang mit der Shell

Gliederung:

  1. die Shell, das unbekannte Wesen
  2. das Dateisystem (prinzipieller Aufbau)
  3. Aktionen im Dateisystem
  4. Sammeln von Informationen
  5. mit anderen Rechnern verbinden
  6. weitere Aktionen
    1. Drucken
    2. Passwort ändern
    3. Onlinehilfe
    4. Midnight Commander
  7. Befehls- und Ausgabeumleitung
  8. Shellscripte in der bash
    1. Variablen in der Shell
    2. vordefinierte Variable
    3. Variable mit read einlesen
    4. Parametersubstitution (Bearbeiten von Veriableninhalten)
    5. Bedingungen mit test
    6. Verzweigungen
    7. Schleifen
  9. Anhang
    1. Vergleich mit test
    2. Sonderzeichen der bash

die Shell, das unbekannte Wesen

Die Shell ist ein Hilfsmittel, um den User mit der vorhandenen Hardware interagieren zu lassen. Die Shell wandelt die Eingaben des Users in eine Form um, mit der der Kernel etwas anfangen kann, indem die zum Befehl passende ausführbare Datei (Programm) gesucht wird, die eine (hoffentlich die gwünschte) Aktion im Kernel auslöst. Wenn Linux ein Auto wäre, wäre die Shell das Lenkrad und der Kernel der Motor.

Die Shell erlaubt dem User die Interaktion mit der Maschine, sie stellt ein Mittel bereit, die Umgebung anzupassen und zu programmieren - ähnlich den Batch-Dateien in MS-DOS.

Es gibt im wesentlichen folgende Typen von Shells:

  • sh (Bourne Shell): Standard-Shell; die kompakteste und einfachste Shell
  • ksh (Korn Shell): „Obermenge“ der sh; man kann die Befehlszeile editieren, meist indem man den Editor vi benutzt, was die Sache für neue User ziemlich verwirrend gestaltet.
  • csh (C Shell): Befehle und Skripte beruhen auf der C-Syntax
  • tcsh (Turbo C Shell): „Obermenge“ der csh mit vereinfachtem Scripting
  • bash (Bourne Again Shell): die GNU Shell; erlaubt flexible und intuitive User-Eingaben. Derzeit ist die bash die fortgeschrittenste und für Neulinge empfehlenswerteste Shell

In der Datei /etc/passwd wird jedem User eine Shell zugeordnet. Um zu verhindern, dass sich bestimmte User anmelden, kann man die Pseudo-Shell /bin/false angeben.

Ganz wichtig: die Shell unterscheidet - im Unterschied etwa zur MS-DOS-Eingabeaufforderung unter Windows - zwischen Groß- und Kleinschreibung! Ein Befehl cd existiert, aber CD wird nicht funktionieren. Auch Leerzeichen müssen gesetzt werden: cd .. funktioniert, cd.. nicht.


das Dateisystem (prinzipieller Aufbau)

Im Unterschied zur DOS/Windows-Welt wird nicht mit mehreren Laufwerken gearbeitet, sondern mit einem Filesystem. In dieses Filesystem können Daten von anderen Rechnern „eingehängt“ werden (Befehl mount). Der Ursprung (die Wurzel) des Dateisystems wird mit „root“ bezeichnet und / geschrieben.

Unterhalb der Wurzel ist ein bestimmter Aufbau des Filesystems festgelegt - User und Administratoren haben nur ein begrenztes Merkvermögen… Dieser Aufbau wird FHS - Filesystem Hierarchy Standard - genannt. FHS legt die Unterteilung in statische und variable Dateien einerseits sowie verteilbare und lokale Dateien andererseits zugrunde und definiert die Verzeichnisstruktur.

Laut FHS befinden sich unter der Wurzel folgende Verzeichnisse:

Verzeichnis Bedeutung
/bin wichtige Befehle; Benutzung durch root und User. Hier müssen die Befehle cat, chgrp, chmod, chown, cp, date, dd, df, dmesg, echo, false, hostname, kill, ln, login, ls, mkdir, mknod, more, mount, mv, ps, pwd, rm, rmdir, sed, sh, stty, su, sync, umount und uname zu finden sein.
/boot statische Dateien des Bootladers (u. a. Kernel mit Modulen)
/dev Geräte-Dateien
/etc systemspezifische Konfiguration
/home „Privat“-Verzeichnisse der einzelnen User
/lib wichtige „verteilte“ Bibliotheken (für die Programme in /bin und /sbin) und Kernelmodule
/media
/mnt temporärer Einhängpunkt für Dateisysteme
/opt für zusätzliche (optionale) Software, z. B. Oracle
/root „Privat“-Verzeichnis des Systemverwalters (root)
/sbin wichtige Systembefehle; Benutzung nur durch root vorgesehen
/srv Daten für Dienste, die vom System bereitgestellt werden (ftp, www, …)
/tmp temporäre Dateien
/usr sekundäre Hierarchie (userbezogen, unix system resource). Enthält ihrerseits (mindestens) bin, doc (Dokumentation zu Anwendungen), include (Include-Dateien für den C-Compiler), lib (Bibliotheken für die unter /usr abgelegten Programme), local, man (Onlinehilfe zu Befehlen), source (Quellcode).
/var veränderliche Daten (Logs, Mail, News, …)

Zuordnung von Dateien in Verzeichnisse nach den Kriterien der Verteilbarkeit und der Veränderlichkeit:

Kriterium shareable unshareable
static /usr /etc
/opt /boot
variable /var/mail /var/run
/var/spool/news /var/lock

Damit nicht jeder User alles ändern kann, gibt es auf Unix-Rechner eine dreigestaffelte Berechtigung, die angibt, ob der Besitzer, die besitzende Gruppe und „der Rest“ das Objekt lesen, schreiben oder ausführen (bei Verzeichnissen: hineinwechseln) darf.


Aktionen im Dateisystem

Aktion für Datei für Verzeichnis
anzeigen (ob vorhanden) ls [-la] ls [-la]
anzeigen (Inhalt) cat Datei oder less Datei ls [-la]
anlegen touch Datei mkdir Verzeichnis
umbenennen, verschieben mv Datei mv Verzeichnis
wechseln ./. cd Verzeichnis
verlinken ln [-s] Quelldatei Zieldatei ln [-s] Quellverzeichnis Zielverzeichnis
kopieren cp Quelldatei Zieldatei cp [-r] Quellverzeichnis Zielverzeichnis
löschen rm [-f] Datei rmdir [-p] Verzeichnis

Sammeln von Informationen

Um sich auf einem Rechner zurechtzufinden gibt es viele Möglichkeiten. Hier sind einige davon:

uname - wie heißt das System? uname -a gibt das (genaue) Betriebssystem (und anderes) an
hostname - wie heißt der PC? hostname: der „kurze“ Name des Rechners, hostname -d Domain des Rechners, hostname -f FQDN (Fully Qualified Domain Name) des Rechners.
pwd - wo bin ich? „print work directory“ gibt das aktuelle Arbeitsverzeichnis aus.
ps - Prozesstatus. ps, ps -ax, ps -faxe - Prozessliste in mehr oder weniger vollständiger Ausführung.
free - wieviel Speicher ist da? …und wieviel wird wofür benutzt?
who - wer ist angemeldet? …und auf welcher Konsole? who am i, who is clever…
top - wer tut wieviel? interessant, wenn der Rechner „hängt“ oder „rattert“
date - Datum und Uhrzeit. Nicht mit time verwechseln! Einstellen mit date -s - Vorsicht Format!
Festplattenbelegung: fdisk -l: Anzeige aller Festplattenpartitionen, df (disk free): welche Partition ist wie „frei“, du . -hs (disk usage): wieviel Platz nimmt ein bestimmtes Verzeichnis ein?
Info zum Befehl: manchmal funktioniert ein Befehl nicht so wie gewünscht. Mit which Befehl kann man nachprüfen, welche Datei zum Ausführen eines Befehls gebraucht wird. Beispiel: which ls sollte die Anzeige /bin/ls bringen.


mit anderen Rechnern verbinden

remote console

man kann sich mit den Befehlen telnet und/oder ssh auf einem entfernten Rechner anmelden und dort ebenso arbeiten wie auf der eigenen Konsole. Bei ssh werden alle Daten verschlüsselt übertragen, bei telnet nicht. Voraussetzung ist jeweils ein telnet- bzw. ssh-Server auf dem entfernten Rechner. Mit telnet kann man auch eigene Services testen.

Verbinden von Freigaben (Shares oder Mounts)

Mit dem Befehl mount kann man Filesystem-Ressourcen, die ein anderer Rechner freigibt, an seinem Rechner anbinden. Allgemeine Syntax: mount -t smbfs Server/Freigabe /mnt (bei SMB-FS) oder mount -t nfs server:Freigabe /mnt bei NFS. === Hin- und Herkopieren === Mit den Befehlen ftp und scp kann man Dateien zwischen verschiedenen Rechnern kopieren. Bei ftp ist die Voraussetzung ein ftp-Server auf dem entfernten Rechner, scp benötigt einen ssh-Server. —- ==== weitere Aktionen ==== === Drucken === Der Befehl lpr [-P Drucker] Datei druckt die Datei „Datei“ auf dem Drucker „Drucker“. Ohne Parameter -P wird auf dem Drucker lp (line printer) gedruckt. Mit dem Befehl lpq [-P Drucker] kann man sich die Druckerwarteschlange anzeigen lassen, mit lprm [-P Drucker] JobID einzelne Druckaufträge löschen. === Passwort ändern === der Befehl password (bitte nicht mit pwd verwechseln) ändert das eigene Passwort. Der User root kann damit auch die Passwörter anderer User ändern. === Onlinehilfe === In aller Regel erhält man mit dem Befehl man eine Hilfe zu einem Stichwort angezeigt; z. B. man ps um die Hilfe zum Befehl ps angezeigt zu bekommen. Die Hilfen (=Manuals) sind in verschiedene Kategorien gruppiert (Liste siehe unten). Wenn man eine Hilfe aufruft, findet man oft ziemlich am Ende einen Punkt „siehe auch“, in dem sich Hinweise auf weitere Hilfen finden. Wenn dort (z. B. bei man man) steht mandb(8), wird die Hilfe mit man 8 mandb angezeigt. In der Hilfe z. B. zu cat wird nur auf die eigentliche Hilfe zu cat verwiesen; man kann sie mit info cat aufrufen. Bei info handelt es sich um ein interaktives Hilfe-Navigationssystem. Eine Möglichkeit, eine Hilfe zu finden, ist der Befehl apropos. Die Eingabe apropos apropos erläutert die Funktion von apropos… === Midnight Commander === Er wird mit mc aufgerufen und stellt ein Mittelding zwischen der Shell und einer grafischen Oberfläche dar. Er arbeitet im Textmodus, erlaubt aber trotzdem einen Überblick über 2 Verzeichnisse und auch das Ausführen bestimmter Aktionen via F-Taste. Man kann sich dran gewöhnen… —- ==== Befehls- und Ausgabeumleitung ==== Die Befehle erwarten Eingaben „im Kanal“ STDIN, Ausgaben gehen nach STDOUT, Fehlermeldungen nach STDERR (was oft auf STDOUT umgelenkt ist). Man kann eine Eingabe auch „umleiten“, so dass sie aus einer Datei kommen kann: Schreibweise „befehl < Datei“. Die Standardausgabe kann ebenfalls umgeleitet werden: „befehl > Datei“. Die Umleitung der Fehlerausgabe erfolgt mit „befehl 2> Datei“. Will man Erfolgs- und Fehlermeldungen in der gleichen Datei haben, benutzt man „befehl > Datei 2>&1“ (&0: Standardeingabe, &1: Standardausgabe, &2: Fehlerausgabe). Um eine Ausgabe an einen anderen Befehl weiterzugeben, wird das Pipe-Zeichen | (senkrechter Strich) benutzt, ggf. i. V. m. xargs (z. B. bei find /home/otto -name „*bla*“ -type f -mtime +15 | xargs ls -l - findet alle Dateien in /home/otto, die „bla“ im Namen haben und älter als 15 Tage sind; die Dateien werden im Langformat angezeigt). Ein >> hängt die Ausgabe an eine bestehende Datei an, ein einfaches > legt die Datei neu an. Wird ausführlich z. B. bei http://www.netzmafia.de/skripten/unix/unix2.html behandelt. —- ==== Shellscripte in der bash ==== Als Shellscript wird eine Datei bezeichnet, die ausführbare Befehle enthält - meist 1 je Zeile… Um nach einer Datei zu suchen, die eine bestimmte Zeichenfolge enhält, kann man find -type f -exec grep -qi Zeichenfolge {} \; -print eingeben. Das ist auf die Dauer umständlich, man kann ein Script „grepall“ schreiben. Die Datei besteht aus 2 Zeilen: <code bash> #!/bin/bash find -type f -exec grep -qi $1 {} \; -print </code> Das ganze muss dann noch als ausführbar gekennzeichnet werden: chmod a+x grepall. Der Aufruf erfolgt dann als /pfad/zu/grepall Zeichenkette. $1 ist der Platzhalter für den ersten übergebenen Parameter. === Variablen in der Shell === Setzen: VARIABLE=„wert1 wert2“, Benutzen: echo „$VARIABLE“. Um eine Variable in der Shell zu setzen: VARIABLE=„wert1 wert2“; EXPORT VARIABLE oder VARIABLE=„wert1 wert2“ und Aufruf per . Script (= source Script). === vordefinierte Variable === ^ Variable ^ Bedeutung ^ | $? | Rückgabewert (Errorlevel) des letzten Kommandos | | $! | PID des zuletzt gestarteten Hintergrundprozesses | | $$ | PID der aktuellen Shell | | $0 | Dateiname des aktuell ausgeführten Shellscripts | | $# | Anzahl der dem Script übergebenen Parameter | | $1 bis $9 | Parameter 1 bis 9 | | $* oder $@ | Liste aller Parameter | === Variable mit read einlesen === I.d.R. wird man mit echo -n „Eingabeaufforderung: “ einen Text ausgeben und dann mit read var die Variable $var einlesen. === Parametersubstitution (Bearbeitung von Variableninhalten) === Generelle Syntax: ${var__muster} (2 Unterstriche). ^ Ausdruck ^ Bedeutung ^ | ${var:-default} | Ergebnis: wenn $var leer: default, sonst den Inhalt von $var. $var wird nicht geändert. | | ${var:=default} | wie oben, aber $var wird ggf. geändert. | | ${var:+neu} | Wenn $var leer ist, bleibt $var leer. Sonst wird $var neu zugewiesen (und zurückgeliefert). | | ${var:?fehlermeldung} | Wenn $var leer ist, wird Variablenname und Fehlermeldung ausgegeben und das Script beendet. Sonst ist der Inhalt von $var Ergebniswert. | | ${#var} | Anzahl der in $var gespeicherten Zeichen. $var wird nicht geändert. | | ${var#muster} | Wird muster in $var gefunden, wird „der Inhalt der Variablen abzüglich des kürzestmöglichen Texts, der dem Variableninhalt entspricht“ zurückgegeben (sonst $var komplett). (Bsp: Variable dat enthält „/home/mk/buch/buch.tar.gz“; ${dat#/*} enthält „home/mk/buch/buch.tar.gz“; ${dat#*.} enthält „tar.gz“). | | ${var##muster} | wie oben, allerdings wird jetzt die größtmögliche Zeichenkette, die dem Muster entspricht, eliminiert. (Bsp: Variable dat enthält „/home/mk/buch/buch.tar.gz“; ${dat##*/} enthält „buch.tar.gz“; ${dat##*.} enthält „gz“). | | ${var%muster} | wie ${var#muster}, aber es wird vom Ende des Variableninhalts her gesucht. (Bsp: Variable dat enthält „/home/mk/buch/buch.tar.gz“; ${dat%/*} enthält „/home/mk/buch“; ${dat%*.} enthält „/home/mk/buch/buch.tar“). | | ${var% %muster} | wie oben, allerdings wird jetzt die größtmögliche Zeichenkette, die dem Muster entspricht, eliminiert. (Bsp: Variable dat enthält „/home/mk/buch/buch.tar.gz“; ${dat/*} ist leer; ${dat*.} enthält „/home/mk/buch/buch“). | | ${!var} | liefert den Inhalt der Variablen, deren Name in $var abgelegt ist. | ==== Bedingungen mit test ==== Der Befehl test liefert als Rückgabewet 0 (=wahr), wenn die Bedingung erfüllt ist, oder 1 (=falsch), wenn nicht. Beispiele: ^ Bedingung ^ Ergebnis ^ | test „$x“ (oder [ -n „$x“ ]) | wahr, wenn „$x“ eine nichtleere Zeichenkette ist. | | test $x -gt 5 (oder [ $x -gt 5 ]) | wahr, wenn der in $x abgespeicherte Zahlenwert größer als 5 ist. | | test -f $x (oder [ -f $x ]) | wahr, wenn eine Datei mit dem Namen $x existiert. | ==== Verzweigungen ==== === mit if === Beispiel: wurden 2 Parameter übergeben? <code bash> #!/bin/bash if test $# -ne 2; then echo „es wurden nicht genau 2 Parameter übergeben“ exit 1 else echo „Parameter eins: $1, zwei: $2“ fi </code> === mit case === Beispiel: interpretieren der Befehlszeile <code bash> #!/bin/bash for i do case „$i“ in -*) echo -n „Option $i “ ;; *) echo „Wert $i“ ;; esac done </code> ==== Schleifen ==== === for-Schleifen === Eine for-Schleife arbeitet eine Folge von „Symbolen“ ab. Beispiel: Verschieben mehrerer Dateien (mv arbeitet nicht mit Wildcards) <code bash> #!/bin/bash for i in *.c; do mv $i sources/ done </code> Wenn der Teil „in …“ nicht angegeben wird, werden alle übergebenen Parameter durchlaufen. === while-Schleifen === Eine while-Schleife läuft, solange die angegebene Bedingung wahr ist. Beispiel: Zählen von 1 bis 5: <code bash> #!/bin/bash i=1 while [ $i -le 5 ]; do echo $i i=$[$i+1] done </code> === until-Schleifen === Eine until-Schleife läuft, bis die angegebene Bedingung wahr wird. Beispiel: Zählen von 1 bis 5: <code bash> #!/bin/bash i=1 until [ $i -gt 5 ]; do echo $i i=$[$i+1] done </code> Zur Shell-Programmierung: Kofler (7. Auflage), Kapitel 16, S. 515-550; zu Shell-Kommandos: aaO, Kapitel 17, S. 551-612; Umgang mit Dateien und Verzeichnissen: aaO, Kapitel 18, S. 615-639. —- ==== Anhang ==== === Vergleich mit test === Zeichenketten bzw. Variablen sollten in Hochkommata gestellt werden (z. B. [ „$1“ = „abc“ ]), weil es sonst bei Zeichenketten mit Leerzeichen zu Fehlern kommen kann. == Vergleiche mit Zeichenketten == ^ Vergleich ^ Ergebnis ^ | [ zk ] oder [ -n zk ] | wahr, wenn die Zeichenkette nicht leer ist | | [-z zk ] | wahr, wenn die Zeichenkette leer ist | | [ zk1 = zk2 ] | wahr, wenn die Zeichenketten übereinstimmen | | [ zk1 != zk2 ] | wahr, wenn die Zeichenketten nicht übereinstimmen | == Vergleiche mit Zahlen == ^ Vergleich ^ Ergebnis ^ | [ z1 -eq z2 ] | wahr, wenn die Zahlen gleich sind | | [ z1 -ne z2 ] | wahr, wenn die Zahlen nicht gleich sind | | [ z1 -gt z2 ] | wahr, wenn z1 größer ist als z2 | | [ z1 -ge z2 ] | wahr, wenn z1 größer oder gleich ist als z2 | | [ z1 -lt z2 ] | wahr, wenn z1 kleiner ist als z2 | | [ z1 -le z2 ] | wahr, wenn z1 kleiner oder gleich ist als z2 | == Vergleiche mit Dateien (unvollständig) == ^ Vergleich ^ Ergebnis ^ | [ -d dat ] | wahr, wenn dat ein Verzeichnis ist | | [ -e dat ] | wahr, wenn dat eine existierende Datei ist | | [ -f dat ] | wahr, wenn dat eine einfache Datei ist (kein Verzeichnis, Device o. ä.) | | [ -L dat ] | wahr, wenn dat ein symbolischer Link ist | | [ -r dat ] | wahr, wenn dat gelesen werden darf | | [ -s dat ] | wahr, wenn dat mindestens 1 Byte groß ist | | [ -w dat ] | wahr, wenn dat verändert werden darf | | [ -x dat ] | wahr, wenn dat ausgeführt werden kann | | [ dat1 -ef dat2 ] | wahr, wenn beide Dateien denselben I-Node haben | | [ dat1 -nt dat2 ] | wahr, wenn dat1 neuer ist als dat2 | == Verknüpfte Bedingungen == ^ Verknüpfung ^ Ergebnis ^ | [ ! bed ] | wahr, wenn die Bedingung bed nicht erfüllt ist | | [ bed1 -a bed2 ] | wahr, wenn beide Bedingungen erfüllt sind | | [ bed1 -o bed2 ] | wahr, wenn mindestens eine der Bedingungen erfüllt ist | === Sonderzeichen der bash === ^ Sonderzeichen ^ Bedeutung ^ | ; | trennt mehrere Kommandos (in einer Zeile) | | : | macht nichts ;-) | | . | startet Script ohne eigene Subshell (entspricht source) | | # | leitet einen Kommentar ein | | #!/bin/bash | identifiziert die Shell, die das Script ausführen soll (Shebang-Zeile) | | & | führt einen Befehl im Hintergrund aus (Befehl &) | | && | bei Befehl1 && Befehl2 wird Befehl2 nur ausgeführt, wenn Befehl1 ohne Fehler beendet wurde | | &> (= >&) | Umleitung von Standardausgabe und -fehler | | <html>|</html> | Piping: bei Befehl1 | Befehl2 erhält Befehl2 die Ausgabe von Befehl1 als Parameter | | <html>||</html> | bei Befehl1 || Befehl2 wird Befehl2 nur ausgeführt, wenn Befehl1 mit Fehler beendet wurde | | * | Jokerzeichen in Dateinamen: kein, ein oder mehrere beliebige Zeichen | | ? | Jokerzeichen in Dateinamen: ein beliebiges Zeichen | | [abc] | Jokerzeichen in Dateinamen: ein Zeichen aus der Menge „abc“ | | [ ausdruck ] | Kurzschreibweise für test ausdruck | | (…) | Kommandos in derselben Shell ausführen (z. B. (Befehl1; Befehl2)) | | {…} | Kommandos grupppieren | | { , , } | Zeichenketten zusammensetzen: a{1,2,3} passt auf a1, a2, a3 | | ~ | Abkürzung für das eigene Home-Verzeichnis | | > | Ausgabeumleitung in eine Datei; sie wird zu Beginn neu angelegt | | >> | Ausgabeumleitung in eine Datei; die Ausgabe wird an eine bestehende Datei angehängt | | >& (= &>) | Umleitung von Standardausgabe und -fehler | | 2> | Umleitung der Standardfehlerausgabe | | < | Eingabeumleitung aus einer Datei | | << endemarke | Eingabeumleitung aus einer Datei bis zur Stelle endemarke | | $ | Kennzeichnung von Variablen (vordefinierte Variable siehe oben) | | $(…) | Kommandosubstitution (z. B. echo $(ls)) | | ${…} | Spezialfunktionen zur Bearbeitung von Zeichenketten (siehe oben) | | $[…] | arithmetische Auswertung (z. B. echo $[2+5]) | | „…“ | Auswertung der meisten Sonderzeichen verhindern | | '…' | Auswertung aller Sonderzeichen verhindern | | `…` | (backticks) Kommandosubstitution (z. B. echo `which less`) | | \zeichen | hebt die Wirkung eines Sonderzeichens auf (escaping) |

users/werner/wkdv/shell.txt · Zuletzt geändert: 2006-02-02 1519 von 127.0.0.1

Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht: Public Domain
Public Domain Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki