shell pfad mit script ändern.

Post Reply
Message
Author
hammerP

shell pfad mit script ändern.

#1 Post by hammerP »

wie kann ich mit einem script ändern, welchen pfad die shell nach ausführen des scripts hat ?
wenn ich nämlich einfach cd benutze, dann bleibt das verzeichnis nur bis zum ende des scripts aktiv und danach hab ich wieder den voherigen.

Jochen

Re: shell pfad mit script ändern.

#2 Post by Jochen »

Das Arbeitsverzeichnis ist eine Eigenschaft des Prozesses. Wenn Du ein Skript aus einer Shell heraus startest, läuft diese als eigener Prozess. Also änderst Du mit "cd" im Skript nur das Arbeitsverzeichnis des Prozesses, der das Skript abarbeitet, genau so wie Du es beschrieben hast. Die Shell wartet lediglich auf die Beendigung des Prozesses, der das Skript abarbeitet; deren Arbeitsverzeichnis ändert sich daher nicht.

Workarounds: Entweder das Skript mittels "source skript" oder ". skript" aufrufen. Aber Achtung: Dann führt die Shell selbst das Skript aus! Wenn in dem Skript irgendwo ein "exit" steht, beendet sich Deine Shell und Du musst Dich neu anmelden. Oder aber Du lässt das neue Arbeitsverzeichnis als Text durch das Skript ausgeben und machst beim Aufruf "cd `skript`".

Andere Möglichkeiten gibt es meines Erachtens nicht.

Jochen

hubert

Re: shell pfad mit script ändern.

#3 Post by hubert »

> Andere Möglichkeiten gibt es meines Erachtens nicht.

eine andere (aber ähnliche) möglichkeit <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle"> (wenn du stdout für anderen output benützen willst): das neue verzeichnis in eine environment-variable exportieren, nach beenden des skripts dann cd $NEUERPFAD.
das ist etwas umständlich, daher mach ich das per alias (in meinem mount-skript: mounte das drive und gehe gleich ins entsprechende verzeichnis).

Jochen

Re: shell pfad mit script ändern.

#4 Post by Jochen »

@hubert: ??? Würdest Du das Mount-Skript/Alias mal posten? Was Du da erzählst geht nämlich nicht. <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle"> (Zumindest so, wie ich Dich verstanden habe...)

Die Umgebungsvariablen sind genauso Bestandteil eines Prozesses wie das Arbeitsverzeichnis. Wenn Du also in einem Skript eine Variable setzt und exportierst, erhält jeder von diesem Prozess abstammende Prozess die Umgebungsvariable mitgegeben - aber niemals der Eltern-Prozess! Die "Vererbung" geht immer nur vom Eltern-Prozess zum Kind-Prozess, und zwar zum Zeitpunkt, wo der neue Prozess mittels fork() erzeugt wird. Ändert sich danach der Inhalt einer Umgebungsvariablen im Kind- oder Eltern-Prozess, kriegt das der jeweils andere nicht mit, da jeder Prozess seine eigene lokale Kopie besitzt.

Innerhalb eines Alias ist es eine andere Sache: Ein Alias wird in der Shell ausgeführt, in der der Aufruf stattfindet, ähnlich den Sourcen eines Skriptes wie oben erläutert.

Aber dann wäre ich schon neugierig, wie Du das anwendest...

Jochen

hubert

Re: shell pfad mit script ändern.

#5 Post by hubert »

@Jochen:

> Würdest Du das Mount-Skript/Alias mal posten? Was Du da erzählst geht nämlich nicht.

ah, mist, ich hab das skript noch gar nicht fertig, hatte aber vorgehabt, es so zu implementieren. und ich war mir ganz sicher, dass es so geht <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle"> . war bisher nur zu faul, es umzusetzen.
ich hatte vor ner weile nämlich das gleiche problem (und auch hier gepostet -- damals hatte auch keiner ne wirklich gute lösung), und ich hab es dann erstmal liegen lassen.

du hast recht mit deinen bedenken - so geht es nicht. aber stdout kommt in meinem fall auch nicht in frage, da ich noch anderen output habe. da werd ich um eine temporäre datei wohl nicht rumkommen (nicht sehr elegant, aber damit gehts wenigstens immer).

Jochen

Re: shell pfad mit script ändern.

#6 Post by Jochen »

Uff - und ich dachte schon, ich müsste mein gesamtes UNIX-Prozesse/Shell-Wissen revidieren! <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

