Ich werde versuchen, den folgenden Text möglichst einfach zu formulieren, damit ihn auch Menschen ohne Basiswissen verstehen können - sollte ich damit scheitern, dürft ihr natürlich gerne fragen.
Desweiteren ist mir durchaus bewußt, dass es bereits einige dieser Guides gibt, allerdings sind die meisten in englisch verfasst, was eventuell für den einen oder anderen eine Hürde darstellen kann. Zum anderen sind sie teilweise nicht aktuell oder nicht einfach genug, dennoch hoffe ich, dass jeder etwas hiervon für seinen weiteren Weg mitnehmen kann.
Dieser Guide baut auf der BASH auf, der momentan am weitest verbreiteten Shell - zumindest auf Linux-basierten Systemen.
Zumindest die zu vermittelnden Grundlagen lassen sich 1:1 auf andere Shells übertragen, wie z.b. die csh, ksh oder zsh, einige höhere Features sind jedoch nur in der BASH verfügbar.
Da das ganze recht ausführlich geworden ist (fast 6000 Wörter), wurde der Thread unterteilt in insgesammt 6 Sektionen
1. Grundlagen (dieser Post)
2. Ein-/Ausgabe, Lesen von Dateien
3. Filterung und Manipulation von Dateien, Arbeiten mit dem Dateisystem
4. Ein kleiner Einstieg in die Automatisierung und das Skripten
5. Die ultimative Macht
6. Ein Überblick Shell-basierter Proramme
Desweiteren gibt es einen Diskussions-Thread, der hier zu finden ist.
Danke an ShadowHunter für die Pinnung, das Verstecken und die Laberei während dem Schreiben.
Ebenfalls Danke an Breaker, für die grammatische Korrektur.
Ich hoffe, für den einen oder anderen ist was dabei - schischa hat sich ja schon gefreut
...viel Spaß.
__________________________________________________
Grundlagen
Zunächst einmal sollte man sich mit den wichtigsten Befehlen auseinandersetzen, um die Shell möglichst effektiv nutzen zu können. Ich werde hierbei nicht auf jede einzelne Option eines Befehls eingehen, denn zum einen sprengt das bei weitem den Rahmen dieses Guides und einige Optionen sind nunmal nicht
für Einsteiger - sie sind entweder zu kompliziert oder teilweise gefährlich. Wer zu einem bestimmten Befehl weitere Informationen wünscht, dem lege ich die jeweilige Manpage (von man=manual/Handbuch, page=Seite) ans Herz, welche sich auf der Shell jeweils durch
man $befehlaufrufen lässt.
__________________________________________________
Die wichtigsten Befehle
Startet man eine Shell, so wird diese (unter X) in einem Terminal ausgeführt, wovon es diverse gibt, die allerdings keinen Einfluss auf die Shell an sich haben, sondern lediglich mehr oder weniger Komfort bzw. Features in der Bedienung liefern. Angefangen bei xterm, bis zur konsole von KDE, gibt es diverse Terminals - bei den meisten Distributionen findet sich ein entsprechender Link im Menü des Windowmanagers bzw. in der Shortcut-Leiste.
Einmal aufgerufen startet das Terminal und in ihm die Shell, welche uns normalerweise direkt in unser Home-Verzeichnis führt. So lange man nichts an den Einstellungen geändert hat, ist dies in aller Regel /home/$USER - wobei $USER der entsprechende Username ist.
Sobald die Shell aktiv ist, begrüßt uns ein Prompt, welcher meistens so aussieht
$USER@$HOST $VERZEICHNIS: $. An dem Rechner, an dem ich gerade diesen Text verfasse, würde also der entsprechende Prompt so aussehen
ph030@ayaya ~/: $.
Das Tilde-Zeichen (~) steht dabei für das Home-Verzeichnis des gerade aktiven Users, was in meinem Falle gleichbedeutend mit /home/ph030 ist.
Das Zeichen ist nicht unbedingt nötig, da es sich jedoch für sämtliche Befehle entsprechend nutzen läßt, kann einem das schonmal ordentlich Tipparbeit ersparen.
Das letzte String-Zeichen ($) im Prompt zeigt an, das wir als normaler User arbeiten, wohingegen das Zeichen zu einem Hash (#) werden würde, wenn wir uns als root einloggen bzw. zum root-Account wechseln.
_________________________________________________
ls
Nun da wir in unserem Home-Verzeichnis sind, könnte es uns interessieren, welche Dateien hier vorliegen - in diesem Zusammenhang verzichte ich erstmal auf die Nennung der Ordner, da unter Linux das Motto gilt: "Everything is a file" - "Alles ist eine Datei", ergo auch ein Ordner. Wirklich interessieren muss uns das allerdings nicht, deswegen werde ich im weiteren Verlauf von Dateien und Ordnern reden, damit der Leser den Überblick nicht verliert.
So, wir möchten also wissen, welche Dateien und Ordner sich unterhalb von ~ befinden. Dazu geben wir einfach den Befehl
lsein, welcher uns eine Liste der Dateien/Ordner ausgibt(ls ist die Abkürzung von listListe).
ph030@ayaya ~/: $ ls test.txt hallo.pdf doll.mp3 downloadsDas bringt uns schoneinmal weiter, ist aber noch nicht zu aussagekräftig. Wenn wir näheres über die einzelnen Einträge wissen wollen, können wir den Befehl ls um den Parameter - eine Angabe, die die weiteren Optionen des Befehls angibt - um -l ergänzen (ein kleines "L"!). Dieser Parameter steht für long, also eine längere und damit ausführlichere Ausgabe.
ph030@ayaya ~/: $ ls -l -rw-r--r-- 1 ph030 users 155915 7. Jan 16:57 dorian.png -rw-r--r-- 1 ph030 users 155736 7. Jan 16:57 dorian-wp.png drwx------ 19 ph030 users 8192 14. Jan 03:46 downloads drwxr-xr-x 2 ph030 users 1 5. Jan 02:54 exthdd
Das sagt uns schoneinmal wesentlich mehr. Zur Erläuterung von links nach rechts:
Das erste Zeichen zeigt an, um was für eine Art Datei es sich handelt. Dabei steht - für eine normale Datei und d für ein Verzeichnis(von d=directory). Desweiteren gibt es noch b und c, diese interessieren uns in diesem Guide jedoch nicht.
Darauf folgend kommen drei Blöcke a drei Zeichen, welche jeweils die Rechte zur Nutzung angeben. Der erste Block steht dabei für den Besitzer, der zweite für die Gruppe, in der der Besitzer ist und der dritte für den Rest der Welt.
Steht in einem solchen Block ein -, so bedeutet dies, das das entsprechende Recht nicht gesetzt ist. Von links nach rechts gibt es die drei Rechte r(lesen), w(schreiben) und x(ausführen).
Zugegeben, was die folgende Zahl angeht, bin ich mir nicht wirklich sicher, was sie bedeutet und bevor ich was falsches schreibe, lasse ich es lieber gleich - jedenfalls hat sie für uns erstmal keine wirkliche Bedeutung (wenn jemand weis, worum es sich handelt, möge er mir/uns das bitte mitteilen!).
Folgend auf die unbekannte Zahl kommt der Name des Besitzers der Datei - meistens ist dies gleichzeitig auch der Ersteller, dies muss jedoch nicht so sein!
Darauf folgend der Name der Gruppe, welche ebenfalls Zugriff auf die Datei hat. Abgesehen von ein paar Sonderfällen, handelt es sich hierbei in der Regel um eine der folgenden: users, wheel oder root.
Gefolgt von der Gruppe kommt die Größe der Datei in Bytes - wer hier lieber "vernünftig" lesbare Werte hätte, sollte als Parameter zusätzlich(!) noch -h angeben, was für "human readable" steht und die Zahl entsprechend in KB, MB oder GB wandelt - das Erstellungsdatum sowie letztendlich der richtige Name.
Natürlich ist mit ls auch eine Suche nach speziellen Mustern möglich, so lassen sich z.B. alle Dateien mit der Endung .mp3 finden und auflisten, indem wir einfach
ls *.mp3eingeben. Abgesehen von dem Asterisk *, welches sämtliche möglichen Zeichen in jeder beliebigen Anzahl beschreibt, gäbe es z.B. auch das ?, welches für ein einzelnes Zeichen steht, wodurch sich durch die Eingabe von
ls h?llo.txtz.B. die Dateien "hello.txt" und "hallo.txt" finden lassen, sowie natürlich jede weitere Datei, die auf das entsprechende Muster passt.
_________________________________________________
cd
Durch den obigen Einsatz von ls -l haben wir also meinen Download-Ordner "downloads" gefunden und möchten nun dorthin wechseln. Nichts einfacher als das. Wir geben einfach
cd downloadsein und schon landen wir im entsprechenden Verzeichnis.
cd steht für change directory oder auf deutsch wechsele in das Verzeichnis.
cd hat drei sehr schöne Features, die uns einiges an Tipparbeit ersparen können, deswegen möchte ich sie mal nicht vorenthalten - desweiteren bin ich mir annähernd sicher, dass selbst einige Poweruser das dritte Feature noch nicht kennen.
1. Wir gehen davon aus, dass wir uns in /home/ph030/test/code/ befinden und möchten zurück nach /home/ph030/test/. Am einfachsten geht das durch die Eingabe von
cd .., welches immer eine Ebene nach oben springt, solange es möglich ist.
2. Wir gehen davon aus, wir befinden uns in /home/ph030/downloads/p2p/finished/toller_film/unterverzeichnis/ah/hier/liegt/die/datei/ und möchten zurück auf die Basisebene unseres Homeverzeichnisses, also nach /home/ph030.
Dafür gibt es nun mehrere Möglichkeiten:
-
cd ../../../../../../../../../../nicht wirklich toll, oder?
-
cd ~, na, wer erinnert sich noch an die oben vorgestellte Tilde? Dies ist auf jeden Fall schon besser, aber...
-
cd...dies sind wieder zwei gesparte Zeichen und bringen den selben Effekt
3. Wir gehen davon aus, wir befinden uns in /home/ph030/downloads/p2p/finished/toller_film/unterverzeichnis/ah/hier/liegt/die/datei/ und möchten mal kurz nach /usr/share/doc/$program-$version/files/html/index/pictures/frame/, ergo geben wir also den folgenden Befehl ein
cd /usr/share/doc/$program-$version/files/html/index/pictures/frame/. Nachdem wir unsere Arbeit hier verrichtet haben, wollen wir wieder ins vorherige Verzeichnis zurück, sind allerdings zu faul,
cd /home/ph030/downloads/p2p/finished/toller_film/unterverzeichnis/ah/hier/liegt/die/datei/einzugeben - verständlich. Die meisten graphischen Dateisystembrowser, wie z.B. Konqueror oder Nautilus haben einen "Zurück"-Knopf, welcher einen direkt zum zuletzt genutzten Verzeichnis bringt. Wenn ein solches Feature auf der Shell fehlen würde, wäre das doch mehr als tragisch, v.a. da viele der GUI-Browser ja direkt die Möglichkeiten der Shell nutzen und keine eigenen Befehle mitbringen. Ergo gibt es diesen Befehl natürlich auch in der Shell und er ist alles andere als kompliziert - ein einfaches
cd -wechselt zwischen den beiden zuletzt genutzten Verzeichnissen hin und her
_________________________________________________
cp
cp kommt von copy oder auf deutsch kopieren.
Wie der Name schon sagt, kann man damit Dateien/Ordner schnell und einfach kopieren, z.B. so
cp test.txt downloads/test.txt. Gleichzeitig kann man der neuen Datei natürlich auch einen neuen Namen verpassen, nämlich so
cp test.txt test2.txt.
Beim kopieren von Ordnern sollte man den Parameter -r nicht vergessen, was für rekursiv steht. Ansonsten klappt es meistens nicht so, wie man es gerne hätte.
Desweiteren sind die Parameter -a, -i und -p zu erwähnen. Wobei -a (archive)alles angegebene kopiert, also auch den Ordner selbst und gleichzeitig die Rechte bei behält, -p (preserve) lediglich die Rechte beibehält und - i (interactive)[/-i] nachfragt, bevor eine Datei überschrieben wird.
Natürlich lassen sich auch hier wieder * und ? verwenden, wir sind ja bekanntlich faul
_________________________________________________
mv
mv kommt von move, auf deutsch verschieben und macht, was der Name verspricht. Es verschiebt Dateien sowie Ordner von einem Ort zum anderen und/oder nennt Dateien/Ordner um.
mv test.txt downloads/test.txtverschiebt die Datei in den Download-Ordner.
mv test.txt downloads/meintest.txtverschiebt die Datei in den Download-Ordner und benennt sie gleichzeitig um.
Auch hier gibt es den von cp bekannten Parameter -i, welcher auch die selbe Bedeutung hat und natürlich funktionieren auch hier wieder * und ?.
* und ? funktionieren übrigens fast überall, weshalb ich diese im Folgenden nicht mehr erwähnen werde, es sei denn, ihr Vorkommen hat bei einem bestimmten Befehl eine andere Bedeutung.
_________________________________________________
rm
Irgendwann ist man einer Datei bestimmt mal überdrüssig oder braucht einfach wieder freien Platz auf der Platte, folglich bietet es sich also an, einfach ein paar unbenötigte Dinge zu löschen - was auf englisch übrigens to remove bedeutet und erklärt, woher die Abkürzung rm steht.
Wichtig zu erwähnen hierbei ist, dass rm normalerweise so funktioniert, wie löschen unter Windows. Es wird zwar nichts in einen Papierkorb verschoben, dennoch sind die Dateien wiederherstellbar - solange in der Zwischenzeit nichts neues in die entsprechende Stelle geschrieben wurde. Wer etwas sicher löschen möchte, sollte sich einmal an den Erzfeind unserer Lieblingsschildkröten wenden und seinen Namen etwas kürzen, dann wird man wohl bei shred landen
rm bedient sich wie alle bisher vorgestellten Befehle, folglich führt der Aufruf von
rm test.txtzu deren Löschung - oder besser, der Verweis im Dateisystem wird gelöscht. Auch hier gibt es wieder den Sicherheitsparameter -i - er existiert nicht umsonst, den falsche Bedienung von rm kann das System ganz schnell unbrauchbar machen - jedenfalls dann, wenn man als root unterwegs ist.
Es sollte übrigens angemerkt werden, dass ein als root ausgeführtes
rm -rf /nicht funktioniert, wie man es erwarten könnte, dennoch sollte man davon Abstand halten, es macht zwar nicht wirklich alles kaputt, aber immerhin soviel, dass man nur mit Trick17 an einer Neuinstallation vorbeikommt.
(Es gibt übrigens viel schönere Methoden, ein System unbrauchbar zu machen, aber bevor ich hier verantwortlich gemacht werde, dass ein System nicht mehr funktioniert, sage ich lieber mal nichts. Die Interessierten mögen sich an Google wenden, oder den Thread im Gentoo-Forum aufsuchen, wo diverse
Möglichkeiten genannt werden, wie man sich möglichst elegant ins Knie schiessen kann )
Wo wir gerade bei -f sind, dieser Parameter steht für force. Er hat zwar nichts mit StarWars zu tun, trotzdem geht es um die Macht und da die Machthaber bekanntlich gerne nicht das machen, was das Volk eigentlich will, sollte man von diesem Parameter absehen, solange man sich nicht 100%ig sicher ist.
Um übrigens ganze Verzeichnisse, samt darin liegenden Dateien zu löschen, kann man den von cp bekannten Parameter -r verwenden, also z.B.
rm -r downloads.
_________________________________________________
mkdir
Um Verzeichnisse zu löschen, sollte man natürlich erstmal ein paar Verzeichnisse anlegen. Der Engländer würde wohl sagen "let's make a directory", doch Linux-User sind bekanntlich faul, folglich ziehen wir diesen Satz einfach zu einem kurzen und prägnanten mkdir zusammen.
Nachdem wir also unser schönes Download-Verzeichnis gelöscht haben, fiel uns auf, dass es doch ein ziemliches Kuddelmuddel wäre, sämtliche Dateien direkt in ~ zu speichern - wir wollen also unseren Ordner wieder. Nichts leichter als das, ein
mkdir downloadsgenügt. Wollen wir hingegen gleich eine Struktur aufbauen, also z.B. downloads/p2p/torrent haben, so müssen wir mkdir noch den Parameter -p übergeben - ansonsten gibt's eine Fehlermeldung. Der korrekte Aufruf sähe dann also so aus:
mkdir -p downloads/p2p/torrent
_________________________________________________
touch
touch ist ein etwas seltsamer Name und sagt nicht wirklich aus, was der Befehl eigentlich macht und obwohl einige ihn als überflüssig empfinden, hat er doch hin und wieder seine Daseinsberechtigung. touch ist das Gegenstück zu mkdir und erstellt Dateien - leere Dateien wohlgemerkt! (Gut, nebenbei kann man damit auch die letzte Zugriffszeit einer Datei manipulieren, aber das wird vom Standarduser wohl kaum gemacht.)
touch meinedatei.txtlegt uns also die genannte Datei im aktuellen Verzeichnis an.
_________________________________________________
Fazit der Grundlagen
Es behaupten ja gelegentlich einige Menschen, dass selbst die Grundbefehle schon viel zu kryptisch und kompliziert wären. Wenn man sich jedoch ansieht, woher der Name des Befehls kommt und was er bewirkt, kann man (denke ich) doch schon die Logik erkennen. Man könnte natürlich auch immer z.B. [i]removedirectory schreiben, doch auf die Dauer ist das doch schon etwas ungeschickt und zu Zeiten von MS-DOS hat sich doch auch niemand beschwert
Die simpelsten Möglichkeiten haben wir also schon gelernt, wir können Dateien und Verzeichnisse erstellen, löschen, verschieben und kopieren, womit mindestens 50% des alltäglichen PC-Gebrauchs wohl schon abgedeckt sein dürften.
Die Herren und Damen "Einsteiger" möchte ich ermutigen, das gelesene doch bitte auch einmal selbst auszuprobieren, zum einen bleiben die Befehle durch praxisnahe Übungen besser im Gedächtnis und zum anderen könnte ich sonst ja viel erzählen, aber es würde kaum jemand überprüfen - vielleicht hab ich ja auch irgendwo gelogen