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.
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
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.
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;
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.
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:
local.linux.box.de
starten, ebenso ein xterm oder
Äquivalentes. Dort gibt man ein:
$ xhost +remote.bigone.edu
$ telnet remote.bigone.edu
remote:$ DISPLAY=local.linux.box.de:0.0
remote:$ progname &
(anstelle von DISPLAY...
, muß man evtl. setenv DISPLAY local.linux.box.de:0.0
eingeben. Das hängt von der Shell auf dem
entfernten Rechner ab.)
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.