Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Perl/CGI » Verzeichnis feststellen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
17.09.2004, 16:46 Uhr
GateKeeper



Hallo.

Von einem Perl-Skript aus möchte ich das Verzeichnis herausfinden, in dem dieses Skript ausgeführt wird. Ist das überhaupt möglich?

ausführliche Problembeschreibung:
Viele meiner Perl-Skripte muss ich auf unterschiedlichen Servern verwenden. Diese Perl-Skripte arbeiten alle mit absoluten Dateipfaden. Jedesmal wenn ich die Skripte auf einen anderen Server kopiere muss ich nun alle Skriptdateien ändern, so dass die absoluten Pfade auf den neuen Server verweisen.

Wenn ich nun zusammen mit den Skripten immer eine Konfigurationsdatei kopiere, die den Serverpfad enthält müsste ich jedesmal nur noch die Konfigurationsdatei ändern, damit die Dateipfade wieder stimmen.

Die einzelnen Skripte müssen nun wissen, wo sich die Konfigurationsdatei befindet. Mit Cwd::getcwd() erhalte ich leider nur unzuverlässige Pfadangaben die manchmal auf völlig unterschiedliche Verzeichnisse, nicht jedoch das Ausführungsverzeichnis verweisen.

Dieser Post wurde am 17.09.2004 um 18:01 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.09.2004, 17:49 Uhr
typecast
aka loddab
(Operator)


Hab ich das richtig verstanden?
Du willst das Verzeichniss haben, von dem aus man das Script gestartet hat (oder besser, dass aktuelle Arbeitsverzeichniss).
Wenn ja, dann sollte dir das der folgende Code geben:


Code:
use Cwd;

$curdir = cwd;
print "$curdir\n"



Btw: Cwd::getcwd() kennt mein Perlinterpreter gar nicht
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.09.2004, 12:19 Uhr
GateKeeper



Ok. du hast das richtig verstanden. hier nochmal mein Code:


Code:

use Cwd;

$curdir = getcwd() ;




Deswegen habe ich Cwd::getcwd() geschrieben.
In den Perl-Docs steht jedenfalls, dass getcwd() und cwd() im Grunde gleich sind. Bei Einsatz von getcwd() bzw cwd() bekomme ich auch ein Verzeichnis zurückgegeben, aber dabei handelt es sich nur manchmal um das Skriptverzeichnis. In vielen Fällen habe ich plötzlich ein völlig anderes Verzeichnis erhalten. Es scheint mir deshalb das "Arbeitsverzeichnis" nicht zwingend das Verzeichnis des ausgeführten Skripts zu sein (vielmehr irgendein Verzeichnis, in dem der Server gerade arbeitet).

Wie zu erfahren war gibt es jedoch eine zweite Möglichkeit das Ausführungsverzeichnis zu erhalten:
Die Variable $0 enthält nämlich den Pfad + Dateinamen zum Skript. Wenn ich auch nicht bestätigen kann, ob das plattformübergreifend funktioniert, so funktioniert es zumindest unter Win32. Mit einer RegularExpression kann man nach Auslesen des Skriptdateipfades das Verzeichnis extrahieren. Meine Lösung ist nun etwas aufwendiger, sollte dafür jedoch für W32 u. die meisten Unix-Server funktionieren:


Code:

$CONF_init = 0 ;
$CONF_Path = $0 ; # Dateipfad zu diesem Skript auslesen

$CONF_Path =~ s/[\/\\][^\/\\]+$// ; # Dateinamen und letzten Slash "/" bzw. Backslash (für W32) abhacken

$CONF_Path = $CONF_Path . '/GetConf.pl' ;  # Konfigurationsdateinamen anhängen

do $CONF_Path ; # Serverpfade aus der Konfigurationsdatei übernehmen

if ($CONF_init != 1) { # Prüfen, ob die Konfigurationsdatei erfolgreich ausgelesen wurde
    die "Konfigurationsdatei nicht gefunden in Pfad: $CONF_Path" ;
    }



Dieser Post wurde am 18.09.2004 um 12:22 Uhr von GateKeeper editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.09.2004, 13:41 Uhr
typecast
aka loddab
(Operator)


Ah ich hab dich wohl doch nicht richtig verstanden. Cwd gibt NICHT das Verzeichnis aus, in dem sich das Script befindet, sondern das Verzeichnis in dem DU dich befindest. Also das Verzeichnis aus dem das Script aufgerufen wurde.

Um auf den absoluten Pfad des Scriptes zu kommen musst kannst du so vorgehen.

Deine Position: /home/user
Scriptposition: /home/user/script
Scriptaufruf: script/scriptname

Inhalt von $0 = script/scriptname
Rueckgabe von cwd: /home/user

Voller Pfadname -> /home/user/scriptname.

Deswegen musst du zuallererst auf einen / am Anfang pruefen (keine ahnung ob das bei Win genauso ist, aber ich vermute schon). Wenn ja, dann ist das der absolute Pfad. Wenn nein, dann musst du $0 und cwd zusammenfuegen.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
28.09.2004, 12:38 Uhr
GateKeeper



Hallo.

Update: Habe noch eine Möglichkeit gefunden, die am besten geeignet ist, das Skriptverzeichnis zu bestimmen. Für alle Interessieren deshalb:


Code:
use FindBin ();

$FindBin::RealBin ; # Diese Eigenschaft enthält nun den echten Skriptpfad (symbolische Links in absoluten Pfad übersetzt!)




Viel Spaß damit. Das ist die beste Lösung weil
1.portierbar
2.Sicher (absoluter Pfad, keine symbolischen Links).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Perl/CGI ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: