24.10.2013 Aufrufe

keine Angst vor dem Unix Prompt

keine Angst vor dem Unix Prompt

keine Angst vor dem Unix Prompt

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

Shell<br />

<strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong><br />

Ein Einstieg in die wohl mächtigste<br />

Nutzeroberfläche von <strong>Unix</strong>-Systemen<br />

Jörg Kinzebach<br />


Die <strong>Unix</strong>-Shell<br />

• Kein Scherz um Einsteigern das Leben schwer zu<br />

machen<br />

• Direkte Kommunikationsschnittstelle zwischen<br />

Rechner und Nutzer<br />

• Universal verwendbar :<br />

– Angeschlossene Tastatur und Monitor<br />

– Seriell angeschlossenes Terminal<br />

– „Terminal-Fenster“ auf einer graphischen<br />

Benutzeroberflöche<br />

– Über das Netz<br />

• ssh<br />

• telnet<br />

• rsh<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 2


• Interaktiv<br />

Nutzung<br />

– Konsole<br />

– ssh<br />

• Skript<br />

– System-Start<br />

– Cron (periodische Aufgaben)<br />

– durch Nutzer gestartete Aktionen<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 3


Aufgaben der Shell<br />

• Shell nimmt Kommandos<br />

von Nutzer entgegen<br />

• führt Kommandos aus<br />

• verknüpft Kommandos<br />

• verarbeitet Ausgaben<br />

• liefert Ausgaben<br />

• leitet Aus- und Eingaben<br />

um<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 4


Kernel, Userspace?<br />

• Kernel agiert als Schnittstelle zwischen Prozessen und Hardware<br />

• Abstrakte und zeitkritische Aufgaben im Kernel<br />

• Alle Ein-/Ausgaben gehen durch den Kernel<br />

• Der Kernel sorgt für die Einhaltung der Befugnisse<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 5


„die Shell“?<br />

• sh - die Bourne Shell<br />

• bash - die Bourne Again<br />

Shell<br />

• ksh - Die Korn Shell<br />

• csh - die „C“-Shell<br />

• tcsh - die TC Shell<br />

• zsh - Featuritis<br />

• sash - System<br />

Administrators Shell<br />

• Unterschiedlich Komplexe<br />

Konstrukte zur<br />

Programmierung<br />

• Unterschiede in der<br />

Benutzer-Interaktion<br />

• Unterschiede in der Syntax<br />

• Unterschiede in der Lizenz<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 6


Filename-Ergänzung<br />

Shell-Vergleich<br />

<strong>Prompt</strong>-Variable<br />

Start-Skripte<br />

Kommando bei<br />

Verzeichniswechsel<br />

Lange Argument-Listen<br />

Programmierbare<br />

Namenserweiterungen<br />

History-Completion<br />

Signal-Behandlung<br />

If-Konstruct<br />

bash<br />

Tab<br />

PS1=">"<br />

/etc/profile,<br />

~/.bash_profile,<br />

~/.profile<br />

Nein<br />

Ja<br />

Nein<br />

Ja<br />

Ja<br />

If.. fi<br />

csh<br />

Escape<br />

set prompt = ">"<br />

/etc/cshrc, ~/.cshrc<br />

Nein<br />

Nein<br />

Nein<br />

Nein<br />

Nein<br />

If .. endif<br />

tcsh<br />

Tab<br />

set prompt=">"<br />

/etc/tcshrc, ~/.tcshrc<br />

~/.cshrc<br />

Nein<br />

If .. endif<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 7<br />

Ja<br />

Ja<br />

Ja<br />

Ja


Das <strong>Unix</strong>-Dateisystem<br />

• Keine Laufwerke<br />

• Ein Dateibaum, ein „Root“<br />

• Alles ist eine Datei<br />

• Konventionen aber kein<br />

echter Standard bzgl. der<br />

Verzeichnisse<br />

• Ausnahmen bestätigen die<br />

Regel<br />

• Keine File-Extensions<br />

• Jedes Verzeichnis hat ein<br />

"." als Referenz auf sich<br />

selbst sowie ein ".." als<br />

Referenz auf das<br />

übergeordnete Verzeichnis<br />

<strong>Unix</strong>-Dateisystem<br />

bin<br />

dev<br />

etc<br />

home<br />

user1<br />

user2<br />

lib<br />

sbin<br />

tmp<br />

usr<br />

bin<br />

sbin<br />

tmp<br />

lib<br />

local<br />

var<br />

log<br />

tmp<br />

var<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 8<br />

/


• ls<br />

• cd<br />

Wichtige Kommandos<br />

• „List“ entspricht <strong>dem</strong> DOS-“dir“<br />

• zum Anzeigen von Verzeichnis-Inhalten und Datei-Attributen<br />

• „change Directory“ - Verzeichnis wechseln<br />

• mkdir<br />

• „make directory“ - Anlegen eines neuen Verzeichnisses<br />

• pwd<br />

• „print working directory“ - Ausgabe des aktuellen Arbeits-<br />

Verzeichnisses<br />

• cp<br />

• „copy“ - Kopiert Dateien<br />

• mv<br />

• „move“ - Verschiebt Dateien und Verzeichnisse<br />

• rm<br />

• "remove" - Entfernt Dateien oder Verzeichnisse (-r)<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 9


Editor<br />

• vi<br />

– in je<strong>dem</strong> <strong>Unix</strong> System <strong>vor</strong>handen<br />

– auch bei eingeschränktem Tastatur-Support bedienbar<br />

– geringer Resourcen-Verbrauch<br />

• Vim<br />

– vi „improved<br />

– Syntax-Highlighting, Programmierbar, „Split Screen“,<br />

mehrere Buffers<br />

• emacs<br />

– „anders“<br />

• jed<br />

• pico<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 10


vi<br />

• Wer ein <strong>Unix</strong>-System administrieren muss, muss den vi mehr oder<br />

weniger gut beherrschen können<br />

• Bedienung: VI unterscheidet zwischen Kommando und<br />

Eingabemodus<br />

• Nach start im Kommandomodus:<br />

– "a"ppend "i"nsert -> wechselt in Eingabemodus<br />

– “h","j",k","l" Cursor-Bewegung<br />

– "r"eplace: ersetzen des Zeichens unter <strong>dem</strong> Cursor<br />

– "R"eplace: ersetzen aller folgender Zeichen<br />

