Inhalt

2. Dateien und Programme

2.1 Dateien: Grundlegende Begriffe

Die Struktur des Filesystems von Linux ist für den Benutzer nach außen hin der von DOS recht ähnlich. Mit Struktur des Filesystems ist hier die Anordnung von Verzeichnissen und der darin enthaltenen Dateien gemeint. Die Namen für Verzeichnisse und Dateien gehorchen bestimmten Regeln, Dateien werden in Verzeichnissen abgelegt, es gibt ausführbare Dateien und diese haben oft auch wie unter DOS Kommandozeilenparameter. Darüber hinaus kann man auch Platzhalter, Umlenkung und Piping verwenden. Es gibt jedoch gegenüber DOS ein paar Unterschiede:

Unter DOS sind die Dateinamen in der 8.3-Form, d.h. wie etwa NICHGENG.TXT. Unter Linux sind die Regeln für Dateinamen bei Benutzung des UMSDOS- oder EXT2-Filesystems wesentlich liberaler, vergleichbar etwa mit Win95. Es können bis zu 255 Zeichen verwandt werden, und der Punkt kann beliebig oft auftreten. Ein Beispiel für einen Dateinamen unter Linux ist z.B. Das_ist.ein.SEHR_langer.dateiname. Man beachte, daß hier sowohl große als auch kleine Buchstaben verwandt werden, denn es wird auch hier zwischen großen und kleinen Buchstaben im Gegensatz zu DOS unterschieden. Das heißt, FILENAME.tar.gz und filename.tar.gz sind zwei unterschiedliche Dateien. So ist ls ein Kommando, LS dagegen wird höchst wahrscheinlich nur eine Fehlermeldung bringen.

Windows 95 Nutzer werden wahrscheinlich Leerzeichen innerhalb der Dateinamen verwenden wollen. Wenn ein Name solche enthält (was nicht sehr empfehlenswert ist), muß er immer wenn er verwendet wird in Anführungszeichen eingeschlossen werden. Beispielsweise:

$ # das folgende Kommando legt ein Verzeichnis namens "Meine alten Dateien"
$ mkdir "Meine alten Dateien"
$ ls
Meine alten Dateien     bin     tmp

Einige Zeichen können zwar verwendet werden, sollten es aber nicht, wie zum Beispiel !*$&. Ich will nicht erklären wie man das macht, denn es ist wirklich keine gute Idee. Diese Zeichen haben alle eine spezielle Bedeutung für die Shell, und wenn sie in Dateinamen auftauchen, kann das unerwartete Ergebnisse zeitigen wenn man nicht genau aufpaßt.

Für Programme gibt es keine zwangsweisen Erweiterungen wie .exe .com oder .bat für Batchdateien. Ausführbare Programme werden beim Auflisten mit dem Kommando ls -F mit einem Sternchen '*' am Ende des Namens versehen, zum Beispiel:

$ ls -F
Brief_an_Joe  cindy.jpg  cjpg*  Ein_Verzeichnis/  mein_1._script* alt~

Hier sind die Dateien cjpg und mein_1._script ausführbar, d.h. Programme. Man beachte, daß der Stern nicht Teil der Dateinamen ist, sondern nur zur Kennzeichnung als ausführbar beim Auflisten dient. Unter DOS enden Backup-Dateien üblicherweise auf .BAK, während sie unter Linux im allgemeinen mit einer Tilde '~' enden. Wenn Linux entsprechend konfiguriert ist, können Auflistungen von Verzeichnissen auch farbig gekennzeichnet werden. Namen von Programmen könnten z.B. rot ausgegeben werden, Verzeichnisse blau und Bilder lila. Dateien, deren Name mit einem Punkt beginnt, werden als versteckte Dateien behandelt. Sie werden bei einem normalen Auflisten mit ls nicht angezeigt. Die Datei .Ich.bin.eine.versteckte.Datei wird also normalerweise bei einer Auflistung ignoriert, erst ein ls -a bringt sie zum Vorschein.

Optionen und Schalter werden unter DOS als /schalter angegeben, unter Linux mit -schalter oder --schalter. Beispiel: dir /s wird zu ls -R. Man beachte, daß viele DOS-Programme Schalter nach UNIX-Art verwenden, so z.B. PKZIP oder ARJ.