Kleiner Dämpfer am Rande: Du musst irgendwie die aufrufende Shell dazu kriegen, Deine Temp-Datei zu sourcen. Das ginge über ein<pre>alias mein-cmd="/usr/local/bin/mein-echtes-cmd ; . /tmp/cd-wechsel.tmp"</pre>Das Problem an der Sache ist, dass man immer damit rechnen muss, dass das Kommando mehrfach gleichzeitig (ja ja, ich weiss - "quasiparallel") laufen kann. Also könnte dann eine Instanz den Inhalt der Temporär-Datei überschreiben, den eine andere gerade erst dort hineingelegt hat. Aus dem Skript heraus kann man sich aber keinen eindeutigen Namen ausdenken, da die aufrufende Shell den Namen ja nicht kennt. Also wird der Alias noch etwas komplexer...<pre>alias mein-cmd="VAR=`mktemp /tmp/meinetmp.XXXXXX` ; /usr/local/bin/mein-echtes-cmd $VAR ; . $VAR ; rm -f $VAR"</pre>Ein ziemlich hässlicher Hack, aber so sollte es gehen... Natürlich muss das Skript noch wissen, dass es einen der Übergabeparameter als Dateinamen für eine Temporär-Datei verwenden soll. Und dass wird dann wieder hässlich, wenn irgendein Bastler das Skript ohne Alias von Hand aufrufen will.

Man kann es drehen und wenden, wie man will: Es ist hinreichend kompliziert und unsicher, dass man für 99% aller genausogut sagen könnte "Es geht halt nicht." <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

Jochen

hubert

Re: shell pfad mit script ändern.

#7 Post by hubert »

> Uff - und ich dachte schon, ich müsste mein gesamtes UNIX-Prozesse/Shell-Wissen revidieren!

kannst also beruhigt sein <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

> Du musst irgendwie die aufrufende Shell dazu kriegen, Deine Temp-Datei zu sourcen.

die tmp-datei soll eigentlich nur den verzeichnisnamen enthalten. cd `cat temp_file`

> dass man immer damit rechnen muss, dass das Kommando mehrfach gleichzeitig (ja ja, ich weiss - "quasiparallel") laufen kann. Also könnte dann eine Instanz den Inhalt der
> Temporär-Datei überschreiben. [...] Also wird der Alias noch etwas komplexer...
> alias mein-cmd="VAR=`mktemp /tmp/meinetmp.XXXXXX` ; /usr/local/bin/mein-echtes-cmd $VAR ; . $VAR ; rm -f $VAR"

ok, wenn man ganz sicher gehen will. in meinem fall ist das mount-script aber zum auruf aus der konsole gedacht (nicht zum aufruf aus anderen scripts -- dort kann man ja ruhig das ausgeschriebene mount-command benutzen. nur in der konsole soll es etwas komfortabler sein). pro benutzer wird also zu jeder zeit nur eine instanz des scripts laufen. es sollte daher ausreichen, wenn man die UID an den filenamen anhängt. (zudem bin ich ja der einzige user auf meinem system hehe).

alias rauf='pushd .; /usr/local/bin/mounter --mount; cd `/tmp/mount.$UID`; rm /tmp/mount.$UID'
alias runter='popd; /usr/local/bin/mounter --umount'
"rauf f" mountet dann die "fd" und transportiert mich trockenen fusses nach /mnt/floppy.

...so in der art etwa hab ich mir das vorgestellt.

(dass ich nicht gleich das ganze script sourcen will (was ja die einfachste lösung wäre): weil dann nachher sämtliche definitionen des scripts (inclusive functions) in der aktuellen shell rumlungern).

> Es ist hinreichend kompliziert und unsicher, dass man für 99% aller genausogut sagen könnte "Es geht halt nicht."

wie meinst du das? warum 99%?

das pushd bringt mich noch auf eine andere idee: könnte nicht das script das zielverzeichnis auf den DIR-stack legen, und der alias holt ihn dann ab? oder wird der DIR-stack auch irgendwie vererbt?

hubert

Re: shell pfad mit script ändern.

#8 Post by hubert »

nachtrag:

1.
> könnte nicht das script das zielverzeichnis auf den DIR-stack legen, und der alias holt ihn dann ab? oder wird der DIR-stack auch irgendwie vererbt?

argh! das geht natürlich auch nicht, "dirs" wird vererbt.

2.
mktemp ist natürlich die bessere lösung, auch auf einem 1-user-system.

Post Reply