Diese Website existiert nur weil wir Werbung mit AdSense ausliefern.
Bitte den AdBlocker daher auf dieser Website ausschalten! Danke.

Brauche dringende Hilfe bei Befehlserklärung bin NewBe

Alles rund um die verschiedenen Konsolen und shells sowie die Programmierung unter Linux

Moderator: Moderatoren

Antworten
acarm
Newbie
Newbie
Beiträge: 1
Registriert: 23. Sep 2005, 19:00

Brauche dringende Hilfe bei Befehlserklärung bin NewBe

Beitrag von acarm »

Ich hab da eine Aufgabe die ich nicht ganz lösen konnte hoffentlich könnt Ihr mir da weiter helfen!

vielen Dank im Voraus!

3. Man benutzt das folgende Skript, um die sämtlichen Quelldateien, die sich auf einem EIDE CDROM im Verzeichnis /usr/src/kernel und deren Unterverzeichnis¬sen befinden, auf die Festplatte im Verzeichnis /usr/src/kernel zu kopieren ohne dabei die Attributen der einzelnen Dateien zu ändern.

Code: Alles auswählen

mount /dev/hdb /cdrom
cd /usr/src/kernel
(cd /cdrom/usr/src/kernel && tar cf - *) | tar xvpf -
a) Man erkläre die Bedeutungen der einzelnen Kommandos und ihre Optionen.

b) Wozu dienen die runden Klammern? Was wird passieren, wenn sie nicht eingesetzt werden?

c) Ausgehen von der LOGIN Shell, erkläre man wie die dritte Kommandozeile

Code: Alles auswählen

(cd /cdrom/usr/src/kernel && tar cf - *) | tar xvpf -
in Unix ausgeführt wird. Welcher Systemaufruf wird benutzt um die Pipe zu realisieren, und wie? Dazu kann Pseusocode und/oder Prozessbaum benutzt werden.
Benutzeravatar
robi
Moderator
Moderator
Beiträge: 3202
Registriert: 25. Aug 2004, 02:13

Beitrag von robi »

Sind ja nur 3 "einfache" Zeilen also mal eine kurze Erklärung, was hier gemacht wird, ohne deine Aufgabe wirklich richtig zu lösen.
Keine Ahnung was du für Vorkenntnisse hast, wenn dir die Erklärung nicht ganz ausreichen sollte, dann mal in der LINUX-Fiebel mal ein bisschen mit den Grundlagen beschäftigen. http://www.linuxfibel.de/
ansonsten man mount; man cd; man bash; man tar

mount /dev/hdb /cdrom
hier wird nichts weiter gemacht als das Filesystem der CDROM die sich am 1 IDE-Kontroller am Slave-Anschluss befindet in den Verzeichnisbaum von LINUX in das Verzeichniss /cdrom eingehängt.

cd /usr/src/kernel
Hier wird mir der aktuellen Shell auf das Verzeichnis /usr/src/kernel gewechselt.

(cd /cdrom/usr/src/kernel && tar cf - *) | tar xvpf -
zerlegen wir erst mal ein wenig um uns die Grundstruktur dieser Befehlszeile anzuschauen
( 1.Befehl ) | 2.Befehl
es werden 2 Befehle ausgeführt und mittels PIPE verbunden, das heißt das die Standartausgabe des 1.Befehles direkt an die Standarteingabe des 2.Befehles gesendet wird.
die Klammer um den ersten Befehl, bedeutet, dass dieser Befehl nicht in der aktuellen Shell ausgeführt wird, sonder für diesen Befehl eine eigene Shell Subshell eröffnet wird, die diesen Befehl ausführt.
Es wird dabei aber streng genommen die Standartausgabe der Subshell an die Pipe weitergeleitet, doch da eine Shell Ihre Eigenschaften und somit auch die Standartkanäle an die Prozesse weitervererbt die in ihr gestartet werden, werden also alle Ausgaben aller Befehle die in dieser Subshell ausgeführt werden würden, an die Pipe weitergeleitet.
(cd /cdrom/usr/src/kernel && tar cf - *)
also die Klammer hatten wir ja schon erklärt, es wird also eine extra Shell eröffnet die diesen Befehl abarbeitet. bleibt
1.Befehl && 2.Befehl
Bedeutet der erste Befehl wird ausgeführt und nur wenn dieser ohne Fehler ausgeführt werden kann, wird der 2 Befehl ausgeführt, führt der erste Befehl zu einem Fehler wird der 2 Befehl gar nicht erst ausgeführt.
cd /cdrom/usr/src/kernel
das kannst du jetzt schon alleine beantworten
tar cf - *
tar ist ein Archivierungsprogramm mit einer Vielzahl von Optionen
mit diesen Optionen wird folgendes bewirkt.
ein TAR-Archiv wird neu angelegt und auf der Standartausgabe ausgegeben. Die Dateien die archiviert werden sollen sind mit * angegeben, das bedeutet im Aktuellen Verzeichnis alle Dateien und Verzeichnisse samt deren eventuellen Unterverzeichnisse. also alles was in diesem Verzeichniss steht wird zu einem Archiv zusammengepackt und liegt an der Standartausgabe zur Abholung.
Wir erinnern uns, die Standartausgabe der Shell also das was in () steht ist mit der Pipe Verbunden und
tar xvpf -
also dieser Befehl ließt jetzt aus der Pipe und das ist wieder ein tar
diesmal wird aber mittels Optionen ein Archiv von der Standarteingabe gelesen und wieder ausgepackt, weitere Optionen sagen es soll jeder Dateiname ausgegeben werden der wieder ausgepackt wird und die Zugriffsrechte sollen wieder genauso gesetzt werden, wie sie im Archiv von den Orginaldateien archiviert sind.
Das Archiv bzw dessen Dateien wird dabei in das aktuelle Verzeichniss ausgepackt, und da es sich nicht um die Subshell handelt die Klammer ist schon zu ende, gilt hier als aktuelles Verzeichnis das was wir in der 2 Zeile gesetzt haben.

Das Ganze hat sich jetzt zu einem einfachen Kopiervorgang von einem Verzeichnis von der CD /usr/src/kernel in ein Verzeichnis /usr/src/kernel auf die Festplatte entpuppt, warum aber dann der Umweg über ein Tararchiv.
Ganz einfach es gibt im LINUX eine Reihe von Spezialfiles die von nicht allen "normalen" Programmen richtig behandelt werden, Obendrein gibt es reine Reihe von Zugriffsrechten und Besitzrechten und Zeitstempeln. Da man nicht immer sicher sein kann das sich solche Spezialfiles in den zu kopierenden Daten befinden, benutzt man den Umweg über ein Archivierungsprogram, die können das mit Sicherheit fehlerfrei und haben obendrein noch eine Reihe von Optionen mit denen man bestimmte Sachen wie zB Zugriffrechte, Besitzrechte und Zeitstempel wieder richtig setzen kann.
Im vorliegenden Fall hätte wahrscheinlich auch ein cp mit einigen Optionen vollkommen ausgereicht, aber ich hätte es rein aus dem Bauch heraus sicher ähnlich gemacht, wenn ich die Aufgabe gehabt hätte. Ich würde mal sagen das sind "ROOT-Allüren", Root will sich eben immer wichtig machen.:wink:

Zusatzfrage von mir, was passiert, wenn wenn der erste Befehl einen Fehler produziert, also die CD-Rom nicht eingehängt werden kann, in der 3 Zeile ?????

robi
Antworten