Wer will, kann jetzt mit dem Abschnitt Übertragen von Kommandos von DOS nach Linux weitermachen, aber es ist nützlich, sich vorher noch kurz ein paar Dinge anzuschauen, die es nicht in DOS oder Windows gibt.

2.2 Links

UNIX hat noch einen weiteren Dateityp, der bei DOS nicht existiert. Es ist der Link. Ein Link ist eigentlich keine richtige Datei, sondern nur eine Art Verweis auf eine andere, bereits existierende Datei oder Verzeichnis. Es gibt zwei Typen von Links, den Hardlink und den symbolischen Link. Es soll hier nicht weiter auf den Unterschied zwischen beiden eingegangen werden, da sie sich äußerlich für den Nutzer kaum unterscheiden. Heutzutage werden üblicherweise vorwiegend symbolische Links eingesetzt, da sie etwas flexibler sind. Am ehesten vergleichbar sind symbolische Links mit den Win95 Shortcuts. Beispiele für symbolische Links sind z.B. das Verzeichnis /usr/X11 welches ein Link auf /usr/X11R6 ist und /dev/modem, welches entweder auf /dev/cua0 oder /dev/cua1 zeigt.

Um einen symbolischen Link anzulegen gibt man ein:

$ ln -s <Datei_oder_Verzeichnis> <Linkname>

Beispiele:

$ ln -s /usr/doc/g77/DOC g77manual.txt

Jetzt kann man sich auf g77manual.txt beziehen anstelle von /usr/doc/g77/DOC. Links werden bei der Auflistung eines Verzeichnisses wie folgt angezeigt:

$ ls -F
g77manual.txt@
$ ls -l
(verschiedene Angaben zur Datei ...)   g77manual.txt -> /usr/doc/g77/DOC

2.3 Rechte und Eigentümer

Dos-Dateien haben folgende Attribute: A (archivieren), H (versteckt), R (nur lesbar) und S (System). Nur H und R sind unter Linux sinnvoll: H sind Dateien die mit einem Punkt anfangen, und R wird später besprochen.

Unter UNIX besitzt jede Datei Rechte und einen Eigentümer, der wiederum zu einer Gruppe gehört. Hier ein Beispiel:

$ ls -l /bin/ls
-rwxr-xr-x  1  root  bin  27281 Aug 15 1995 /bin/ls*

Das erste Feld enthält die Rechte der Datei /bin/ls, die root gehört, sowie der Gruppe bin. Die Zeichenfolge -rwxr-xr-x bedeutet von links nach rechts:

- ist der Dateityp (- = normale Datei, d = Verzeichnis, l = Link, usw.); rwx sind die Rechte für den Eigentümer der Datei (lesen,schreiben,ausführen); r-x sind die Rechte für die Gruppe des Eigentümers (lesen,ausführen) - auf das Prinzip von Gruppen soll hier nicht weiter eingegangen werden, man kann als Anfänger auch sehr gut ohne das auskommen ;-) - ; r-x sind die Rechte für den Rest der Nutzer (lesen,ausführen). Für die Leute, bei denen Englisch nicht die zweite Muttersprache ist, hier die englische Bedeutung der Kürzel: r - Read, w - Write, x - eXecute, sowie beim Dateityp d für Directory. Der Rest der Ausgabe soll hier nicht weiter behandelt werden, wer Näheres wissen will kann in den einschlägigen Büchern nachlesen (z.B. im Buch von Matt Welsh).

Im Falle unseres /bin/ls kann man also die Datei nicht verändern, es sei denn, man ist root: alle anderen haben nicht die notwendigen Schreibrechte. Das Kommando, um die Rechte einer Datei zu ändern, ist:

$ chmod <werXrecht> <datei>

wobei wer für den steht, dessen Rechte geändert werden, also entweder u (user, der Eigentümer), g (group, die Gruppe), o (other,der Rest) oder a (all, alle Nutzer), X ist entweder +, - oder =, je nachdem, ob das Recht hinzugefügt oder weggenommen wird, bzw. auf den angegebenen Wert gesetzt wird, und recht ist das Recht, was geändert wird, also entweder r (read), w (write), oder x (execute).

Beispiele:

$ chmod u+x file

setzt die Ausführungsrechte für den Eigentümer.

$ chmod go-wx file

nimmt das Schreibrecht und das Ausführungsrecht für alle außer den Eigentümer weg.

