Donnerstag, 24. September 2009

 

Übungsbeispiel bash - Lösungen

Eine kleine Übung für die Verwendung von bash und Linux/Unix-Befehlen und die Verkettung mit Pipes.
Laden Sie sich die Datei suchedateien.tgz herunter und packen Sie dieses Archiv aus.
$ tar xzf suchedateien.tgz
$ cd hp


Mit welcher Kommandozeile (jeweils eine pro Aufgabe) kann man folgende Informationen ermitteln?
  1. Liste von Dateien mit der Endung txt
    $ find . -name '*.txt'
    ./beisp.txt
    ./retabTest.txt
    ./strbsp.txt
    ./vim.txt
    ./dateien.txt
    ./probetest.txt
    ./camel.pl.txt
    ./gruppenwechsel/readme.txt
    ./testsitzplan.txt
    ./getline_testdaten.txt

  2. Anzahl der Dateien mit der Endung txt
    $ find . -name '*.txt'|wc -l
    10
  3. Liste von Textdateien (das sind nicht nur Dateien mit der Endung txt sondern z.B. auch Source-Files)
    $ find .|xargs file|grep -i text
    ./zz.c: ISO-8859 C program text
    ./2-dim-array.html: HTML document text
    ./stil.c: ASCII C program text
    ./hauf.c~: ISO-8859 C program text
    ./kreis.c~: ISO-8859 C program text
    ./int-div.c~: ASCII C program text
    ...viele Dateien...
    ./kreis.c.ps:                  PostScript document text conforming DSC level 3.0
    ./ziffern.c: ISO-8859 C program text
    ./dnf_knf.c~: ISO-8859 C program text
    ./readint.c~: ISO-8859 C program text
    ./getline_testdaten.txt: ASCII text
    ./optionen.c: ISO-8859 C program text
  4. Anzahl der Textdateien
    $ find .|xargs file|grep -i text|wc -l
    250
  5. Liste von Dateien mit der Endung c
    $ find . -name '*c'
    ./zz.c
    ./stil.c
    ./box.c
    ./hauf.c
    ./banner.c
    ./demostderr.c
    ./alloc.c
    ./getopt.c
    ./floathex.c
    ./stringfehler.c
    ...viele Dateien...
  6. Anzahl der Dateien mit der Endung c
    $ find . -name '*c'|wc -l
    121
  7. Liste der Dateien mit der Endung c, die nicht den Namen Haberstroh enthalten
    $ find . -name '*c'|xargs grep -L -i haberstroh
    ./floathex.c
    ./dateien-abc.sxc
    ./patmatch.c
    ./ostern.c
    ./alloc
    ./einZeichen.c
    ./artikelc
    ./wochentag-unformatiert.c
    ./dnf_knf.c
    ./hanoi-gr.c
  8. Anzahl der Dateien mit der Endung c, die nicht den Namen Haberstroh enthalten
    $ find . -name '*c'|xargs grep -L -i haberstroh|wc -l
    10
  9. Liste der Dateien, die keine Textdateien sind
    $ find . |xargs file|grep -vi text
    .: directory
    ./dir: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped
    ./upn: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped
    ./wzz: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped
    ./hauf: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped
    ./stdio: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped
    ./strukturbsp: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped
    ./sort4z: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped
    ./komplex: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped
    ./tictactoe-ai-new: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped
    ...viele Dateien...
  10. Anzahl der Dateien, die keine Textdateien sind
    $ find . |xargs file|grep -vi text|wc -l
    118


Hinweis: Die Lösungen für die Beispiele 3 und 9 kann man noch verbessern. file gibt ja die Information in der Form ./komplex: ELF 32... aus. Wenn wirklich nur die Dateinamen gewünscht sind, könnte man für Beispiel 9 folgenden Befehl angeben:
$ find . |xargs file|grep -vi text|while read x;do IFS=":";set $x;echo $1;done
.
./dir
./upn
./wzz
./hauf
./stdio
./strukturbsp
./sort4z
./komplex
./tictactoe-ai-new
...viele Dateien...
Der Trick besteht darin, den "Input File Separator" IFS auf den Doppelpunkt zu setzen und dann immer nur das erste Element auszugeben. Das ganze in einer Schleife.
Dies ist aber sehr fortgeschrittenes bash-Programmieren und geht weit über das in der Schule benötigte Wissen hinaus.

Labels: , ,


 

Übungsbeispiel bash

Eine kleine Übung für die Verwendung von bash und Linux/Unix-Befehlen und die Verkettung mit Pipes.
Laden Sie sich die Datei suchedateien.tgz herunter und packen Sie dieses Archiv aus.