– ˆ bzw. $ : Springe an Anfang bzw. Ende der Zeile<br />

– "G" bzw "1G": Springe an das Ende bzw. den Anfang des<br />

Dokuments<br />

– ":q" Quit - beende den VI<br />

– ":wq" Write & Quit - schreibe die Datei und beende den VI<br />

• Verlassen des Eingabemodus: ESC-Taste<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 11


Man-Pages - Manuals<br />

• Handbuch zu den verfügbaren Kommandos<br />

• Beispiel:<br />

joerg@rechner> man ls<br />

LS(1) User Commands LS(1)<br />

NAME<br />

ls - list directory contents<br />

SYNOPSIS<br />

ls [OPTION]... [FILE]...<br />

DESCRIPTION<br />

List information about the FILEs (the current directory by default).<br />

Sort entries alphabetically if none of -cftuSUX nor --sort.<br />

Mandatory arguments to long options are mandatory for short options<br />

too.<br />

-a, --all<br />

do not hide entries starting with .<br />

-A, --almost-all<br />

do not list implied . and ..<br />

--author<br />

print the author of each file<br />

• Je nach System und Umgebungsvariablen des Nutzers auch<br />

mehrsprachig verfügbar<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 12


Man-Pages - „Kategorien“<br />

• „man“-Pages sind in verschiedene Kategorien aufgeteilt.<br />

• Kategorieren bestehen aus einer kurzen Zeichenfolge, üblich<br />

sind die Kategorien „1“ - „8“<br />

• Kategorie 1: Reguläre Kommandos für den Nutzer<br />

• Kategorie 2: Beschreibung von Funktionen der <strong>Unix</strong>-API<br />

• Kategorie 3: API von Library-Routinen<br />

• Kategorie 5: Beschreibung von Konfigurations-Files<br />

• Kategorie 8: Administrations-Kommandos<br />

• Wenn ein „Begriff“ in mehreren Kategorien zu finden ist, und<br />

<strong>keine</strong> Such-Kategorie angegeben wurde, wird bei „1“<br />

begonnen<br />

• Die Kategorie kann mittels „-S“ gewählt werden:<br />

man -S 5 crontab<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 13


Ein/Ausgaben<br />

• Sowohl Ein- als aus Ausgaben von Programmen können<br />

mittels der Shell umgeleitet werden<br />

• Ausgabe des Kommandos "date" in eine Datei "datum.txt"<br />

umleiten:<br />

date > datum.txt<br />

• Ausgabe des Kommandos "date" in das Programm "wc"<br />

(word count) umleiten:<br />

date | wc<br />

• Als Eingabe des Kommandos "wc" die Datei "datum.txt"<br />

verwenden<br />

wc < datum.txt<br />

• Den Inhalt der Datei "datum.txt" ausgeben und in das<br />

Programm "wc" umleiten (useless use of cat)<br />

cat datum.txt | wc<br />

• Datum an die Datei "datum.txt" anhängen:<br />

date >> datum.txt<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 14


Umleitung von Fehlern<br />

• Unter <strong>Unix</strong> wird unterscheiden zwischen zwei Ausgabe-<br />

Arten:<br />

– Standard Ausgabe (stdout) 1<br />

– Fehler Ausgabe (errout) 2<br />

Standard-Ausgabe:<br />

joerg@rechner> ls .bash_profile<br />

.bash_profile<br />

Fehler-Ausgabe:<br />

joerg@rechner> ls gibtsnicht<br />

ls: gibtsnicht: No such file or directory<br />

• Umleiten von Fehlern durch Umleiten des Error-Descriptors:<br />

joerg@rechner> ls .bash_profile gibtsnicht 2> fehler<br />

.bash_profile<br />

joerg@rechner> cat fehler<br />

ls: gibtsnicht: No such file or directory<br />

• Umleiten von Fehlern durch Standard Ausgabe:<br />

joerg@rechner> ls a b c d > ausgabe.txt 2>&1<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 15


Wildcards/Globs/Metazeichen<br />

• In der Shell sind "globs" üblich. Anders als unter<br />

DOS/Windows sind Punkte reguläre Zeichen. Metazeichen<br />

können kombiniert werden<br />

*<br />

?<br />

[c]<br />

[!c]<br />

{s1,s2,..}<br />

[c 1 -c 2 ]<br />

${VAR}<br />

Exakt ein Zeichen<br />

Ein Zeichen aus der Liste s<br />

• Beispiele:<br />

ls *.txt<br />

ls .bash*<br />

ls .b?s*profile<br />

ls *.{jpg,gif,bmp}<br />

Ein oder mehrere beliebige Zeichen<br />

Ein Zeichen das nicht in der Liste s enthalten ist<br />

Eine der Zeichenketten s1, s2, .. z.B.: {txt,doc}<br />

Ein Zeichen aus der Reihe c 1 bis c 2 , z.B. [a-z]<br />

Wird ersetzt durch den Wert von der Variable VAR<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 16


ls *.txt<br />

ls .bash*<br />

ls *bash*<br />

ls .*rc<br />

Beispiele für Metazeichenverwendung<br />

ls *.{jpg,gif,bmp}<br />

ls [abcd]*<br />

ls [a-d]*<br />

ls IMG[0-9]*.{JPG,jpg,JPEG,jpeg}<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 17


"Escapen"<br />

• Metazeichen werden von der Shell ausgewertet<br />

• Sollen Metazeichen als Argument an ein<br />

Programm übergeben werden, müssen sie<br />

"escaped" oder "gequotet" werden<br />

\<br />

" "<br />

' '<br />

`befehl`<br />

Zeichen rechts von "Backslash" wird<br />

zu einem regulären Zeichen<br />

Alle Sonderzeichen ausser $<br />

verlieren ihren Sonderstatus<br />

Alle Sonderzeichen werden als<br />

reguläre Zeichen gewertet<br />

Führt befehl aus und setzt dessen<br />

Ausgabe an diese Stelle<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 18


Einloggen auf Workshop-Rechner<br />

• telnet oder ssh<br />

• Adresse:<br />

rechner.franken.de<br />

oder<br />

192.168.1.2<br />

• MacOS X Nutzer: ssh login@rechner.franken.de<br />

• Login und Passwort siehe Handout<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 19


Das „Home“<br />

• Jeder Nutzer (User) auf einem <strong>Unix</strong>-System hat ein „home“<br />

• Das home „gehört“ in der Regel <strong>dem</strong> jeweiligen Nutzer<br />

• Die Zugriffsrechte für Dateien und Verzeichnisse kann der<br />

jeweilige Eigentümer und „root“ festlegen<br />

• Im „home“ liegen auch die Startup-Skripte der Shell sowie<br />

Konfigurationsdateien von Programmen<br />

• Das „home“ wird sehr schnell unordentlich<br />

• Die Shell setzt i.d.R. die Variable $HOME auf das jeweilige<br />

Home-Verzechnis eines Nutzers<br />

• Mit „cd“ ohne Argumente gelangt man auch wieder in das<br />

eigene „Home“-Verzeichnis<br />

• Home-Verzeichnisse anderer Nutzer mittels Tilde erreichbar:<br />

joerg@rechner> cd ~user02<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 20


ls -la<br />

• Zeige alle Dateien (-a) in der Langform (-l)<br />

• -a zeigt alle Dateien, inklusive Punkt-Dateien (z.B.<br />

".bash_profile")<br />

• -l zeigt Typ, Eigentümer, Gruppe, Berechtigungen<br />

und Änderungsdatum der Datei:<br />

-rw-r--r-- 1 joerg users 230 Jul 14 2005 .bash_profile<br />

-rw-r--r--<br />

1<br />

joerg<br />

users<br />

Jul 14 2005<br />

Typ und Rechte<br />

Anzahl der Links auf die Datei<br />

Eigentümer<br />

Gruppe<br />

Änderungsdatum<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 21


Dateirechte<br />

• Unterscheidung in<br />

– Eigentümer<br />

– Gruppe<br />

– Others<br />

• Für diese drei gibt es kombinierbare Rechte:<br />

– Lesen (r)<br />

– Schreiben (w)<br />

– Zugriff/Ausführen (x) wie eXecute.<br />

• Verzeichnisse ohne Zugriffsrechte (x) können nicht betreten<br />

werden<br />

• Der Inhalt von Verzeichnissen ohne Lesezugriff kann nicht<br />

angezeigt werden<br />

• In Verzeichnissen ohne Schreiberlaubnissen dürfen <strong>keine</strong><br />

Dateien angelegt, gelöscht oder umbenannt werden<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 22


Dateirechte ändern<br />

• Befehl um Datei-Rechte (mode) zu ändern:<br />

chmod [optionen] mode[,mode] datei ...<br />

• Die Rechte können numerisch oder mittels Buchstaben für user,<br />

group und other angegeben werden:<br />

chmod u=rw,og=r datum.txt<br />

• Der Numerische Wert errechnet sich aus den Oktalen werten von r,<br />

w und x:<br />

– x = 1, w = 2, r = 4 ! rw = 2 + 4 = 6, rx = 1 + 4 = 5, rwx = 7<br />

– user= read & write, other & group = read ! 0644<br />

chmod 0644 datum.txt<br />

• Rekursive Änderung der Rechte eines Verzeichnisses: -R<br />

chmod -R 0755 verzeichnis<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 23


Übung I<br />

1. Anlegen eines Verzeichnisses im Home mit <strong>dem</strong> Namen<br />

"public"<br />

2. Kopieren aller Dateien aus /home/beispiel/bilder/ in das<br />

neue Verzeichnis "public"<br />

3. Erstellen einer Datei "index.txt" mit <strong>dem</strong> Namen aller Bilder<br />

(nicht die Dateinamen mit einem Editor in die Datei<br />

schreiben!) in <strong>dem</strong> Verzeichnis "public"<br />

4. Sicherstellen, dass zwar andere Nutzer in das Verzeichnis<br />

"public" gelangen können und auch den Verzeichnisinhalt<br />

ansehen können. Aber <strong>keine</strong> anderen Nutzer sollen die<br />

Berechtigung haben sich die in <strong>dem</strong> Verzeichnis<br />

befindlichen Bilder anzusehen. Die Datei index.txt hingegen<br />

soll für andere Nutzer lesbar sein.<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 24


• cd<br />

Lösung I<br />

• mkdir public<br />

• cp /home/beispiel/bilder/* public<br />

• cd public<br />

• ls > index.txt<br />

• ls<br />

• chmod 0600 *.jpg<br />

• chmod u=rw,og=r index.txt<br />

• chmod u=rwx,og=rx .<br />

• ls -la<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 25


• echo<br />

• touch<br />

• date<br />

• wc<br />

• less<br />

• find<br />

• grep<br />

• cut<br />

• sort<br />

• kill<br />

Weitere nützliche Kommandos<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 26


echo<br />

• Ausgabe eines Textes<br />

– Builtin<br />

– System-Programm<br />

• Erlaubt die Ausgabe von Texten in einem Skript<br />

• Kann verwendet werden um den Inhalt von Shell-<br />

Variablen auszugeben:<br />

echo $HOME<br />

• Erzeugt ein Newline am Ende der Ausgabe<br />

• echo -n um Newline zu unterdrücken<br />

• echo -e um Escape-Zeichen auszuwerten:<br />

echo -e "\7"<br />

echo -e "\n"<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 27


touch<br />

• Ändert das Datum einer Datei<br />

• Legt die Datei an, falls sie nicht existiert<br />

Beispiele:<br />

• Lege Datei test.txt an:<br />

joerg@rechner> touch test.txt<br />

• Setze Datum der Datei test.txt auf den 1. Juni 2005:<br />

joerg@rechner> touch -d 20050601 test.txt<br />

joerg@rechner> ls -la test.txt<br />

-rw-r--r-- 1 joerg user 0 Jun 1 2005 test.txt<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 28


date<br />

• Anzeigen von aktuellem Datum und Uhrzeit<br />

joerg@rechner> date<br />

Fri Feb 17 13:04:36 CET 2006<br />

• Ausgabe kann nach eigenen Vorlieben formatiert werden:<br />

• %d = Tag im Monat (0..31), %m = Monat (1..12), %y = Jahr (00..99),<br />

%Y = Jahr (2006)<br />

• %H = Stunde (00..23), %M = Minuten (00..59), %S = Sekunden<br />

(00..59)<br />

• %B = Name des Monats (z.B: February), %a = Tagname kurz (Mon,<br />

Tue, ...), %A = Name des Tags ausgeschrieben (Monday, Tuesday,<br />

...)<br />

• %j = Tag des Jahres (0..366), %U = Nummer der Woche im Jahr (00 ..<br />

53)<br />

• Verwendungsbeispiel:<br />

joerg@rechner> date '+%Y%m%d'<br />

20060224<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 29


wc<br />

• "word count"<br />

• Zählt die Anzahl von Zeilen (Lines), die Anzahl der Wprter<br />

und die Anzahl der Zeichen insgesamt in der Datei oder der<br />

Eingabe<br />

joerg@rechner> wc test.txt<br />

0 0 0 test.txt<br />

joerg@rechner> date | wc<br />

1 6 29<br />

joerg@rechner> date | wc -l<br />

1<br />

joerg@rechner> ls | wc -l<br />

12<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 30


less<br />

• Bildschirmweise Ausgabe einer Datei<br />

• Vorwärtsblättern mit <br />

• Rückwärtsblättern mit <br />

• Beenden mit <br />

joerg@rechner> less /etc/passwd<br />

• Pager (Textanzeigeprogramm) für Applikationen ($PAGER)<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 31


find<br />

• Suchen von Dateien<br />

– Sehr "teuer" da hierbei wirklich der angebene Pfad<br />

durchgehangelt werden muss<br />

– Wenn "ältere" und "öffentliche" Dateien gesucht werden,<br />

bietet sich "locate" an<br />

• Viele mögliche Suchkritieren<br />

– Name<br />

– Neuer als ...<br />

– Exaktes Datum<br />

– Typ der Datei<br />

– Rechte der Datei<br />

– Eigentümer<br />

– Gruppenzugehörigkeit<br />

– Größe<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 32


Suchbeispiele<br />

find [pfad] [parameter] [kommando]<br />

# suche die Datei "geburtstage.txt" unterhalb von /home/example<br />

joerg@rechner> find /home/example -name geburtstage.txt -print<br />

# zeige Ergebnisse wie ein "ls -l" an:<br />

joerg@rechner> find /home/example -name geburtstage.txt -ls<br />

# suche alle Dateien unter /home/example, die mit .txt enden<br />

joerg@rechner> find /home/example -name \*.txt -print<br />

# suche alle Verzeichnisse unterhalb von /home/example<br />

joerg@rechner> find /home/example -type d -print<br />

# suche alle Dateien (Type = f[ile]) die mindestens 100k groß sind<br />

joerg@rechner> find /home/example -type f -size +100k -print<br />

# Suche Dateien, die in den letzten 48 Stunden geändert oder<br />

# neu angelegt wurden<br />

joerg@rechner> find /home/example -type f -mtime -2<br />

# Suche Dateien, die in den letzten 5 Minuten verändert wurden<br />

joerg@rechner> find /home/example -type f -mmin -2<br />

# Suche Dateien, die in den letzten 5 Minuten nicht verändert wurden<br />

joerg@rechner> find /home/example -type f -mmin +2<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 33


grep<br />

• Suche nach Textinhalten in einer Datei<br />

• Listet Zeilen, die den Suchbegriff in den angegebenen Dateien<br />

enthalten<br />

joerg@rechner> grep root /etc/passwd<br />

root:x:0:0:root:/root:/bin/bash<br />

• Wenn mehr als eine Datei durchsucht wird, wird der Name der<br />

Datei mit ausgegeben<br />

• Der Suchbegriff wird als regulärer Ausdruck (Regular Expression -<br />

regexp) ausgewertet<br />

grep root /etc/passwd<br />

grep ^ro /etc/passwd<br />

• Mittels "-v" kann die Suche negiert werden (Ausgabe aller Zeilen,<br />

die nicht den Suchbegriff enthalten)<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 34


Reguläre Ausdrücke<br />

– Beschreiben (Unter-)Mengen von Zeichenketten<br />

– Verwendet in sed, grep, vi, emacs, perl, php, ...<br />

[abc]<br />

[0-6]<br />

[a-zA-Z0-9]<br />

[^a]<br />

[:alpha:]<br />

[:digit:]<br />

[:alphanum:]<br />

[:print:]<br />

[:space:]<br />

[:upper:]<br />

[:lower:]<br />

^<br />

$<br />

[:punkt:]<br />

Einer der Buchstaben a,b,c<br />

Eine Ziffer von "0" bis "6"<br />

Beliebiger lateinischer Buchstabe inkl. Zahlen<br />

Alle Zeichen bis auf ein "a"<br />

Ein Zeichen des lateinischen Alphabets<br />

Ziffern<br />

Vereinigung von [:alpha:] und [:digit:]<br />

Druckbare Zeichen<br />

"Whitespace" Zeichen, Space, Tab, Newline, ...<br />

Großbuchstaben<br />

Kleinbuchstaben<br />

Zeilenanfang<br />

Zeilenende<br />

Zeichen wie ! " # $ % & , . - _ > < ( ) { }<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 35


?<br />

+<br />

*<br />

{n}<br />

{min,}<br />

{min,max}<br />

(a|b)<br />

Reguläre Ausdrücke<br />

Nichte jede Implementierung unterstützt alle Selektoren<br />

Beispiele:<br />

ls | grep '^[a-z]+[0-9]*.jpg$'<br />

grep '^root' /etc/passwd<br />

grep 'bash$' /etc/passwd<br />

grep '^....:' /etc/passwd<br />

Voranstehener Ausdruck ist "optional", er kann einmal oder<br />

nicht <strong>vor</strong>kommen<br />

Voranstehender Ausdruck muss mindestens einmal<br />

<strong>vor</strong>kommen<br />

Voranstehender Ausdruck kann beliebig oft <strong>vor</strong>kommen<br />

Der Ausdruck muss n mal <strong>vor</strong>kommen<br />

Der Ausdruck muss mindestens min mal <strong>vor</strong>kommen<br />

Voranstehender Ausdruck muss mindestens min mal, aber darf<br />

höchstens max mal <strong>vor</strong>kommen<br />

Ausdruck a oder b muss <strong>vor</strong>kommen<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 36


cut<br />

• Ausschneiden von Inhalten einer Zeile<br />

– Feste Zeichen<br />

– Felder mit wählbarem Trenner<br />

• Beispiele:<br />

Alle Account-Namen aus /etc/passwd ausgeben:<br />

cut -f1 -d: /etc/passwd<br />

Nur die Rechte der Dateien im aktuellen Verzeichnis:<br />

ls -l | cut -c2-11<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 37


sort<br />

• Sort zeilenweise die Eingabe und gibt sie wieder<br />

aus<br />

Alphabetisch sortierte Liste aller Accounts:<br />

cut -f1 -d: /etc/passwd | sort<br />

• Oft benötigt <strong>vor</strong> "uniq" um Doubletten zu filtern<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 38


ps<br />

• Liste von gestarteten Prozessen<br />

• Ohne Parameter nur die Prozesse der aktuellen<br />

Session<br />

• Abhängig vom System-Typ unterschiedliche<br />

Programmparameter; Argumente und Ausgaben<br />

nicht portabel zwischen verschiedenen <strong>Unix</strong>-Arten<br />

• Alle laufenden Prozesse auf einem Linux-Rechner:<br />

ps waux oder ps -ef<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 39


Übung II<br />

• Liste der Prozess-Ids aller momentan laufenden<br />

Prozesse auf <strong>dem</strong> KNF-Rechner, in aufsteigender<br />

Reihenfolge in die Datei pids.txt im $HOME<br />

speichern.<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 40


Lösung II<br />

ps waux | cut -c10-15|grep -v PID | sort -n > ~/pids.txt<br />

1. Ausegeben der Liste aller Prozesse<br />

2. Herausfiltern der Header-Zeile<br />

3. Herausschneiden der Zeichen, die die PID enthalten<br />

4. Sortieren<br />

5. Umleiten in Datei<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 41


Prozesskontrolle<br />

• Prozesse werden in der Regel "im Vordergrund" gestartet,<br />

d.h. solange der Prozess läuft, kann die Shell nicht<br />

anderweitig genutzt werden.<br />

• Prozesse können auch "im Hintergrund" gestartet werden<br />

langsamesprogramm &<br />

• Liste von in der Shell gestarteten und noch laufenden<br />

Prozessen:<br />

jobs<br />

• Die "jobs" können auch wieder in den Vordergrund geholt<br />

werden:<br />

fg %1<br />

• Oder getötet werden:<br />

kill %1<br />

• Oder können zum "weiterlaufen" veranlasst werden, wenn<br />

sie gestoppt sind:<br />

bg %1<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 42


Stoppen und Töten von Prozessen<br />

• Aktuell laufenden Prozess stoppen:<br />

[ + z]<br />

• Aktuell laufenden Prozess abbrechen:<br />

[ + c]<br />

• Anderen Prozess töten:<br />

kill [pid]<br />

PID kann z.B. mittels "ps" herausgefunden werden<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 43


Signale<br />

• Bei verschiedenen "Events" werden unterschiedliche Signale<br />

an Prozesse geschickt, die auch mittels "kill" aus <strong>dem</strong><br />

Userspace erzeugt werden können:<br />

HUP (1)<br />

INT (2)<br />

QUIT (3)<br />

TERM (15)<br />

USR1<br />

USR2<br />

STOP<br />

CONT<br />

ALRM<br />

KILL (9)<br />

"Hangup" - Termina/Verbindungl wurde gechlossen<br />

Unterbrechung durch Tastatur<br />

Beenden durch Tastatur<br />

Aufforderung zu Terminieren<br />

Durch den User definiertes Signal<br />

Durch den User definiertes Signal<br />

Prozessausführung anhalten<br />

Prozessausführung fortsetzen<br />

Timer-Event (normalerweise ausgelöst durch alarm())<br />

Der Nothammer - nur im Ausnamefall zu verwenden!<br />

joerg@rechner> kill -TERM 1891<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 44


• History<br />

bash interaktiv<br />

• anzeigen<br />

joerg@rechner> history<br />

1 pwd<br />

2 ls<br />

3 mkdir test<br />

• wiederholen:<br />

joerg@rechner> !3<br />

mkdir: cannot create directory `test': File exists<br />

• letztes Kommando modifizieren:<br />

joerg@rechner> ^test^temp<br />

mkdir temp<br />

• Mit den Cursor-Tasten durch die History navigieren<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 45


ash interaktiv<br />

• Zuletzte ausgeführtes Kommando wiederholen:<br />

!!<br />

• Modifikatoren für die History:<br />

:n wählt n-ten Parameter aus<br />

:n1-n2 :* wählt alle Parameter aus<br />

Beispiel:<br />

wählt Parameter n 1 bis n 2 aus<br />

joerg@rechner> ls /usr/local/src/nethack-3.4.3/src<br />

joerg@rechner> cd !!:*<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 46


Shell-Variablen<br />

• Variablen können z.B. mit "echo" angezeigt werden:<br />

echo $HOME<br />

• Durch einfache Zuweisungen wird einer Variablen ein Inhalt<br />

gegeben:<br />

myvar=Joerg<br />

• Auch die bash wird durch Variablen konfiguriert:<br />

$PS1<br />

$PATH<br />

$TERM<br />

• Path - Der Pfad, in <strong>dem</strong> ausführbare Programme gesucht<br />

werden<br />

echo $PATH<br />

PATH=$HOME/bin:/usr/local/bin:/usr/bin:/bin<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 47


Variablen-Export<br />

• Alle in einer Shell definierten Variablen sind <strong>vor</strong>erst nur in der<br />

Shell gültig, in der sie gesetzt wurden<br />

• Variablen können an "Kind"-Prozesse weitergereicht<br />

(exportiert) werden:<br />

LANG=de_DE<br />

export LANG<br />

• In der bash kann Zuweisung und Export kombiniert werden:<br />

export LANG=de_DE<br />

• Anzeige aller Variablen<br />

set<br />

• Anzeige aller exportierten Variablen<br />

env<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 48


Spezielle Variablen-Verwendung<br />

• Verwendung eines Default-Werts, falls die Variable nicht<br />

existiert:<br />

${variable-wert}<br />

• Wert-Zuweisung falls Variable <strong>vor</strong>her nicht gesetzt war<br />

${variable=wert}<br />

• Wenn Variable existiert einen bestimmten Wert zurückliefern<br />

${variable+wert}<br />

• Beispiel: falls noch kein PATH gesetzt ist soll er mit einem<br />

Default-Pfad gesetzt werden:<br />

PATH=${PATH=/usr/local/bin:/usr/bin:/bin}<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 49


Der <strong>Prompt</strong><br />

• Der <strong>Prompt</strong> der Bash wird über die Variable PS1<br />

konfiguriert<br />

• Expansion von Escape-Zeichen:<br />

• \A Uhrzeit im 24-Stunden Format<br />

• \u Name des Nutzers, der die Shell gestartet hat<br />

• \h Hostname auf <strong>dem</strong> die Shell läuft<br />

• \w momentanes Arbeitsverzeichnis<br />

• \W letzte Komponente des Arbeitsverzeichnisses<br />

• \! Aktuelle History-Nummer<br />

• \l DasTTY, auf <strong>dem</strong> die Shell läuft<br />

joerg@rechner> PS1='\A \u@\h \W \!>'<br />

12:27 joerg@rechner tmp 3><br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 50


Aliase<br />

• Kommandos können inklusive derer Argumente zur<br />

Vereinfachung abgekürzt bzw. unter einem alternativen<br />

Namen geführt werden<br />

alias lla='ls -la'<br />

alias sl=ls<br />

• Die Aliase sind nur in der Shell bekannt, in der sie definiert<br />

wurden<br />

• Anzeige eines Alias:<br />

alias lla<br />

• Löschen eines Alias:<br />

unalias lla<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 51


Shell-Skripte<br />

• Ansammlung von Befehlen<br />

• Konfiguration der Shell (.bash_profile, .bashrc)<br />

• Kleines Programm<br />

• Initialisierung einer Umgebung für ein Programm<br />

• Installations-Routine für ein Programm<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 52


Skript<br />

• Damit der <strong>Unix</strong>-Kernel beim Starten eines Programms weiß,<br />

welcher Interpreter zuständig ist, muss am Anfang der Datei<br />

Doppelkreuz und Ausrufezeichen gefolgt von <strong>dem</strong> Pfad zum<br />

Interpreter stehen<br />

#! /bin/sh<br />

#<br />

# gebe Datum aus<br />

date<br />

• Zeilen mit Doppelkreuz/Raute am Anfang sind<br />

Kommentarzeilen. Alle der Raute folgenden Zeichen werden<br />

nicht interpretiert<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 53


Übung III<br />

• Das erste eigene Shell-Skript: "count1.sh"<br />

– Ausgabe der Uhrzeit zum Startzeitpunkt<br />

– Ausgabe der Anzahl von Dateien in und Unterhalb eines<br />

angegebenen Verzeichnis<br />

– Ausgabe der Anzahl von Verzeichnissen in und unterhalb des<br />

angegebenen Verzeichnisses<br />

– Ausgabe der Uhrzeit wann die Suche abgeschlossen ist<br />

• Hinweis<br />

– Der erste <strong>dem</strong> Skript beim Aufruf übergebene Parameter ist in <strong>dem</strong><br />

Skript aus der Variable $1 auszulesen<br />

– Aufruf des Programms:<br />

./count1.sh /home/example<br />

– Ausgabe des übergebenen Parameters:<br />

echo $1<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 54


Count1.sh:<br />

#! /bin/sh<br />

Lösung III<br />

date +%H:%M:%S<br />

echo -n "Anzahl Dateien: "<br />

find $1 -type f | wc -l<br />

echo -n "Anzal Verzeichnisse: "<br />

find $1 -type d | wc -l<br />

date +%H:%M:%S<br />

• Das erstellte Skript muss durch chmod a+x count1.sh erst die Rechte<br />

erhalten, ausgeführt werden zu können!<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 55


Zu einfache Lösung?<br />

– Wenn vom Aufrufer kein Argument mitgegeben wird, beginnt<br />

find bei "/" zu suchen und legt das System lahm<br />

– Existieren Verzeichnisse, für die der Nutzer <strong>keine</strong> Search<br />

und/oder Read-Erlaubnis hat erhält er beim Ablauf Fehler<br />

– Existiert das angegebene Verzeichnis nicht, erhält der<br />

Aufrufer <strong>keine</strong> angemessene Fehlermeldung<br />

• Was fehlt?<br />

– Bedingungen<br />

– Möglichkeit der Überprüfung des Übergabeparameters ($1)<br />

– Fehler von "find" unterdrücken<br />

– Abfragen ob Startverzeichnis existiert<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 56


Bedingungen<br />

• Bedingte Ausführung von Blöcken<br />

If .. then .. else fi<br />

if [ "x$1" != "x" ]<br />

then<br />

echo "okay"<br />

else<br />

echo "kein parameter!"<br />

exit<br />

fi<br />

Trick: testen ob "x$1" identisch mit x war, dadurch wird<br />

überprüft ob $1 einen leeren String enthielt.<br />

Besser:<br />

if [ -n "$1" ]; then<br />

echo "okay"<br />

fi<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 57


Bedingung & Verknüpfung<br />

if [ "`date +%m`" = "04" ]<br />

then<br />

echo "Vorsicht April, welchselhaftes Wetter!"<br />

fi<br />

Da nach <strong>dem</strong> Test nur ein Befehl ausgeführt wird, benötigt<br />

obiger Code <strong>keine</strong> Block-Anweisung:<br />

[ "`date +%m`" = "04" ] && echo "Vorsicht April!"<br />

Verknüpfung von Befehlen abhängig von deren Return-Code:<br />

– Kommando2 ausführen wenn kommando1 erfolgreich war:<br />

kommando1 && kommando2<br />

– Kommando2 ausführen wenn kommando1 nicht erfolgreich war:<br />

kommando1 || kommendo2<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 58


Bedingung & Verknüpfung<br />

• Erzeuge ein Verzeichnis, wenn dies angelegt<br />

werden konnnte wechsle in selbiges:<br />

mkdir verzeichnis && cd verzeichnis<br />

• Kann in das Verzeichnis gewechselt werden,<br />

wenn nein lege dieses Verzeichnis an und<br />

wechsle dann:<br />

cd verzeichnis || ( mkdir verzeichnis && cd verzeichnis )<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 59


n1 -eq n2<br />

n1 -lt n2<br />

n1 -le n2<br />

n1 -gt n2<br />

s1 = s2<br />

s1 != s2<br />

-z s1<br />

-n s1<br />

-e datei<br />

-f datei<br />

-d datei<br />

-r datei<br />

-w datei<br />

-x datei<br />

-s datei<br />

a1 -a a2, a1 -o a2<br />

Vergleiche und Tests<br />

Wahr wenn die Zahlen n1 und n2 gleich sind (equal)<br />

Wahr wenn die Zahl n1 kleiner ist als n2 (less than)<br />

Wahr wenn die Zahl n1 kleiner oder gleich n2 ist (less or equal)<br />

Wahr wenn die Zahl n1 größer ist als n2 (greater than)<br />

Wahr wenn die Zeichenkette s1 gleich der Zeichenkette s2 ist<br />

Wahr wenn die Zeichenkette s1 ungleich der Zeichenkette s2 ist<br />

Wahr wenn die Länge der Zeichenkette s1 gleich Null ist<br />

Wahr wenn die die Zeichenkette mindestens ein Zeichen enthält<br />

Wahr wenn die Datei existiert (exists)<br />

Wahr wenn die Datei eine normale Datei (kein Verzeichnis) ist (file)<br />

Wahr wenn die Datei ein Verzeichnis ist (directory)<br />

Wahr wenn der aufrufende Benutzer Leserechte für die Datei hat (read)<br />

Wahr wenn der aufrufende Benutzer Schreibrechte für die Datei hat (write)<br />

Wahr wenn die Datei für den Benutzer Ausführrechte besitzt (execute)<br />

Wahr wenn die Datei mehr als 0 Zeichen/Bytes enthält<br />

Und (and) bzw. Oder (or) Verknüfung zweier Ausdrücke<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 60


#! /bin/sh<br />

Vergleiche und Tests<br />

# Test, ob ein Parameter übergeben wurde<br />

if [ -z "$1" ]; then<br />

echo "Erforderlicher Parameter fehlt"<br />

exit<br />

fi<br />

# Test ob Parameter ein Verzeichnis angibt<br />

if [ ! -d $1 ]; then<br />

echo "Angegebenes Verzeichnis existiert nicht" \<br />

"oder ist kein Verzeichnis"<br />

exit<br />

fi<br />

# alle Fehler von "find" nach /dev/null umleiten<br />

(find $1 -type f | wc -l) 2> /dev/null<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 61


Case-Blöcke<br />

• Vergleich einer Zeichenkette mit Mustern, je nach<br />

zutreffen<strong>dem</strong> Muster wird ein Code-Block ausgeführt<br />

# Januar, February, ...<br />

monat="`date +%B`"<br />

case "$monat" in<br />

January)<br />

echo "ein kalter Monat"<br />

;;<br />

February)<br />

echo "ein naerrischer Monat"<br />

echo "oft auch sehr kalt"<br />

;;<br />

M*)<br />

echo "ein Monat mit M"<br />

;;<br />

*)<br />

echo "ein komischer Monat“<br />

;;<br />

esac<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 62


While-Blöcke<br />

• Eine Aktion ausführen solange eine Bedingung erfüllt ist<br />

while true<br />

do<br />

done<br />

date<br />

sleep 5<br />

• Beispiel: An das Skript übergebene Parameter ausgeben<br />

einzeln ausgeben:<br />

while [ -n "$1" ]<br />

do<br />

done<br />

echo "Parameter: $1"<br />

shift<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 63


For-Schleifen<br />

• Gängigste Anwendung in Shell-Skripten: das Durchlaufen einer<br />

Liste<br />

for name in hans klaus peter markus<br />

do<br />

echo "Der $name geht einkaufen."<br />

done<br />

• Zu durchlaufende Liste dynamisch:<br />

for file in `/bin/ls /etc/*`<br />

do<br />

[ -f $file -a -r $file ] && grep root $file<br />

done<br />

• Unnützes ls:<br />

for file in /etc/*<br />

do<br />

[ -f $file -a -r $file ] && grep pass $file<br />

done<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 64


Übung IV<br />

• Erstellung eines Skripts, das eine Liste aller Nutzer<br />

liefert, deren Home-Verzeichnisse für den Aufrufer<br />

des Skripts lesbar sind<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 65


#! /bin/sh<br />

Lösung IV<br />

for user in `cut -f1 -d: /etc/passwd`<br />

do<br />

done<br />

homedir="`grep ^$user: /etc/passwd | cut -f6 -d:`"<br />

if [ -n "$homedir" -a -r "$homedir" ]; then<br />

fi<br />

echo $homedir<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 66


Übung V<br />

• Im Verzeichnis $HOME/public/ liegt noch aus<br />

Übung I eine Sammlung von Bildern.<br />

Alle Bilder sind benannt wie IMG20060126_1.jpg<br />

• Diese Bilder sollen mittels eines Skripts in<br />

Unterverzeichnisse sortiert werden, welche bei<br />

Bedarf durch das zu erstellende Skript angelegt<br />

werden müssen.<br />

• Die Bilder sollen nach Jahr, Monat und Tag<br />

getrennt in Verzeichnisse einsortiert werden, also<br />

z.B.: public/2006/01/26/ IMG20060126_1.jpg<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 67


Der Platz<br />

• Feststellen, wie groß der verfügbare, gesamte und genutzte<br />

Platz auf einem "Filesystem" (Partition/Netzlaufwerk) ist:<br />

df <br />

Beispiel:<br />

df -k /home<br />

df -h /home<br />

• Feststellen, wieviel Platz von einem Verzeichnis genutzt<br />

wird:<br />

du<br />

Beispiel:<br />

du -s -k /home/example<br />

• -s: Summary<br />

• -k: in Kilobyte<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 68


Gadgets<br />

• Tools, deren Nutzen ausschließlich oder<br />

hauptsächlich für interaktive Sessions interessant<br />

ist:<br />

– w<br />

– top<br />

– finger ()(@host)<br />

– id ()<br />

• Heutzutage eher nicht mehr gebrauchte Gadgets:<br />

– write (@host)<br />

– talk (@host)<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 69


Mailversand<br />

• mail/mailx <br />

• Beispiel:<br />

date | mailx joerg@rechner.franken.de<br />

• Versand mit einem Subject:<br />

date | mailx -s "Ich bin beim Workshop" joerg@rechner<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 70


• tar<br />

(Datei-)Archive<br />

• Erzeugt Archive von Dateien und Directories<br />

• Ursprünglich für Bandlaufwerke gedacht<br />

• tar alleine komprimiert nicht<br />

• Erzeugen eines tar-Archivs:<br />

tar -cvf <br />

• c: create<br />

• v: verbose<br />

• f: file<br />

• Auspacken<br />

tar -xvf <br />

• x: extract<br />

• Optionen:<br />

• Z: compress (compress)<br />

• z: compress (gzip)<br />

• j: compress (bzip2)<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 71


Komprimieren<br />

• compress - Urgestein der Komprimierer unter <strong>Unix</strong><br />

compress datei.tar<br />

uncompress datei.tar.Z<br />

• gzip - höherer Komprimierungsfaktor als compress<br />

gzip datei.tar<br />

gunzip datei.tar.gz<br />

• bzip2 - neuer, komprimiert am stärksten, langsam<br />

bzip2 datei.tar<br />

bunzip2 datei.tar.bz2<br />

• Verknüpfung:<br />

gzip -d -c datei.tar.gz | tar -xvf -<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 72


Übersetzen von Programmen<br />

• C-Compiler (cc bzw. gcc)<br />

• Makefiles<br />

• configure-Skripte<br />

– Auf allen modernen Systemen ist ein GNU C-Compiler<br />

<strong>vor</strong>handen<br />

– Mittels Makefile werden Aufrufe des Compilers und anderer<br />

Tools zusammengefasst und gesteuert (Abhängigkeiten).<br />

– configure-Skripte übernehmen die Arbeit Makefiles und<br />

include-Files an das jeweilige System anzupassen und<br />

ermöglichen es <strong>dem</strong> Anwender optionale Programmteile zu<br />

aktivieren oder deaktivieren<br />

– In der Regel werden Programm-Sourcen als komprimierte<br />

tar-Archive verbreitet<br />

– Makefiles sind Konfigurationsfiles für das Programm "make"<br />

– Es ist üblich dass "make" eine Übersetzung der Sourcen<br />

startet und das Target "install" im Makefile <strong>vor</strong>handen ist<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 73


Makefile<br />

• Beispiel: Makefile für das Programm "langsam"<br />

CC = /usr/bin/gcc<br />

LD = /usr/bin/gcc<br />

DEFINES = -DDEBUG<br />

PREFIX = /usr<br />

CFLAGS = -Os -Wall<br />

all: langsam<br />

langsam: langsam.c<br />

$(CC) -o langsam $(CFLAGS) $(DEFINES) langsam.c<br />

install: langsam<br />

install -o root -g root langsam $(PREFIX)/bin<br />

clean:<br />

rm -f *.o langsam<br />

Makefile und Programm-Source in ~example/langsam/<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 74


Übung VI - Installation von wget<br />

• Das Programm "wget", welches es einem<br />

ermöglicht aus der Kommandozeile heraus Web-<br />

Seiten zu "saugen" soll in das eigene Home<br />

installiert werden<br />

• Sourcen sind auf <strong>dem</strong> Demo-Rechner unter<br />

~example/wget-1.9.1.tar.gz <strong>vor</strong>gehalten<br />

• "wget" wird mittels configure-Skript konfiguriert<br />

• Das "configure"-Skript unterstützt die Spezifikation<br />

eines Prefixes, unterhalb dessen das Programm<br />

installiert wird:<br />

--prefix=${HOME}<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 75


Lösung VI<br />

joerg@rechner[~]> tar xvzf ~example/wget-1.9.1.tar.gz<br />

joerg@rechner[~]> ls<br />

joerg@rechner[~]> cd wget-1.9.1/<br />

joerg@rechner[~/wget-1.9.1]> ./configure --prefix=$HOME<br />

joerg@rechner[~/wget-1.9.1]> make<br />

joerg@rechner[~/wget-1.9.1]> make install<br />

joerg@rechner[~/wget-1.9.1]> ~/bin/wget http://www.franken.de/<br />

joerg@rechner[~]> PATH=${PATH}:${HOME}/bin/<br />

joerg@rechner[~]> wget http://www.franken.de/<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 76


xargs<br />

• Problem: ein Programm erzeugt eine Ausgabe, die<br />

ein anderes Programm als Parameter erhalten soll<br />

• Einfachste Lösung:<br />

touch `ls`<br />

• Problem: die Ausgabe ist zu groß, so daß die<br />

Kommandozeile zu lang<br />

ls | xargs touch<br />

• Problem: das Programm unterstützt nur einen<br />

Parameter<br />

ls | xargs -n 1 touch<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 77


xargs + find<br />

find /home/example -name *.txt -print | xargs grep joerg<br />

• Problem: in der Ausgabe von find befinden sich Dateinamen,<br />

die ein Leerzeichen enthalten. Die Leerzeichen werden von<br />

xargs als Trenner von Argumenten interpretiert, so dass grep<br />

mit Teilen von Namen aufgerufen wird<br />

find /home/example -name *.txt -print0 | xargs -0 grep joerg<br />

• Mittels des Kommando-Parameter -print0 für find werden in<br />

der Ausgabe die Dateinamen mittels eine "0" Zeichens<br />

getrennt. Die Option "-0" weist xargs wiederum an, das Ende<br />

von Parametern anhand eines 0-Zeichens zu erkennen, so<br />

dass die Leerzeichen in Dateinamen nicht als Trenner<br />

interpretiert werden<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 78


cron<br />

• Zeitgesteuerte Ausführung von Kommandos<br />

• Kommandos können abhängig von Minute, Stunde, Tag,<br />

Monat, Wochentag ausgeführt werden<br />

• Konfigurationsfile kann durch das Kommando "crontab"<br />

editiert und angezeigt werden:<br />

– crontab -l : "list" crontab<br />

– crontab -e : "edit" crontab<br />

• Hilfe zum Format des Konfigurations-Files: man 5 crontab<br />

• Das Kommando "crontab" startet zum Editieren den Editor,<br />

der in der Umgebungsvariable VISUAL definiert ist, "vi" falls<br />

die VISUAL-Variable nicht gesetzt ist<br />

• Von cron ausgeführte Kommandos haben <strong>keine</strong> Eingabe!<br />

• Ausgaben von cron werden per Mail an den Eigentümer<br />

geschickt<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 79


Cron-Beispiele<br />

• Stündlich das Datum in eine Log-Datei schreiben<br />

13 * * * * /bin/date > $HOME/stuendlich.log<br />

• Jeden Morgem um 6:59 eine Mail<br />

59 6 * * * echo "Guten Morgen" | mail $USER<br />

• Jeden ersten des Monats eine Mail<br />

1 1 1 * * echo "Es ist Zeit den Kontoauszug zu holen"<br />

• Am 23.12 an Weihnachten errinnern<br />

1 1 23 12 * echo "Bis morgen Geschenke besorgen!"<br />

Shell - <strong>keine</strong> <strong>Angst</strong> <strong>vor</strong> <strong>dem</strong> <strong>Unix</strong> <strong>Prompt</strong> 80

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!