$ chmod ugo+rwx file

setzt für alle Schreib-, Lese- und Ausführungsrechte. Man kann hier auch die Folge ugo einfach durch a ersetzen.

$ chmod u+s file

dieses setzt das sogenannte (oben nicht erwähnte) setuid oder suid Recht (meistens setuid-Bit genannt). Damit wird eine Datei, wenn sie ausführbar ist, automatisch beim Aufruf mit den Rechten des Eigentümers ausgeführt und nicht wie sonst üblich mit den Rechten des Aufrufers. Gehört die Datei z.B. root, wird sie mit root-Rechten ausgeführt und hat somit vollen Zugriff auf das System (und kann bei einem Fehler auch entsprechenden Schaden anrichten). Also Vorsicht mit dem Setzen des suid-Bits.

Ein kürzerer Weg zur Angabe von Rechten ist die Angabe von Zahlen: rwxr-xr-x kann z.B. als 755 angegeben werden. Dabei entspricht jeder Buchstabe einem Bit: --- ist 0, --x ist 1, -w- ist 2, -wx ist 3... . Es ist zu Beginn etwas gewöhnungsbedürftig, aber nach und nach bekommt man Routine mit diesen Werten.

Normalerweise darf nur der die Rechte einer Datei ändern, der auch ihr Eigentümer ist. Root jedoch als sogenannter Superuser kann die Rechte aller Dateien ändern. Zum Kommando chmod gibt es noch weiteres zu sagen, das aber nicht in diesen Rahmen paßt. Also --- MSL.

2.4 Übertragen von Kommandos von DOS nach Linux

Auf der linken Seite ist das DOS Kommando aufgeführt, auf der Rechten das Linux-Pendent

COPY:           cp
DEL:            rm
MOVE:           mv
REN:            mv
TYPE:           more, less, cat

Umleitungs- und Pipingoperatoren: < > >> |

Platzhalter: * ?

nul: /dev/null

prn, lpt1: /dev/lp0 or /dev/lp1; lpr

Beispiele:

DOS                                     Linux
________________________________________________________________

C:\GUIDO>copy joe.txt joe.doc           $ cp joe.txt joe.doc
C:\GUIDO>copy *.* total                 $ cat * > total
C:\GUIDO>copy fractals.doc prn          $ lpr fractals.doc
C:\GUIDO>del temp                       $ rm temp
C:\GUIDO>del *.bak                      $ rm *~
C:\GUIDO>move paper.txt tmp\            $ mv paper.txt tmp/
C:\GUIDO>ren paper.txt paper.asc        $ mv paper.txt paper.asc
C:\GUIDO>print letter.txt               $ lpr letter.txt
C:\GUIDO>type letter.txt                $ more letter.txt
C:\GUIDO>type letter.txt                $ less letter.txt
C:\GUIDO>type letter.txt > nul          $ cat letter.txt > /dev/null
nicht vorhanden                         $ more *.txt *.asc
nicht vorhanden                         $ cat section*.txt | less

Bemerkungen:

Der * ist unter Linux intelligenter: * paßt auf alle Dateien, außer auf die versteckten, *.* paßt nur auf solche Dateien, die ein '.' in der Mitte oder am Ende haben, p*r paßt auf `peter' und `pfeiffer' (mit 3 f ;-), *c* paßt auf `picken', `pack.txt', `mac' und `c' selbst.

Wenn man more benutzt, kann man mit LEERTASTE in der Datei weiterblättern, mit 'q' oder CTRL-C beendet man es. less ist etwas intuitiver und läßt einen mit den Cursortasten durch die Datei wandern. Manchmal ist more einfach nur ein Link auf less, so daß sich beide gleich verhalten.

Es gibt kein UNDELETE, also zweimal überlegen bevor man etwas löscht.

Zusätzlich zu den DOS-üblichen < > >> hat Linux noch 2> um Fehlermeldungen umzulenken (stderr). Darüber hinaus lenkt 2>&1 stderr nach stdout um und 1>&2 stdout nach stderr.

Linux hat noch einen anderen Platzhalter: das []. Verwendung: [abc]* paßt z.B. auf alle Dateien, die auf a, b oder c beginnen; *[I-N,1,2,3] paßt auf alle Dateien, die mit I, J, K, L, M, N, 1, 2 oder 3 enden.

