Schrift
[thread]8170[/thread]

Verzeichnis in aufrufender Shell ändern

Leser: 14


<< >> 10 Einträge, 1 Seite
Gecko
 2006-07-17 19:30
#68163 #68163
User since
2003-08-11
4 Artikel
BenutzerIn
[default_avatar]
Hi,

ich versuche gerade ein Skript namens go zu schreiben, dass einen Verzeichnisnamen als Parameter erwartet, dieses sucht und dann in dieses Verzeichnis wechselt.

Also go projekt in der Shell aufgerufen soll, z.B. nach
.\src\sonstwas\projekt
wechseln.

Das Ganze funktioniert wunderbar unter MS, aber unter Linux habe ich das Problem, dass das go zwar mit

Code: (dl )
chdir ('.\src\sonstwas\projekt');


das Verzeichnis wechselt, aber natürlich nur in seiner Subshell. Wenn sich das Script beendet bin ich wieder genau dort, wo ich begonnen habe. Kennt irgendwer ein Trick, um da herauszukommen? Ich habe schon versucht:

1.) chdir ("...");
2.) system("cd ...");
3.) ENV{PWD} = ...; # nur aus Verzweiflung.

immer mit dem gleichen Resultat. Nach dem Skript sitzt man im gleichen Verzeichnis
topeg
 2006-07-17 22:51
#68164 #68164
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Unter linux ist das in einer shell nur mit einem "include" möglich.
ungefähr so:
nimm die "bashrc" zur hand (entwerder die globale in /etc/) oder die lokane in ~/.bashrc
und füge ein Zeile dieser Art hinzu:

Code: (dl )
1
2
3
4
function go()
{
cd /irgendwohin/
}


Du könntest auch eine datei "go.sh" mit dem obrigen inhalt erzeugen und dann in der bashrc zuladen oder von Hand ausführen:
Code: (dl )
. /irgendwo/go.sh


Dann kannst du mit "go" in der aktuellen Shell in das Verzeichnis wechseln.

Etwas anderes würde mir erstmal nicht einfallen.\n\n

<!--EDIT|topeg|1153162939-->
Gecko
 2006-07-18 01:27
#68165 #68165
User since
2003-08-11
4 Artikel
BenutzerIn
[default_avatar]
Mehr muss Dir auch gar nicht einfallen. Funktioniert wunderbar.

Ich habe mein go Skript so geändert, dass es das gefundene Verzeichnis nur printet und etwas abgewandelt die go Funktion in der lokale .bashrc angelegt:
Code: (dl )
1
2
3
4
function go()
{
cd `perl ~/bin/go $1`
}


und schon wechselt
Code: (dl )
go doc


nach .\src\projekte\gecko\doc
cool

Vielen Dank
betterworld
 2006-07-18 02:05
#68166 #68166
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Seltsame Shell. Bash unter Windows?
[quote=Gecko,17.07.2006, 23:27]
Code: (dl )
1
2
3
4
function go()
{
cd `perl ~/bin/go $1`
}
[/quote]
Da wuerde ich aber cd "`perl ~/bin/go $1`" schreiben, damit es keine Probleme bei Verzeichnissen mit Leerzeichen gibt.
Quote
und schon wechselt
Code: (dl )
go doc


nach .\src\projekte\gecko\doc

Da haettest Du auch einfach CDPATH=~/src/projekte/gecko setzen können und danach einfach cd doc sagen.
GwenDragon
 2006-07-18 11:39
#68167 #68167
User since
2005-01-17
14555 Artikel
Admin1
[Homepage]
user image
[quote=betterworld,18.07.2006, 00:05]Seltsame Shell.  Bash unter Windows?
...
nach .\src\projekte\gecko\doc[/quote]
Selbst bash unter Windows mach sowas nicht mit
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

Gecko
 2006-07-18 11:48
#68168 #68168
User since
2003-08-11
4 Artikel
BenutzerIn
[default_avatar]
Kein Windows. Bei Windows wirkt sich ein chdir direkt auf die aufrufende Shell aus. Windows habe ich nur mal testweise versucht. Haben wollte ich es für Linux.

