relativer (?) Pfad für open(...)
Hagen
- perl
Hallo,
ich habe ein Perl-Script geschrieben, welches u.a. mittels open auf einige Dateien im gleichen Verzeichnis zugreift. Während der 'Entwicklungsphase' habe ich das Script immer per Shell über 'perl bsp.pl' gestartet.
Nun wollte ich das Script per Cron-Job starten. Also als Befehlszeile 'perl /ab/cd/ef/bsp.pl' angegeben. Nun werden die Dateien, auf die innerhalb des Scriptes zugegriffen wird, im root-Verzeichnis vermutet und nicht im gleichen Verzeichnis wo sich das Perl-Script befindet, da im Script keine absoluten Pfadangaben verwendet wurden.
Beholfen habe ich mir damit, dass per Cron-Job ein Bash-Script gestartet wird, welches erst in das entsprechende Verzeichnis wechselt und dann erst das Script startet. Aber ein wirklich tolle Lösung ist das nicht.
Gibt das für so etwas vielleicht einen Parameter 'Benutzte das Verzeichnis, in welchem sich das Script befindet' oder eine entsprechende Variable in welcher der Pfad steht, wo das Script augerufen wurde? Meine Suchen waren bisher erfolglos :(
Wäre natürlich schön, wenn das ganze sowohl unter Linux als auch Windows funktionieren würde.
Gruß
Hagen
Nun werden die Dateien, auf die innerhalb des Scriptes zugegriffen wird, im root-Verzeichnis vermutet und nicht im gleichen Verzeichnis wo sich das Perl-Script befindet, da im Script keine absoluten Pfadangaben verwendet wurden.
Das ist irgendwie unlogisch. Schreibt man:
open FH, 'test.txt' || die $!;
dann wird test.txt im aktuellen Arbeitsverzeichnis gesucht, das standardmäßig das Verzeichnis ist, in dem das Script ausgeführt wird (es sei denn, du hast es im aktuellen Script irgendwie geändert). Schreibst du hingegen:
open FH, '/test.txt' || die $!;
dann wird das Script im Wurzelverzeichnis gesucht.
Gibt das für so etwas vielleicht einen Parameter 'Benutzte das Verzeichnis, in welchem sich das Script befindet' oder eine entsprechende Variable in welcher der Pfad steht, wo das Script augerufen wurde? Meine Suchen waren bisher erfolglos :(
Dabei hilft dir Cwd.
Siechfred
Hallo,
Hagen will nicht das Verzeichnis wissen, sondern es ändern!
Gibt das für so etwas vielleicht einen Parameter 'Benutzte das Verzeichnis, in welchem sich das Script befindet' oder eine entsprechende Variable in welcher der Pfad steht, wo das Script augerufen wurde? Meine Suchen waren bisher erfolglos :(
Du suchtest: FindBin
Struppi.
Hallo,
Hagen will nicht das Verzeichnis wissen, sondern es ändern!
Hagen will nicht das Verzeichnis wissen, sondern es ändern!
Nicht?
Gibt das für so etwas vielleicht einen Parameter 'Benutzte das Verzeichnis, in welchem sich das Script befindet' oder eine entsprechende Variable in welcher der Pfad steht, wo das Script augerufen wurde?
Das klingt für mich, als ob er etwas Wissen will.
Struppi.
Das klingt für mich, als ob er etwas Wissen will.
Lies halt den Rest auch noch!
Hallo Thomas!
Lies halt den Rest auch noch!
Sag lieber Du uns, wo du herausliest, dass er das Verzeichnis ändern will.
Viele Grüße aus Frankfurt/Main,
Patrick
Benutzte das Verzeichnis, in welchem sich das Script befindet
Anmerkung von mir: ... und nicht das Verzeichnis, in dem das Script ausgeführt wird (das mit findbin gefunden wird).
Physischer Speicherort und Ausführungsort des Scripts sind nämich nicht identisch.
Gruß
Thomas
Physischer Speicherort und Ausführungsort des Scripts sind nämich nicht identisch.
Aha ... ?! Magst du uns Unwissende erleuchten?
Siechfred
Anmerkung von mir: ... und nicht das Verzeichnis, in dem das Script ausgeführt wird (das mit findbin gefunden wird).
Du hast recht, ich hab FindBin noch nie benututzt und bin davon ausgegangen es gibt denb Speicherort des Skriptes aus.
Struppi.
Benutzte das Verzeichnis, in welchem sich das Script befindet
Anmerkung von mir: ... und nicht das Verzeichnis, in dem das Script ausgeführt wird (das mit findbin gefunden wird).
Physischer Speicherort und Ausführungsort des Scripts sind nämich nicht identisch.
Ähm, meinst du das so:
use Cwd;
use FindBin qw/$RealBin/;
print 'Current working directory: ', cwd(), "\n";
print 'Path to perl-script: ', $RealBin;
Rufe ich obiges Script von c:\test aus wie folgt auf:
perl c:\test\siech\dirtest.pl
Erhalte ich:
Current working directory: c:/test
Path to perl-script: c:/test/siech
Mehr ist mit Perl nicht möglich.
Siechfred
Hallo Hagen!
Perl-Script geschrieben, welches u.a. mittels open auf einige Dateien im gleichen Verzeichnis zugreift
Nun wollte ich das Script per Cron-Job starten. Also als Befehlszeile 'perl /ab/cd/ef/bsp.pl' angegeben. Nun werden die Dateien, auf die innerhalb des Scriptes zugegriffen wird, im root-Verzeichnis vermutet und nicht im gleichen Verzeichnis wo sich das Perl-Script befindet, da im Script keine absoluten Pfadangaben verwendet wurden.
Darfst Du im Perl-Script etwas verändern? Wenn ja, nun, der vordefinierte Skalar $0 liefert den kompletten Pfad des Programms inklusive Programmname:
C:\Dokumente und Einstellungen\User\Pfad\zum\Programm\bsp.pl (z.B. Win XP)
/pfad/vom/Rootverzeichnis/ausgehend/für/unix/bsp.pl (z.B Unix)
Aus diesem Pfad könntest Du den Programmnamen entfernen und in eine Variable speichern, dann die Dateinamen dranhängen. Quick&Dirty:
$pfad = $0;
$pfad =~ s/bsp.pl$//;
$datei1 = $pfad."datei1.ext";
$datei2 = $pfad."datei2.ext";
.
.
.
.
open (...)
Viele Grüße aus Frankfurt/Main,
Patrick
Hi,
Aus diesem Pfad könntest Du den Programmnamen entfernen und in eine Variable speichern, dann die Dateinamen dranhängen. Quick&Dirty:
$pfad = $0;
$pfad =~ s/bsp.pl$//;
$datei1 = $pfad."datei1.ext";
$datei2 = $pfad."datei2.ext";
Eine Alternative zu diesen beiden Zeilen waere waere "chdir $pfad;".
mfG,
steckl
Hallo!
Ich bin immer wieder begeistert wie schnell man hier an Informationen und Lösungsvorschläge gelangt, danke!
Darfst Du im Perl-Script etwas verändern?
Ja, kann ich. Sind alle selbst geschriebenen Scripte und laufen auf dem 'Home-PC' (nicht Server mit z.B. Apache).
Hagen will nicht das Verzeichnis wissen, sondern es ändern!
Na ja, jein. Ich will das Verzeichnis wissen um es ändern zu können. Das Script wird/soll aus dem/einem aktuellen Arbeitsverzeichns aufgerufen werden, wobei sich das Script (und z.B. die entsprechenden Log-Dateien) nicht(!) im aktuellen Arbeitsverzeichnis befinden (die Log-Datei wurden in dem Script über einen relativen Pfad angegeben).
Ich werde es mal mit 'FindBin' probieren, da 'print $FindBin::Bin,"\n";' recht vielversprechende Ergebnisse liefert.
Ein ähnliches Problem wurde unter http://forum.de.selfhtml.org/archiv/2004/12/t96268/ diskutiert.