Es gibt standardmäßig kein DOS-ähnliches RENAME; d.h. mv *.xxx *.yyy funktioniert nicht. Es gibt jedoch ein Programm namens mmv (Multiple MoVe), das Analoges leistet. Es ist in vielen Distributionen bereits enthalten. Um die Shell daran zu hindern, den Platzhalter selber zu interpretieren, muß der erste Dateiname in Anführungszeichen eingeschlossen werden. Beispiel:

# mmv '*.xxx' #1.yyy

#1 wird hierbei durch den zum ersten (und in diesem Falle einzigen) Platzhalter in *.xxx passenden String ersetzt. Es gibt noch ein paar andere kleine Unterschiede zu RENAME, also hier wieder mal --- MSL.

Man benutze cp -i und mv -i , um gewarnt zu werden, wenn eine Datei dadurch überschrieben würde;

2.5 Programme starten: Multitasking und Sessions

Um ein Programm auszuführen, gibt man einfach den Namen wie unter DOS ein. Falls das Verzeichnis (Abschnitt Verzeichnisse), in dem sich das Programm befindet, im Pfad PATH (Abschnitt Der Systemstart) ist, wird das Programm starten. Unterschied zu DOS: ein Programm, das sich im aktuellen Verzeichnis befindet, wird nicht gefunden - es sei denn, das aktuelle Verzeichnis ist als '.' explizit im Pfad enthalten. Wenn nicht, hilft ein ./programm. Hinweis: das aktuelle Verzeichnis ist unter UNIX/Linux oft am Ende des Pfades eingetragen (aus Gründen der Systemsicherheit), d.h. es werden erst alle anderen Verzeichnisse nach programm durchsucht und zum Schluß erst das aktuelle Verzeichnis. Wenn man z.B. ein kleines Progrämmchen geschrieben hat und es test nennt, wird, wenn man es mit test aufruft und nicht mit ./test, zuerst das UNIX-Kommando test selbigen Namens gefunden (oder die Shell-interne Funktion, je nach Shell) und ausgeführt und nicht das eigene Programm im aktuellen Verzeichnis. Das führt oft zu langem Grübeln, bis man endlich merkt, daß das falsche Programm aufgerufen wurde, denn test ohne Parameter gibt keinerlei Meldungen o.ä. aus. Auf diesen "Trick" sind schon Generationen von Einsteigern hereingefallen und werden wahrscheinlich auch noch weitere Generationen hereinfallen.

Hier das Aussehen eines typischen Kommandos:

$ kommando -s1 -s2 ... -sn par1 par2 ... parn < input > output

wobei -s1, ..., -sn die Programmschalter sind und par1, ..., parn die Parameter. Der Rest sind die Umlenkungen, d.h. das Programm erhält seine Eingaben aus der Datei input und schreibt die Ausgaben in die Datei output. Es müssen natürlich nicht immer alle Teile enthalten sein. Mehrere Kommandos hintereinander können so eingegeben werden:

$ kommando1 ; kommando2 ; ... ; kommandon

Das ist alles, was man braucht, um ein Kommando aufzurufen. Es gibt jedoch darüber hinaus Möglichkeiten, die Linux zusätzlich zu den von DOS bekannten bietet. Einer der Gründe die für Linux sprechen ist es, daß es ein Betriebsystem mit Multitasking ist, d.h. es kann mehrere Programme (ab jetzt Prozesse genannt) gleichzeitig ausführen. Man kann einen Prozeß im Hintergrund starten und mit einem anderen weiterarbeiten. Darüber hinaus bietet Linux auch mehrere Sitzungen (Sessions) gleichzeitig an. Es ist so, als ob man an mehreren Rechnern arbeiten würde.

Um zu den Sessions 1..6 zu wechseln:

$ ALT-F1 ... ALT-F6

Wenn man gerade unter X-Windows ist, benutzt man statt dessen CTRL-ALT-Fn.

Um eine neue Session zu starten ohne die aktuelle zu verlassen (z.B. um als anderer Nutzer mit anderen Rechten weiterzuarbeiten):

$ su - <loginname>

Beispiel:

$ su - root

Dieses ist nützlich wenn man etwas erledigen muß, was normalerweise nur root darf, z.B. eine Floppy mounten (siehe Floppies, Harddisks, und Ähnliches).