Die CDPATH Variable hilft nichts, weil der Prefix nicht statisch ist. ./src/projekte/gecko/doc ist nur ein Beispiel. Wir könnten genauso gut in ./bin/blah1/blubb/doc landen. Mein go Skript sucht (von meinem Homeverzeichnis aus) das gesucht Verzeichnis, z.B. doc. Befinden wir uns bereits in einem doc, wird die Suche solange fortgesetzt, bis das Aktuelle Verzeichnis gefunden wird, dann noch eines weiter. Wird kein weiteres doc gefunden, springt er zum ersten Vorkommen. Dadurch springen wir durch mehrmaliges aufrufen von go doc nacheinander die verschiedenen docs durch. Die Verzeichnisstruktur wird flach durchsucht, damit
./1/1/1/1/doc nicht vor ./2/doc gefunden wird.
Sicherlich lässt sich das Verfahren noch optimieren. Aber so funktioniert es schon sehr gut.

Der Hinweis mit den Anführungszeichen ist allerdings völlig richtig. Die werde ich ergänzen.\n\n

<!--EDIT|Gecko|1153209008-->
Gecko
 2006-07-18 11:53
#68169 #68169
User since
2003-08-11
4 Artikel
BenutzerIn
[default_avatar]
Upps, das ist mir jetzt aber peinlich. Ich seh gerade Euer Problem. Es muss natürlich

./src/.../

heissen. Hab vermutlich zu lange unter Windows gearbeitet, bevor ich die Frage gestellt habe.
gstueb
 2016-04-20 13:01
#184514 #184514
User since
2009-04-16
4 Artikel
BenutzerIn
[default_avatar]
Hallo,

jetzt muss ich diesen alten Threat nochmal aufwärmen - denn ich habe genau das gleiche Problem aber noch keine Lösung:

Wenn ich unter Perl 5 für Windows mit chdir() das Verzeichnis wechsle, bin ich nach der Ausführung des Perl-Scripts immer noch in dem Verzeichnis, von dem aus ich das Perl-Script gestartet hatte - wahrscheinlich, weil das Script in einer eigenen Umgebung läuft.

Ist es denn grundsätzlich möglich, das aktuelle Verzeichnis der aufrufenden Shell in Windows über Perl zu wechseln?

Ich schreibe derzeit ein kleines Tool, mit dem man Aliase für bestimmte häufig gebrauchte Funktionen anlegen kann - und da sollen Verzeichniswechsel dazu gehören.

Laut dem Threat Verzeichnis in aufrufender Shell ändern soll sich der chdir() unter Windows ja direkt auf die aufrufende Shell auswirken, bei mir ist das aber nicht der Fall.

Hat jemand eine Idee?

Danke & Grüße,
Gregor
bianca
 2016-04-20 13:07
#184516 #184516
User since
2009-09-13
6978 Artikel
BenutzerIn

user image
@gstueb: ich arbeite viel mit Win und kann das bestätigen. Das Verzeichnis der Eingabeaufforderung ist eine andere als in Perl. Muss ja, denn beim Direktaufruf ohne Eingabeaufforderung braucht es ja auch ein Verzeichnis.
Und: ja, man kann das mit chdir() wechseln. aber nur das was im Perlscript gilt.
10 print "Hallo"
20 goto 10
Raubtier
 2016-04-20 13:20
#184518 #184518
User since
2012-05-04
1054 Artikel
BenutzerIn

user image
Erstens: eine Bedrohung/Gefahr (=threat) stellt das ganze nicht dar.

Und es gibt keinen akzeptablen Weg, die Umgebung des Elternprozesses zu ändern. (Wenn es doch irgendwie geht, sind das böse Hacks).

Möglich wäre z.B. eine cmd-Datei, die dein Perl-Script aufruft. Das Perl-Script könnte eine cmd-Datei erzeugen, die einen "cd"-Befehl enthält - und diese Datei könntest du dann mit "call" aus der cmd-Datei aufrufen.
<< >> 10 Einträge, 1 Seite



View all threads created 2006-07-17 19:30.