Die dirname($0)
nicht den vollständigen Pfad zurückkehren, wie Chankey Pathak und Matthias demonstrieren.
Ich möchte hinzufügen, dass es andere Möglichkeiten gibt. Zum Beispiel können Sie FindBin (auch Kern)
use FindBin qw($RealBin);
BEGIN: {
my ($scriptDir) = $RealBin;
chdir $scriptDir or die "Can't change to $scriptDir: $!";
};
Die $RealBin
gibt das gleiche wie verwenden, was Sie zeigen, mit der Ausnahme, dass es der vollständige Pfad mit Links aufgelöst.
Die chdir kann fehlschlagen, dank ikegami für den Kommentar. In diesem Fall wird false zurückgegeben und der obige Code stirbt, passen Sie ihn entsprechend an. Beachten Sie, dass die Frage der dritten Zeile nichts damit zu tun hat.
Dieses Modul wird auch allgemein für relativen Pfad zu Bibliotheken mit lib Pragma verwendet, zum Beispiel
use lib "$RealBin/../lib";
was für eine noch einfachere Entscheidung trifft, vielleicht ist es für beide zu verwenden.
Noch mehr, angesichts der Beschreibung von dirname
File::Basename (emphasis nicht Mine)
Diese Funktion ist für die Kompatibilität mit dem Befehl Unix Schale versehen ist dirname(1)
und hat einen Teil seiner Macken geerbt.Trotz seines Namens gibt es NOT immer den Verzeichnisnamen, wie Sie vielleicht erwarten. Wenn Sie den Verzeichnisnamen eines Pfades verwenden möchten, verwenden Sie fileparse()
.
Ich würde lieber gehen sogar mit
use Cwd qw(abs_path);
BEGIN: {
my ($scriptDir) = abs_path(__FILE__) =~ m|(.*)/|;
chdir $scriptDir
or die "Can't change to $scriptDir: $!";
};
wo abs_path
seit __FILE__
für sich allein verwendet wird, um den vollständigen Pfad nicht zur Verfügung stellen kann. Der Regex gräbt gierig alles bis zum letzten /
, also den vollständigen Pfad zum Verzeichnis des Skripts.
Wie unten gezeigt, verwenden Sie FindBin qw ($ RealBin); 'und ändern Sie das Verzeichnis nicht. Dateien, die in '@ ARGV' aufgelistet sind, sind relativ zu' pwd', nicht '$ RealBin'. – shawnhcorey