Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
shell pfad mit script ändern.

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Sonstiges
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
hammerP
Gast





BeitragVerfasst am: 29. Aug 2002 20:54   Titel: shell pfad mit script ändern.

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
Gast





BeitragVerfasst am: 30. Aug 2002 12:47   Titel: Re: shell pfad mit script ändern.

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
Gast





BeitragVerfasst am: 30. Aug 2002 13:47   Titel: Re: shell pfad mit script ändern.

> Andere Möglichkeiten gibt es meines Erachtens nicht.

eine andere (aber ähnliche) möglichkeit (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
Gast





BeitragVerfasst am: 30. Aug 2002 14:29   Titel: Re: shell pfad mit script ändern.

@hubert: ??? Würdest Du das Mount-Skript/Alias mal posten? Was Du da erzählst geht nämlich nicht. (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
Gast





BeitragVerfasst am: 30. Aug 2002 15:33   Titel: Re: shell pfad mit script ändern.

@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 . 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
Gast





BeitragVerfasst am: 30. Aug 2002 16:56   Titel: Re: shell pfad mit script ändern.

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

Kleiner Dämpfer am Rande: Du musst irgendwie die aufrufende Shell dazu kriegen, Deine Temp-Datei zu sourcen. Das ginge über ein
alias mein-cmd="/usr/local/bin/mein-echtes-cmd ; . /tmp/cd-wechsel.tmp"
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...
alias mein-cmd="VAR=`mktemp /tmp/meinetmp.XXXXXX` ; /usr/local/bin/mein-echtes-cmd $VAR ; . $VAR ; rm -f $VAR"
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."

Jochen
 

hubert
Gast





BeitragVerfasst am: 30. Aug 2002 17:51   Titel: Re: shell pfad mit script ändern.

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

kannst also beruhigt sein

> 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
Gast





BeitragVerfasst am: 30. Aug 2002 18:17   Titel: Re: shell pfad mit script ändern.

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.
 

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Sonstiges Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy