Die Struktur des Dateisystems von Linux ist der von DOS/Win recht ähnlich. 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:
NICHGENG.TXT
. Unter Linux sind die Regeln für Dateinamen bei Benutzung
des UMSDOS- oder EXT2-Dateisystems wesentlich liberaler, ähnlich Win95/NT. 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
DATEINAME.tar.gz
und
dateiname.tar.gz
sind zwei unterschiedliche Dateien. So ist ls
ein Kommando, LS
dagegen wird höchst wahrscheinlich nur eine
Fehlermeldung bringen.
$ # das folgende Kommando legt ein Verzeichnis namens "Meine alten Dateien" an
$ mkdir "Meine alten Dateien"
$ ls
Meine alten Dateien bin tmp
Einige Zeichen können zwar verwendet werden, sollten es aber nicht, da sie ohne
besondere Vorkehrungen für die bash Sonderbedeutungen haben und zu unerwarteten
Ergebnissen führen können: zum Beispiel !*$&#
.
ls -F
mit einem Sternchen »*« am Ende des Namens
versehen, zum Beispiel:
$ ls -F
Brief_an_Joe alt~ cindy.jpg cjpg* ein_Verzeichnis/ mein_1._script*
Hier sind die Dateien cjpg
und mein_1._script
ausführbar, d.h.
Programme. Unter DOS enden Backup-Dateien üblicherweise auf .BAK, während sie
unter Linux im allgemeinen mit einer Tilde »~« enden. Dateien und
Verzeichnisse, deren Name mit einem Punkt beginnt, werden als versteckte
Dateien/Verzeichnisse 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 (»a« wie »all«).
/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
symbolische Link. Ein solcher Link ist eigentlich keine richtige Datei, sondern
nur eine Art Verweis auf eine andere, bereits existierende Datei oder
Verzeichnis. Dieser Link kann dann anstelle der eigentlichen Datei verwendet
werden. Ein solcher Link ist ähnlich den Verknüpfungen unter Windows (aber eben
nur ähnlich). 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/ttyS0
oder
/dev/ttyS1
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
Linux kennt noch einen anderen Typ von Links, den Hardlink (»harter Link«). Dieser Link hat aber gegenüber dem symbolischen Link gewisse Einschränkungen, und es gibt im Prinzip nichts was man mit dem Hardlink machen kann das nicht auch mit symbolischen Links geht. Deshalb soll hier nicht näher auf diese Links eingegangen werden.
DOS-Dateien haben folgende Attribute: A (archivieren), H (hidden - versteckt), R (read only - nur lesen) und S (System). Nur H und R sind unter Linux sinnvoll: H entspricht 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 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. Den Rest der Ausgabe schenken wir uns hier.
Das Verzeichnis /bin
besitzt auch Rechte, siehe Abschnitt
Verzeichnisrechte. Deshalb kann man also
die Datei /bin/ls
nicht löschen, es sei denn, man ist root: alle
anderen haben nicht die notwendigen Rechte. 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. »recht« ist
das Recht, welches geändert wird, also entweder r
(read), w
(write), oder x
(execute).
Beispiele:
$ chmod +x datei
setzt das Ausführungsrecht für diese Datei für alle Nutzer.
$ chmod go-rw datei
nimmt das Leserecht und das Schreibrecht für alle außer den Eigentümer weg.
$ chmod ugo+rwx datei
setzt für alle Schreib-, Lese- und Ausführungsrechte. Man kann hier auch die Folge »ugo« einfach durch »a« (all) ersetzen.
# chmod +s datei
setzt das sogenannte (oben nicht erwähnte) »setuid« (oder »suid«) Recht (meistens als setuid-Bit bezeichnet). 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. Typischerweise sind setuid Dateien solche die root gehören, welche dann wichtige Systemfunktionen ausführen, wie z.B. der X-Server.
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. Root kann als Systemverwalter die
Rechte jeder Datei und jedes Verzeichnisses ändern, der normale Nutzer nur
entsprechend der Rechte die er an der Datei/dem Verzeichnis hat. MSL.
Auf der linken Seite ist das DOS-Kommando aufgeführt, auf der Rechten das Linux- Pendant
ATTRIB: chmod
COPY: cp
DEL: rm
MOVE: mv
REN: mv
TYPE: more, less, cat
Umlenkungs- und Pipingoperatoren: < > >> |
Platzhalter: * ?
nul: /dev/null
prn, lpt1: /dev/lp0 oder /dev/lp1; lpr
DOS Linux
________________________________________________________________
C:\GUIDO>ATTRIB +R DATEI.TXT $ chmod 400 datei.txt
C:\GUIDO>COPY JOE.TXT JOE.DOC $ cp joe.txt joe.doc
C:\GUIDO>COPY *.* TOTAL $ cat * > total
C:\GUIDO>COPY FRAKTALE.DOC PRN $ lpr fraktale.doc
C:\GUIDO>DEL TEMP $ rm temp
C:\GUIDO>DEL *.BAK $ rm *~
C:\GUIDO>MOVE VORTRAG.TXT TMP\ $ mv vortrag.txt tmp/
C:\GUIDO>REN VORTRAG.TXT VORTRAG.ASC $ mv vortrag.txt vortrag.asc
C:\GUIDO>PRINT BRIEF.TXT $ lpr brief.txt
C:\GUIDO>TYPE BRIEF.TXT $ more brief.txt
C:\GUIDO>TYPE BRIEF.TXT $ less brief.txt
C:\GUIDO>TYPE BRIEF.TXT > NUL $ cat brief.txt > /dev/null
nicht verfügbar $ more *.txt *.asc
nicht verfügbar $ cat abschnitt*.txt | less
Bemerkungen:
*
ist unter Linux intelligenter: *
paßt auf alle
Dateien, außer auf die versteckten, .*
paßt auf die versteckten Dateien
(aber auch auf das aktuelle Verzeichnis ».
« und das übergeordnete
Verzeichnis »..
«; Vorsicht!), *.*
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.
more
benutzt, kann man mit der 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.
UNDELETE
, also zweimal überlegen bevor man
etwas löscht.
< > >>
hat Linux noch
2>
um Fehlermeldungen umzulenken (stderr). Darüber hinaus lenkt
2>&1
stderr nach stdout um und 1>&2
stdout nach
stderr.
[]
. Verwendung:
[abc]*
paßt z.B. auf alle Dateien, die auf a, b oder c beginnen;
*[I-N1-3]
paßt auf alle Dateien, die mit I, J, K, L, M, N, 1, 2 oder 3
enden.
lpr
<datei> druckt eine Datei im Hintergrund. Um den Status
der Drucker-Warteschlange zu überprüfen, verwenden Sie lpq
; um eine
Datei aus der Warteschlange zu entfernen verwenden Sie lprm
;
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.
Weitere Programme die sich dieses Themas annehmen gibt es via ftp unter
metalab.unc.edu:/pub/Linux/utils/file/
so z.B. mrename
, rename
oder ren
.
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 in PATH
(Abschnitt
Der Systemstart) ist, startet das
Programm. 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 es statt dessen
./programm
einzugeben.
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 Programm 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/Windows 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.
su - <loginname>
ein. Beispiel: su - root
. Dieses ist nützlich, wenn man etwas erledigen muß, was
normalerweise nur root darf.
exit
. Wenn es noch angehaltene Jobs
gibt (siehe unten), wird man gewarnt.
&
« 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.
ps -ax
Dieses gibt eine Liste aller gerade laufenden Prozesse aus.
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. Außer als root kann man nicht die Prozesse anderer Leute beenden.
Manchmal kann ein Prozeß nur noch durch das Kommando kill -SIGKILL <PID>
beendet werden. Dies beendet jeden Prozeß, da dieses Signal
nicht vom Prozeß abgefangen werden kann, d.h. der Prozeß wird vom Betriebssystem
zwangsweise rausgeschmissen (mit möglichem Datenverlust wenn das Programm seine
Daten nicht mehr speichern kann o.ä.).
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.
jobs
. Hierbei werden Jobs durch ihre Nummer und nicht durch ihre PID
gekennzeichnet.
<CTRL-C>
.
<CTRL-Z>
.
bg <%job>
.
fg <%job>
.
Um den letzten in den Hintergrund geschickten Prozeß wieder in den Vordergrund
zu bringen gibt man einfach fg
ein.
kill <%job>
wobei <job> 1,
2, 3 usw. 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 Windows! 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 (oder es gleich abstürzt).
Um ein Programm auf einem anderen Rechner auszuführen, dessen Adresse z.B.
andere.maschine.de
ist, gibt man ein:
$ telnet andere.maschine.de
Nachdem man eingeloggt ist, kann man das gewünschte Programm starten. Natürlich muß man eine Zugangsberechtigung mit Zugriff auf die Shell auf dieser Maschine haben (ein sogenannter Shellaccount).
Wenn man X-Windows (auch X11 genannt) benutzt, kann man sogar ein X-Programm auf
dem anderen Rechner starten und sich die Ausgabe auf den eigenen Rechner
umlenken. Wenn anderer.grosser.de
der entfernte Rechner ist und
lokal.linux.box.de
der eigene Linuxrechner, muß man wie folgt vorgehen,
um ein Programm auf anderer.grosser.de
zu starten und es von
lokal.linux.box.de
aus zu bedienen:
lokal.linux.box.de
starten, ebenso ein xterm
oder Äquivalentes. Dort gibt man ein:
$ xhost +anderer.grosser.de
$ telnet anderer.grosser.de
remote:$ DISPLAY=lokal.linux.box.de:0.0
remote:$ progname &
(Anstelle von DISPLAY...
, muß man evtl. setenv DISPLAY lokal.linux.box.de:0.0
eingeben. Das hängt von der Shell auf dem entfernten
Rechner ab.)
Und siehe da! progname
startet jetzt auf anderer.grosser.de
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. Darüber
hinaus ist es auch nicht das sicherste Verfahren. Zu dem Thema gibt es ein
(englisches) Mini-HOWTO, das »Remote X Apps mini-HOWTO« unter
www.linuxdoc.org/HOWTO/mini/Remote-X-Apps.html