Mit welcher Kommandozeile (jeweils eine pro Aufgabe) kann man folgende Informationen ermitteln?
  1. Liste von Dateien mit der Endung txt
  2. Anzahl der Dateien mit der Endung txt
  3. Liste von Textdateien (das sind nicht nur Dateien mit der Endung txt sondern z.B. auch Source-Files)
  4. Anzahl der Textdateien
  5. Liste von Dateien mit der Endung c
  6. Anzahl der Dateien mit der Endung c
  7. Liste der Dateien mit der Endung c, die nicht den Namen Haberstroh enthalten
  8. Anzahl der Dateien mit der Endung c, die nicht den Namen Haberstroh enthalten
  9. Liste der Dateien, die keine Textdateien sind
  10. Anzahl der Dateien, die keine Textdateien sind

Labels: , ,


Sonntag, 20. September 2009

 

Entwicklungsumgebung für veschiedene Programmiersprachen einrichten

Richten Sie sich eine Entwicklungsumgebung ein, mit der Sie Java, C, C++, Ruby, Groovy und evtl. Python programmieren können. Weiters sollte es möglich sein, Projekte in einem CVS-Repository abzulegen.
Der Schwerpunkt - auch im Hinblick auf die Reife- und Diplomprüfung - liegt auf Java, aber im Laufe des Jahres werden die anderen Sprachen verwenden.
Für Ihre Projekte (Programmbeispiele) sollten Sie sowieso eine Versionsverwaltung einsetzen. In der Schule haben wir einen CVS-Server eingerichtet. Auf diesem System müssen Sie außerdem Ihre Beispiele abgeben.
Ich empfehle eclipse oder netbeans als Entwicklungsumgebung (wobei ich mir nicht sicher bin, ob netbeans auch ein Groovy-Plugin hat).
Falls Sie noch keinen Zugang zum CVS-Server haben, melden Sie sich bei mir.

"Abgabe": erstellen Sie folgende Projekte und checken Sie diese auf dem CVS-Server ein.
name ersetzen Sie bitte durch Ihren Familiennamen. Die Projekte sollen jeweils "Hello World"-Programme in der gegebenen Programmiersprache enthalten.

Termin: Montag 5.10.2009 um 8:40

Labels: , , , , , , , , , , ,


 

Bash (Shell)

Das Betriebssystem, in unserem Falle Linux, stellt eine Schnittstelle zwischen Anwendungsprogrammen und der Hardware (Tastatur, Bildschirm, Maus, Festplatten, Netzwerk,...) dar. Das Betriebssystem ist also eine virtuelle Maschine mit einfachen Aufrufen zur Bedienung der Hardware.

Eine Shell ist nun ein Anwendungsprogramm, welches Eingaben vom Benutzer in geeignete Betriebssystemaufrufe umsetzt und ggf. andere Programme aufruft (d.h. das Betriebssystem mit einem bestimmten Aufruf das Programm starten lässt).
Darstellung Shell - schalenförmig über Betriebssystem über Hardware
Auch andere Betriebssysteme haben zur Bedienung Shells: Unter Windows NT/2000/XP gibt es CMD.EXE.
Die bash ist ein Interpreter mit einer vollständigen Programmiersprache. Es können damit on-the-fly kleine Programme mit Schleifen, Abfragen etc. erstellt werden, ohne dass man einen Editor dazu bemühen muss.
Da die Eingabe über die Tastatur speziell bei langen Pfadnamen (255 Zeichen für einen Dateinamen!) sehr mühsam und fehleranfällig ist, bietet die bash einige nützliche Features (einige dieser Features gibt es erstmals auch in der Shell von Windows XP):

Ergänzung der Kommandozeile

Kommandos oder Pfade brauchen nicht vollständig eingetippt werden. Meist genügen wenige Buchstaben, die dann durch Drücken der Taste TAB (Tabulator) auf den richtigen Pfad (das richtige Kommando) ergänzt werden. Falls der Pfad nicht eindeutig ergänzt werden kann, werden alle Möglichkeiten durch neuerliches Drücken von TAB angezeigt. Pfade werden immer zum nächsten Directory ergänzt oder zumindest soweit sie eindeutig sind.

History

Die letzten Befehle können mit den Cursor-Tasten ausgewählt und editiert werden.
Mit !! wird der letzte Befehl ausgeführt, mit !-2 wird der vorletzte mit !-3 der vorvorletzte usw. ausgeführt. Mit !15 wird der 15. Befehl ausgeführt.
Mit !string wird der letzte Befehl, der mit string begonnen hat, ausgeführt.
Mit !?string? wird der letzte Befehl, der string enthält ausgeführt.
Mit string1^string2 wird das letzte Kommando ausgeführt, wobei string1 durch string2 ersetzt wird.
Der Befehl history zeigt eine Liste der letzten Kommandos (mit deren Nummer) an.
Durch Drücken von ^r (Strg+R) kommt man in den Kommando-Suchmmodus, d.h. es wird das letzte Kommando angezeigt, welches die im folgenden getippten Buchstaben enthält. Mit weiteren ^r kommt man zum nächsten Befehl, der die Buchstaben enthält. Mit Enter wird der Befehl ausgeführt, mit den Links- und Rechts-Pfeiltasten kann der gewählte Befehl editiert werden.
Weiteres siehe unter man bash.

