PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Perl] skript soll sich selbst aufrufen koennen.



nul
30-10-2006, 18:14
Hallo, ich screibe gerade an einem kleinen Skript und stehe momentan an der Problemstellung dass sich das Skript selbst aufrufen soll.
Nur hab ich da jetzt keinen plan wie ich das bewerkstelligen kann.
Mein Problem ruehrt vor allem daher, dass das Skript naturlich auch aus einem anderen ordner aus aufgerufen werden kann.
Wie kann ich rausfinden in welchen Verzeichnis sich der Benutzer befindet und den relative Pfad dazu, wo sich das Skript befindet!

mfg
cg

sticky bit
30-10-2006, 19:05
In $0 hast du den Namen des Skripts das ausgeführt wird und zwar so wie der Benutzer es aufgerufen hat, also wenn er zum Starten bspw. ../hier/dort/drüben/skript.pl als Aufruf benutzt hat, dann ist da auch genau das drin. Ausser den Argumenten natürlich, die finden sich in @ARGV.

In $^X ist der Name des PERL-Interpreters der gerade läuft, so wie er durch den Benutzer bzw. die Shebang aufgerufen wurde (analog zu $0), allerdings ohne die Argumente (Schalter), die evtl. mit übergeben wurden. Da kann man ggf. ein paar über diverse skalare Spezialvariablen ermitteln, ein allgemeines Array o. Ä. wär mich allerdings leider nicht bekannt...

Das aktuelle Arbeitsverzeichnis kannst du wenn nötig mit der Funktion cwd() ermitteln, welche das Modul Cwd exportiert. Beim Starten eines Skripts ist das gleich dem Verzeichnis in dem der Benutzer sich befand als er jenes aufgerufen hat, änderst du das zu Laufzeit musst es dir halt, wenn nötig, merken, an geeigneter Stelle...

Falls du irgendwelche Umgebungsvariablen wie $PATH o. Ä. brauchen solltest, dazu gibts den Spezial-Hash %ENV, die Schlüssel sind die Namen der Variablen, also $ENV{'PATH'} für $PATH bspw..

Um ein Programm aufzurufen kannst du je nach dem was passieren soll Backticks (``), system() oder exec() verwenden bzw. mit open() eine Pipe zum Programm öffnen (vor den Programnamen eine Pipe (|) schreiben, d. h. der Datei-Handle den du bekommst ist mit STDIN des Programms verbunden.

Damit solltest du das was du machen willst eigentlich auch machen können...

nul
30-10-2006, 22:30
Thx fuer die vielen Informationen!
Beschaeftige mich erst seit kurzen mit Perl, delhab danke fuer die ausfuerliche Beschreibung!

mfg

reneeb
31-10-2006, 08:18
Falls Du rausfinden willst, in welchem Verzeichnis sich das Skript befindet, solltest Du FindBin verwenden. Das ist ganz nützlich wenn Du eigentlich mit relativen Pfaden arbeiten willst, aber das Skript auch von anderen Verzeichnissen aus gestartet werden können soll.

Wenn Du z.B. eine Datei öffnen willst, die im gleichen Ordner wie das Skript ist, dann sollte es so aussehen:


#!/usr/bin/perl

use strict;
use warnings;
use FindBin ();

my $textfile = $FindBin::Bin .'/test.txt';
open my $fh,'<',$textfile or die $!;
# und so weiter...