Bernd Brodesser schrieb:
Hallo Roman,
Du hast ja schon einiges bekommen, ich wollte aber noch mal die Zusammenhänge etwas klar machen, damit man es auch verstehen kann. Zunächst aber eine kleine Kritik an Deinem Skript:
* Roman Langolf schrieb am 21.Aug.2003:
ich hab so ein kleines script geschrieben:
# /bin/sh
cd /home/roman/foo/.;
Was soll der . am Ende bringen? Jedes Verzeichnis hat als Unterverzeichnis das Verzeichnis . Aber es ist nichts anderes als ein Hardlink auf sich selber. Mit cd /hom/roman/foo/. wechselst Du in jenes Verzeichnis, aber es ist genau das Gleiche als ob Du nach /home/roman/foo wechseltest; denn genau das machst Du. Also kannst Du gleich cd /home/roman/foo sagen.
Stimmt, ich hab's aber so nur zu Test-zwecken ausprobiert, und dann per cut&past in die Liste geschickt...
Auch das ; ist überflüssig. Ein Befehl wird durch Zeilenumbruch oder ; abgeschlossen. Nur eins von beiden ist nötig. Wenn da ein Zeilenumbruch steht, braucht man nicht noch ein Semikolon.
aha, das wusste ich nicht... ich kenn so von PHP (auch Perl und C?) dass da nach jeder Anweisung/Befehl ein ; gebraucht wird...
dir -al;
Der Hinweis auf ls hast Du ja schon mehrfach bekommen.
ja.... meine uralte Gewöhung ;)
Nun geht das ding hin und zeig mir Inhalt von dem Verzeichnis. Ich möcht aber das er direkt den Pfad in dem ich mich grade befinde wechselt und dann kommt dir...
Wie geht denn dat?
Deine shell, die das Prompt ausgibt und Du was einegeben kannst ist ein Prozeß. Dieser Prozeß hat wie alle anderen auch eine Menge Kenndaten. Dazu gehören z.B das Enviroment, oder auch das Arbeitsverzeichnis. Wenn man nur ein Programm oder auch ein skript aufruft, so wird als erstes ein neuer Prozeß erzeugt. Dies geschieht dadurch, daß alles dupliziert wird. Sowohl das eigentliche Programm, hier also die bash, als auch alle Kenndaten, wie das Arbeitsverzeichnis, der Besitzer und die Gruppe, effektiver Besitzer und effektive Gruppe des Prozesses, das kotrollierende Terminal, die Umgebungsvariablen, werden kopiert. Lediglich die Prozeßnummer (PID) und die Elternprozeßnummer (PPID) sind andere. Dabei ist die Elternprozeßnummer (PPID) die Prozeßnummer (PID) des aufrufenden Prozesses.
Als nächstes wird das Programm oder skript aufgerufen. Dazu wird im Kindprozeß das Programm überschrieben. Im Falle eines skripts mit dem Interpreterprogramm, hier die bash. Die ganzen Kenndaten bleiben aber gleich, auch das Arbeitsverzeichnis. Nun wird Dein Skript ausgeführt. Darin wird das Arbeitsverzeichnis verändert. Wohlgemerkt im Kindprozeß, der Elterprozeß bleibt davon natürlich unberührt. Als nächstes wird ls aufgerufen. Dazu ruft der Kindprozeß seinerseits einen Kindprozeß auf. ls erbt das neue Arbeitsverzeichnis. Nach der Ausgabe beendet sich ls. Und auch der Prozeß der Dein Skript bearbeitet beendet sich, da nichts mehr folgt. Der Elterprozeß bekommt das mit und gibt wieder ein Prompt aus, da es sich um eine interaktive Shell handelt. Aber zwischenzeitlich hat sich an diesem Prozeß nichts verändert, auch nicht das Arbeisverzeichnis. Du bist wieder da, wo Du gewesen bist.
Das Arbeitsverzeichnis kann man somit nur aus dem Prozeß selber heraus verändern, nicht aber über einen Kindprozeß. Man kann nicht die Kenndaten eines anderen Prozesses ändern.
Etwas ganz anderes ist es, wenn Deine interaktive shell, also der Prozeß, in dem Du Deine Befehle eingibst, selber das skript ausführt. Dies kannst Du machen, indem Du das skript mit source oder . aufrufst. Also etwa source skript oder . skript, falls Dein skript skript heißt. Dann führt die bash selber das skript aus, und die Änderung des Arbeitsverzeichnisses wird wirksam.
Die bessere Lösung ist in Deinem Falle aber sicherlich ein alias oder das setzen von CDPATH. Allerdings muß auch das in der interaktiven shell selber geschehen. Die interaktive shell führt bevor sie inteaktiv wird ein paar skripte aus, falls es sie gibt. Hierbei wird unterschieden, ob es sich um eine Loginshell handelt oder um eine normale interaktive shell. Dazu habe ich schon mehrfach was geschrieben, schau bitte ins Archiv oder in man bash, und dort nach INVOCATION suchen.
Danke für eine gute Erklärung! Viele Grüße! Roman -- http://www.jesus.de http://www.thehope.de http://www.ec-thueringen.de