Beispiele ($ stellt den Prompt dar, alles hinter # gilt als Kommentar):
$ vim Telegramme.c                    # editieren
$ gcc -o telegramme Telegramme.c # compilieren
$ telegramme # ausführen
$ !v # Wiederholung von vim
$ !gc # neuerliches compilieren
$ !t # Aufruf von telegramme

Job-Control

Ein laufendes Programm kann mit ^z (Strg-Z) unterbrochen werden. Danach kann mit der bash weitergearbeitet werden. mit dem Befehl fg kann das letzte unterbrochene Programm wieder fortgesetzt werden.
Es können auch mehrere Programme unterbrochen werden (z.B. vim wird unterbrochen, man fprintf aufgerufen, dieses Kommando wird unterbrochen usw.). Die unterbrochenen Programme können mit jobs aufgelistet werden. Ein bestimmtes gestopptes (unterbrochenes) Programm mit der Job-Nummer 2 kann mit fg %2 wieder in den Vordergrund gebracht werden.
Mit diesen Möglichkeiten kann leicht zwischen mehreren Programmen hin- und hergeschaltet werden.
Programme, die vermutlich länger ohne Eingaben vom Benutzer laufen werden, können durch Anhängen von & als Hintergrundprozesse gestartet werden. Ein Hintergrundprozess kann ebenfalls mit fg wieder in den Vordergrund gebracht werden.

Beispiel: es sollen alle C-Files gesucht werden und die Namen (Pfade) in einer Liste gespeichert werden ($ ist der Prompt, wird also nicht eingegeben):

$ find / -name '*.c' -print > c-files.txt &
[1] 3751 # Job-Nummer und Prozess-ID wird angezeigt
$ vim Telegramme.c
[1]+ Done find . -name '*.c' -print >c-files.txt # Benachrichtigung, dass Kommando fertig
$ less c-files.txt # Anzeigen des Files

Obiges Kommando könnte mittels kill %1 oder kill 3751 (kill und Prozess-ID) vorzeitig abgebrochen werden.
Programme im Vordergrund können mit ^c (Strg+C) abgebrochen werden.

Befehlssyntax

Generell sind Unix-Kommandos wie folgt aufgebaut:

$ cmd [optionen] [argument]...

Die eckigen Klammern [ ] zeigen an, dass dieser Teil optional ist. Die drei Punkte ... bedeuten, dass der Teil davor mehrfach vorhanden sein kann.
Prinzipiell können immer mehrere Parameter angegeben werden. Optionen beginnen immer mit einem Minus (-) und werden von einem Buchstaben gefolgt. Mehrere Optionen können zusammengefasst werden. z.B. ls -a -l kann auch als ls -al eingegeben werden.
Viele (neuere, GNU-) Programme erlauben auch lange Optionen, d.h. ganze Wörter zur Bezeichnung einer Option. Solche Optionen beginnen mit zwei Minus (). Das Kommando find ist hier eine Ausnahme (s.o.).

Beispiel: ls -l und ls –format=long geben beide den Inhalt des Verzeichnisses im langen Format aus.
Generell sind Wildcards und reguläre Ausdrücke als Argumente möglich (die Shell erweitert reguläre Ausdrücke auf Listen von Parametern, d.h. das Kommando wird dann mit einer Liste aller passenden Files aufgerufen).

Wildcards

Wildcards sind Ersetzungsmuster, die von der Shell ersetzt werden. Wenn Sie z.B. alle Dateien auflisten wollen, die mit einem 'a' beginnen, dann geben Sie echo a* ein. Es werden dann Dateien der Art a, a1, abc, alloc.c aufgelistet, falls sie existieren. Der '*' steht für kein, ein oder mehrere beliebige Zeichen. Wenn Sie Dateien suchen, die ein 'z' enthalten, dann geben Sie echo *z* ein. Tatsächlich ändert aber die Shell die Parameterliste für den Befehl echo, d.h. die Shell erzeugt eine Liste von Dateinamen, auf die das Muster zutrifft und ruft dann erst echo auf.

Nehmen Sie an, das aktuelle Verzeichnis enthielte folgende Dateien:

a.c zahlen.c anz.c anz.h anz hello.c a.out

Wenn Sie nun

echo *z*

eingeben, erzeugt die Shell folgenden Aufruf

echo zahlen.c anz.c anz.h

und führt den Befehl aus. echo braucht sich nicht darum zu kümmern!

Die Shell versteht noch andere Musterangaben. Beispielsweise:

[aeiou]* alle Dateien, die mit einem Selbstlaut beginnen
[0-9a-h]* alle Dateien, die mit 0 bis 9 oder a bis h beginnen
?? alle Dateien, die aus genau 2 Zeichen bestehen (? steht für ein Zeichen)
*.[^ch] alle Dateien, die nicht mit .c oder .h enden
\* alle Dateien, die einen Stern enthalten

Mehr dazu unter man bash.

Abkürzungen

Tilde ~
~/ ist eine Abkürzung für das Home-Verzeichnis des angemeldeten Benutzers (meist /home/user, wenn user der Loginname).
~user/ ist die Abkürzung für das Homeverzeichnis des Users user.

alias
Mit dem Befehl alias können selbst Abkürzungen zu längeren Befehlen gemacht werden:

alias md="mkdir" md ist nun eine Kurzversion von mkdir (MaKe DIRectory)

Sie können mehrere immer wieder verwendete Abkürzungen in der Datei .bashrc speichern. .bashrc ist eine Datei, die automatisch beim Starten einer bash interpretiert (ausgeführt) wird.
Der Befehl alias ohne Argumente gibt die Liste der derzeit aktiven Abkürzungen aus.

Shell-Variable

Da die bash eine vollständige Programmiersprache ist, gibt es natürlich auch Variable. Diese Variable werden nicht nur für die Programmierung eingesetzt sondern auch für die Konfiguration.
Shell-Variable werden üblicherweise in Großbuchstaben geschrieben (Groß-/Kleinschreibung ist entscheidend).
Für die interaktive Verwendung wird normalerweise das Kommando export verwendet:

export PATH=~/bin:$PATH

Mit obigem Befehl wird der Suchpfad, das sind diejenigen Verzeichnisse, in denen ein Programm oder ein Kommando gespeichert ist, geändert. Es wird der Pfad ~/bin vorne angefügt. $PATH liefert den Inhalt der Variable PATH (es erfolgt reine Textersetzung).
Einige Variable sind schon vordefiniert:

$HOME Homeverzeichnis
$SHELL die verwendete Shell

Ein-/Ausgabeumlenkung

Die Ausgabe von Kommandos kann mit dem Größerzeichen (>) in eine Datei umgelenkt werden. Z.B.:

ls -l /usr/bin > ls.txt

Die Datei ls.txt wird erzeugt und die Ausgabe von ls darin gespeichert.
Verwendet man zwei Größerzeichen (>>), so wird die Ausgabe an die angegebene Datei angehängt.
Umgekehrt kann auch die Eingabe für ein Programm aus einer Datei erfolgen, indem man das Kleinerzeichen verwendet:

grep ^d <eingabedatei

Diese Varianten können kombiniert werden.

kommando parameter… <eingabedatei >ausgabedatei

Oft werden Kommandos direkt kombiniert, indem die Ausgabe eines Programms direkt in die Eingabe des nächsten Programms gepumpt wird. Die Programme werden mit einer pipe (pipeline) verbunden. Das dafür nötige Zeichen ist der senkrechte Strich (|):

ls -l | grep ^d

Obiger Befehl gibt alle Verzeichnisse aus, da grep mit dem Parameter ^d alle Zeilen, die mit einem 'd' beginnen, ausgibt.
Es können beliebig viele Programme mit pipes verbunden werden, es entsteht dadurch eine richtige Verarbeitungskette. Ist die Ausgabe sehr lange, so könnte im obigen Beispiel noch less verwendet werden, um in der Ausgabe blättern zu können.

ls -l | grep ^d | less

Auf diese Weise lassen sich komplexe Aufgaben einfach und effizient erledigen.
Dabei ist zu beachten, dass die Shell hier einige Arbeit übernimmt: bei der Eingabeumlenkung öffnet die Shell die Datei zum Lesen und tippt die Zeilen ein. Bei der Ausgabeumlenkung öffnet die Shell die Datei zum Schreiben und verschiebt die Ausgabe in diese Datei. Die pipe kann man sich als temporäre Datei vorstellen, in die das eine Programm schreibt und aus der das nächste Programm liest, wenngleich der Mechanismus natürlich effizienter gelöst ist.

Wichtige Kommandos

Fast alle Befehle oder Programme erlauben die Option -h, -help (ein Minus) oder –help (zwei Minus) und geben dann eine Kurzhilfe aus.

ls [optionen] [path]...

Anzeigen des Inhalts von Verzeichnissen. Die wichtigsten Optionen sind: -l um alle Informationen (langes Format) anzuzeigen, -a um alle Dateien anzuzeigen (auch die versteckten)

cp src... dest

Kopieren von Dateien. Hat cp mehr als zwei Parameter, so muss der letzte Parameter ein Verzeichnis sein.
Mit der Option -r können rekursiv ganze Verzeichnisbäume kopiert werden.

mv src... dest

Umbenennen/Verschieben von Dateien (move). Hat mv mehr als zwei Parameter, so muss der letzte Parameter ein Verzeichnis sein.

rm list...

Löschen von Dateien (remove).
Mit der Option -r können rekursiv ganze Verzeichnisbäume gelöscht werden (VORSICHT: rm -rf * löscht alles innerhalb und unterhalb des aktuellen Verzeichnises).

mkdir list...

Erstellen von Verzeichnissen.

cd [path]

Wechsel in das angegebene Verzeichnis. Wird kein Parameter angegeben, so wird ins Home-Verzeichnis gewechselt.

rmdir list...

Löschen von Verzeichnissen (nicht leeren).

cat [list...]

Ausgeben der angegebenen Dateien (die angegebenen Dateien werden auf diese Weise verkettet, da sie unmittelbar hintereinander ausgegeben werden)

less [list...]

Seitenweise Ausgabe der angegebenen Dateien

tar czf archiv.tgz list...

Ein komprimiertes Archiv mit dem Namen archiv.tgz aus den Dateien/Verzeichnissen list… erzeugen

tar xzf archiv.tgz

Das Archiv wieder auspacken

tar tzf archiv.tgz

Den Inhalt des Archivs ausgeben. tar bietet noch viel mehr Optionen und Möglichkeiten und war ursprünglich ein Programm zur Datensicherung auf Bänder (tape archiver).

file list...

gibt die Dateitypen aus. Unter UNIX haben die Datei-Endungen nicht die Bedeutung wie unter Windows, oft kann die Endung beliebig gewählt werden. Das Programm file öffnet nun die angegebenen Dateien und versucht aufgrund des Inhalts den Typ zu ermitteln.

touch list...

ändert die Zugriffszeit der angegebenen Dateien oder erzeugt diese, wenn sie nicht existieren (Dateien mit der Länge 0).

grep suchbegriff [list...]

Sucht den Suchbegriff in den gegebenen Dateien oder Standardeingabe (Eintippen oder Eingabeumlenkung). Wenn nur der Dateiname gesucht ist, der den Suchbegriff enthält, dann ist die Option -l anzugeben. Der Suchbegriff kann aus regulären Ausdrücken bestehen, wodurch man komplexe Suchmuster angeben kann. Zu beachten ist allerdings, dass viele Sonderzeichen für reguläre Ausdrücke, eine spezielle Bedeutung in der Shell haben. Sie müssen daher maskiert werden, z.B. mit vorangestelltem \ oder unter einfache Hochkomma ('). Mehr dazu unter man grep bzw. man bash.

ps

Prozessstatus, listet alle Prozesse auf, die in dieser Shell gestartet wurden.

ps axu

listet alle Prozesse, aller User plus Zusatzinformationen auf. Die erste Spalte enthält den Usernamen, die zweite Spalte die Prozess-ID (PID) und die letzte Spalte den genauen Befehl.

kill [signal] pid...

Schickt den angegebenen Prozessen das TERM-Signal (Terminieren). Die wichtigen Signale sind:
-TERM, -KILL (tötet den Prozess auf alle Fälle)

killall [signal] name...

Schickt den angegebenen Prozessen das TERM-Signal (Terminieren). Die Prozesse werden durch den Befehlsnamen name (aufgerufenes Kommando) ausgewählt.
Will man z.B. alle mozilla-Prozesse killen, gibt man killall mozilla ein.

sort [list...]

gibt die Zeilen der angegebenen Dateien sortiert aus (bzw. die Zeilen der Standardeingabe).

uniq [eingabedatei] [ausgabedatei]

löscht doppelte Zeilen aus einer sortierten Eingabe.

Fortgeschrittenes

Es gibt mehrere Möglichkeiten, aus der Ausgabe eines Programms Argumente für die Kommandozeile zu machen.

  1. Backticks:
    $ ls `echo $HOME`
    Hier wird zunächst der Befehl echo $HOME ausgeführt und dessen Ausgabe wird zum Argument des Befehls ls (das Home-Verzeichnis wird aufgelistet).
  2. xargs
    Das ist ein Programm, das von der Standardeingabe zeilenweise liest und jede Zeile als ein Kommandozeilenargument an das xargs übergebene Programm übergibt. Obiges Beispiel kann man also auch so schreiben:
    echo $HOME|xargs ls

Hilfe

UNIX-Systeme werden normalerweise mit ausführlicher Online-Dokumentation ausgeliefert. Die Standarddokumentation entspricht den gedruckten Handbüchern und ist in mehrere Abschnitte eingeteilt:

1 Ausführbare Programme oder Shellbefehle
2 Systemaufrufe (Kernelfunktionen)
3 Bibliotheksaufrufe (Funktionen in System-Bibliotheken)
4 Spezielle Dateien (gewöhnlich in /dev)
5 Dateiformate und Konventionen, z. B. /etc/passwd
6 Spiele
7 Makropakete und Konventionen, z. B. man(7), groff(7)
8 Systemadministrationsbefehle (in der Regel nur für root)
9 Kernelroutinen [Nicht Standard]
n neu [veraltet]
l lokal [veraltet]
p öffentlich [veraltet]
o alt [veraltet]

Zu jedem Befehl (Thema) gibt es eine Seite (können auch mehrere Seiten sein) mit dem Namen des Befehls (Themas). Will man eine bestimmte Seite des Manuals lesen, so verwendet man den Befehl man (manual):

 man [abschnitt] seite

Wird abschnitt weggelassen, so zeigt man die passende Seite mit der niedrigsten Abschnittsnummer an. Oft gibt es zu einem Thema in mehreren Abschnitten eine Seite. Dann muss der gewünschte Abschnitt angegeben werden.

Beispiele:

man man Hilfe zu man
man bash Hilfe zur bash
man tar Hilfe zu tar
man printf Hilfe zu printf der Shell
man 3 printf Meist will man aber Hilfe zur C-Funktion printf

Oft weiß man nicht genau, welche Manualseite man braucht. Mit man -k schlüsselwort kann man nach Schlüsselworten suchen lassen. Die Ausgabe ist eine Liste der Befehle, auf die das Schlüsselwort zutrifft.
apropos schlüsselwort sucht nach Schlüsselworten in der Indexdatenbank der Manualseiten.
Für GNU-Programme hat sich die Dokumentation im info-Format eingebürgert:

 info seite

kdehelp bietet Zugriff auf all diese Informationen sowie den Hilfetexten des KDE-Desktops. kdehelp ist auch über einen Menüpunkt des KDE-Menüs erreichbar. Bei neueren KDE-Versionen heißt das Programm khelpcenter.

Weitere Informationen

Fragen

1. Was ist eine Shell?
2. Geben Sie Beispiele verschiedener Shells!
3. Wie wird die Eingabe von langen Pfaden bei der bash erleichtert?
4. Welche Möglichkeiten gibt es frühere Befehle wieder zu verwenden? Nennen Sie 3 Arten!
5. Wie können in einer Shell mehrere Programme so gestartet werden, dass sie gleichzeitig laufen?
6. Wie funktioniert Job-Control? Was ist der Zweck?
7. Was sind Shell-Variable? Nennen Sie zwei Beispiele für die Verwendung!
8. Wie sieht die allgemeine Befehlssyntax aus?
9. Welche Bedeutung hat das Symbol ~ ?
10. Was können Sie tun, damit Sie statt ls das Kommandos dir verwenden können?
11. Was müssen Sie tun, damit dir auch beim nächsten Mal wieder funktioniert?
12. Was können Sie tun, wenn ein Programm keine Dateien lesen/schreiben kann, Sie aber mit diesem Programm dennoch Dateien bearbeiten wollen?
13. Sie haben 3 Dateien adr1, adr2 und adr3, welche Zeilen mit Namen und e-Mail-Adressen enthalten. Eine Zeile hat die Form name vorname email. Die Einträge sind nicht sortiert. Manche Namen kommen nur in einer Datei vor, andere in mehreren Dateien. Geben Sie die Kommandozeile an, die alle 3 Dateien verknüpft, sortiert, die doppelten Namen löscht und in die Datei adr ausgibt. Welcher Mechanismus muss hier verwendet werden?
14. Sie haben ein Programm myprog gestartet, welches hängen geblieben ist. Welche Möglichkeiten haben Sie, das Programm zu beenden?
15. Sie wollen wissen, welche C- oder Java-Datei im aktuellen Verzeichnis die Funktion longjmp enthält. Geben Sie das Kommando an! Was passiert hier genau?
16. Sie wissen nicht genau, wie Befehl zum Archivieren/Zippen von Dateien heißt. Wie finden Sie die Information?

Labels: ,


 

Linux - ein kurzer Überblick

Linux oder oft auch GNU/Linux ist ein unix-ähnliches freies Betriebssystem, welches im Gegensatz zu Windows für viele Plattformen (x86, IA64, PPC, SPARC, Alpha, MIPS, ARM, PA-RISC, S/390, PowerPC uvam.) verfügbar ist.

Eigentlich ist Linux nur der Betriebssystemkern aber man kommt bei einer Distribution üblicherweise eine Menge anderer (System-)Software mitgeliefert, sodass man gleich nach der Installation alles hat, was man zum Arbeiten braucht. Bürosoftware, Kommunikation/Internet, Grafik, Entwicklung, Multimedia und Spiele - alles auf einmal installieren.

Die Software ist durchwegs frei, d.h. auch im Sourcecode verfügbar. Mittlerweile gibt es aber auch schon zahlreiche kommerzielle Programme für Linux.

Der m.E. größte Unterschied zu Windows ist eher eine philosophische:
Linux/Unix Software ist optimal für den Programmierer Malcolm designed, bei Windows ist es Tante Emma, die im Mittelpunkt steht.

Einführung in Linux

Linux ist ein UNIX System. Die folgenden Aussagen beziehen sich daher auf UNIX und Linux.
Die beiden Autoren von UNIX, Ken Thompson und Dennis Ritchie schreiben: Es ist vielleicht paradox, dass der Erfolg des UNIX Systems hauptsächlich darauf zurückgeht, dass es nicht entworfen wurde, um irgendwelche vordefinierten Ziele zu erfüllen.
Dem UNIX System liegt die Philosophie zugrunde, eine Computerumgebung zu schaffen, in der sie selbst (Anmerkung: die Autoren von UNIX) ihre eigene Arbeit in komfortabler und effektiver Weise weitertreiben konnten - Forschung auf dem Gebiet der Programmierung.

Die wichtigsten Maxime von UNIX sind:

1. Jedes Programm soll eine einzige Aufgabe gut erfüllen. Um eine neue Aufgabe zu erledigen, baue eher ein neues Werkzeug, als alte Programme durch Hinzufügen neuer Eigenschaften zu verkomplizieren.
2. Erwarte jederzeit, dass die Ausgabe eines Programmes zu einer Eingabe für ein anderes, vielleicht noch unbekanntes Programm wird.
3. Entwerfe und programmiere Software, sogar Betriebssysteme, so, dass sie früh, idealerweise innerhalb von Wochen, ausprobiert werden kann.
4. Benutze lieber Werkzeuge als unqualifizierte Hilfsmittel, um eine Programmieraufgabe zu erleichtern, auch wenn sich dadurch der Umweg ergibt, diese Werkzeuge erst bauen zu müssen. Erwarte auch, einige davon wegzuwerfen, nachdem sie nicht mehr gebraucht werden.
Die Philosophie von UNIX wurde nie explizit festgelegt, sondern äußert sich implizit in seinen Charakteristiken.

Charakteristiken von Unix

Modularität
Alle Aufgaben werden in Grundbestandteile zerlegt. In einem Programm wird, soweit möglich, eine und genau eine Grundfunktion realisert.
Soviel wie nötig, so wenig wie möglich
Wiederverwendbarkeit
Durch das Lösen von Grundaufgaben im Gegensatz zu aktuellen Spezialaufgaben wird Software in hohem Maß wiederverwendbar.
Generalität
Kombinierbarkeit
Wie sich die Bausteine aus einem Baukasten zu einem ganzen Bauwerk zusammenfügen lassen, so können die einzelnen Programme unter UNIX zu einem größeren Software-"Bauwerk" kombiniert werden.

Verständlichkeit
Aus dem relativ geringen Umfang der einzelnen Software-Bausteine ergibt sich eine erhöhte Verständlichkeit, da kleine Teile stets besser zu überblicken sind als große.
Flexibilität
Der Benutzer kann zwar die gebotenen Leistungen in Anspruch nehmen, vermag sich jedoch auch die Umgebung nach seinen eigenen Vorstellungen selbst zu gestalten.

Besonderheiten von Linux

Linux bezeichnet eigentlich nur den Kernel und wird unter der GNU General Public License verteilt. Allerdings wird unter dem Begriff Linux meist die gesamte Betriebssystemumgebung gemeint, das ist also der Kernel und die Systemsoftware des GNU-Projekts. Korrekterweise müsste man also von GNU/Linux sprechen.
Genaueres zur GNU General Public License ist auf der Homepage des GNU-Projektes zu finden: www.gnu.org

Eigenschaften von UNIX/Linux

Die folgenden Aussagen gelten auch für Linux.
Hierarchisches Dateisystem – alles ist eine Datei.
Multitasking – mehrere Prozesse (laufende Programme) zur selben Zeit.
Multiuser – mehrere Benutzer zur selben Zeit.
Netzwerkfähigkeiten – TCP/IP und damit die Basis des Internets ist mit UNIX groß geworden, in UNIX ist die Netzwerkfähigkeit schon integriert.
Plattformunabhängigkeit – UNIX gibt's für praktisch jede Hardware.
Programmierplattform - UNIX wird von Haus aus mit einer Fülle von Softwarentwicklungs-Tools geliefert.
UNIX ist transparent – die gesamte Systemkonfiguration ist für den Administrator frei zugänglich (praktisch immer in Form von Textdateien).
UNIX ist automatisierbar – praktisch jede (Administrations-)Aufgabe ist automatisierbar.
Flexible Benutzerschnittstelle – es existiert eine Fülle an verschiedenen grafischen Oberflächen, KDE und Gnome sind die häufigsten.

(unvollständiger) Vergleich Windows - Linux KDE

Windows Linux/KDE
Doppelklick Einfachklick
\ als Verzeichnistrenner / als Verzeichnistrenner, / am Anfang eines Pfades ist das Wurzelverzeichnis (root directory)
Laufwerke Verzeichnisbaum, Einhängen (mount) von Wechseldatenträgern, Server-Verzeichnisse
„Eigene Dateien“ /home/$USER
Lizenz GPL (General Public License)
Große umfangreiche Programme Viele kleine Programme mit jeweils nur einem begrenzten Aufgabenumfang (es gibt schon große – OpenOffice)
Kommandozeile schlecht unterstützt – hauptsächlich graphische Oberfläche Gute Unterstützung für Kommandozeile – verschiedene Shells (Filename-Expansion, History, eigene Programmiersprache in Shell integriert)
Dateiendungen wichtig Dateiendungen nicht so wichtig
Registry für Einstellungen Einstellungen werden in „unsichtbare“ Textdateien gespeichert, viele kleine Dateien
ftp – eigenes Programm nötig ftp in konqueror integriert
Login/Shutdown - <ctrl>+<alt>+<del> Eigene Kommandos, Login direkt
Zugriffsrechtesystem (falls eingesetzt) feiner abstimmbar Rechte nur auf Eigentümer, Gruppe, andere
Anwendungssoftware muss extra erworben und installiert werden Die meisten Distributionen enthalten eine Menge freier Anwendungssoftware, die gleich bei der ersten Installation mit installiert werden kann
Programmierumgebungen müssen extra erworben und installiert werden Programmierumgebungen sind mit dabei
Viele Spiele Wenig Spiele
Viele Viren Keine Viren


Interessante Daten zu Linux

Folgende Informationen stammen aus dem Bericht "Estimating the Total Development Cost of a Linux Distribution":

Ähnliche Informationen zu Windows konnte ich leider nicht finden.

Fragen

1. Was ist Linux?
2. Erklären Sie die Philosophie, die hinter UNIX/Linux steckt!
3. Was sind die Charakteristiken von UNIX/Linux?
4. Welche Eigenschaften hat UNIX/Linux?
5. Vergleichen Sie Windows mit Linux!
6. Wo befinden sich Ihre Arbeitsdateien?
7. Wie werden Eigenschaften von Programmen (Konfiguration) gespeichert?

Labels: ,


 

Grunddatentypen C#/Java

Welche Grunddatentypen von C# bzw. Java kennen Sie?
Zählen Sie die Datentypen auf und geben Sie den Speicherbedarf in Bytes sowie den darstellbaren Wertebereich an!

Zum Beispiel benötigt int bei C# 4 Bytes. Damit sind Zahlen von -2.147.483.648 bis 2.147.483.647 darstellbar (warum?).

Geben Sie diese Informationen für die anderen Datentypen an!

Labels: , , ,


 

Dreiecksbestimmung

Formulieren Sie einen Algorithmus, welcher zu 3 gegebenen Seitenlängen bestimmt,

Definieren Sie dazu eine Funktion/Methode dreiecktyp(a, b, c), welche als Parameter 3 Zahlen a, b, c hat und folgende ganzzahlige Werte liefert:

  1. Geben Sie den Algorithmus in Form eines Struktogramms an.
  2. Geben Sie den Algorithmus in Form von Pseudocode an.
  3. Finden Sie passende Testdaten, um zu prüfen, ob Ihr Algorithmus funktioniert. Bedenken Sie, dass die Parameter in beliebiger Reihenfolge sein können (das Dreieck kann gedreht sein).
  4. Formulieren Sie den Algorithmus in einer Programmiersprache Ihrer Wahl und schreiben Sie ein kleines Testprogramm, mit dem Ihre Funktion dreiecktyp(a, b, c) mit den Testdaten aufgerufen wird.
Anmerkungen:
Ein Dreieck mit den Seitenlängen 3, 4 und 5 ist ein rechtwinkeliges Dreieck.
Testdaten für ein gleichschenkelig-rechtwinkeliges Dreieck sind nicht so einfach einzugeben, denn die Hypotenuse ist in diesem Fall immer ein Vielfaches aus der Wurzel aus 2 (Wurzel aus 2). Die Wurzel aus 2 ist eine irrationale Zahl und hat unendlich viele Nachkommastellen und lässt sich auch nicht als Bruch darstellen. Darüberhinaus gibt es auch andere Umwandlungsfehler von Dezimalzahlen in Gleitkommazahlen, sodass viele Werte im Computer nicht genau darstellbar sind. Ein direkter Vergleich von Gleitkommazahlen ist daher nicht möglich. Man arbeitet daher mit sog. Fehlerschranken (Epsilon ε).

Labels: ,


This page is powered by Blogger. Isn't yours?

Abonnieren Posts [Atom]