Um eine Session zu beenden:

$ exit

Wenn es noch angehaltene Jobs gibt (siehe unten), wird man gewarnt.

Um einen Prozeß im Vordergrund zu starten:

$ progname [-schalter] [parameter] [< input] [> output]

Um einen Prozeß im Hintergrund zu starten, fügt man ein Kaufmanns-Und am Ende der Zeile hinzu: '&'

$ progname [-schalter] [parameter] [< input] [> output] &
[1] 123

Die Shell gibt dem Prozeß eine Jobnummer (z.B. [1]; siehe unten) und eine PID (ProzessID), 123 in unserem Beispiel.

Um alle Prozesse auflisten zu lassen:

$ ps -a
Dieses gibt eine Liste aller gerade laufenden Prozesse aus.

Um einen Prozeß zu beenden:

$ kill <PID>
Dies ist nützlich, um einen Prozeß zu beenden, wenn man entweder nicht weiß, wie man das Programm "vorschriftsmäßig" beendet, oder diese eigentlich vorgesehene Methode nicht mehr funktioniert. Manchmal kann ein Prozeß nur noch durch folgendes Kommando beendet werden:
$ kill -9 <PID>
kill -9 beendet jeden Prozeß, da dieses Signal nicht vom Prozeß abgefangen werden kann, d.h. der Prozeß wird vom Betriebssystem zwangsweise rausgeschmissen.

Darüber hinaus erlaubt es die Shell, einen Prozeß zu stoppen oder zeitweise anzuhalten, einen laufenden Prozeß in den Hintergrund zu schicken, oder aus dem Hintergrund in den Vordergrund zu holen. In diesem Zusammenhang werden die Prozesse Jobs genannt.

Um sich die laufenden Jobs der aktuellen Shell anzuschauen:

$ jobs
hierbei werden Jobs durch ihre Nummer und nicht durch ihre PID gekennzeichnet.

Um einen im Vordergrund laufenden Prozeß anzuhalten (funktioniert nicht immer, das Programm kann das explizit verhindern):

$ CTRL-C

Um einen im Vordergrund laufenden Prozeß zeitweise anzuhalten (dito):

$ CTRL-Z

Um einen vorübergehend angehaltenen Prozeß in den Hintergrund zu schicken (dadurch wird er zu einem Job):

$ bg <job>

Um einen Job in den Vordergrund zu bringen:

$ fg <job>

Um einen Job zu beenden:

$ kill <%job>
wobei <job> 1, 2, 3, ... sein kann. Mit diesen Kommandos kann man Disketten formatieren, Archive komprimieren, Programme kompilieren, Berechnungen ausführen usw. und trotzdem noch einen benutzbaren Prompt haben. Man versuche das einmal mit DOS! Windows kennt zwar auch Multitasking, jedoch ist das System meistens mit einem Programm bereits so ausgelastet, daß es für ein sinnvolles Arbeiten mit einem weiteren kaum noch reicht.

2.6 Programme via Netz auf anderen Rechnern ausführen

Um ein Programm auf einem anderen Rechner auszuführen, dessen Adresse z.B. remote.bigone.edu ist, gibt man ein:

$ telnet remote.bigone.edu

nachdem man eingeloggt ist, kann man sein gewünschtes Programm starten. Natürlich muß man einen Account (Zugangsberechtigung) auf dieser Maschine haben. Wenn man X-Windows benutzt, kann man sogar ein X-Programm auf dem anderen Rechner starten und sich die Ausgabe auf den eigenen Rechner umlenken. Wenn remote.bigone.edu der entfernte Rechner ist und local.linux.box.de der eigene Linuxrechner, muß man folgendes machen, um ein Programm auf remote.bigone.edu zu starten und es von local.linux.box.de aus zu bedienen:

Und siehe da! progname startet jetzt auf remote.bigone.edu und wird auf dem eigenen lokalen Rechner angezeigt. Man sollte jedoch vorsichtig sein beim Versuch, dies über eine langsame Modemleitung o.ä. zu machen. Bei so geringer Transferrate dürfte ein sinnvolles Arbeiten kaum möglich sein. Dafür gibt es eine spezielle Abart des X Windows, das Low-Bandwidth X, das hier jedoch nicht näher besprochen werden soll.


Inhalt