2011-01-05 4 views
38

Wie kann ich den Namen des Skripts abrufen? Zum Beispiel habe ich ein Perl-Skript mit dem Namen XXX.pl. Diese Datei enthält:So erhalten Sie den Namen des Perl-Skripts, das ausgeführt wird

$name = #some function that obtains the script's own name 
print $name; 

Ausgang:

XXX.pl 

Ich mag würde dies auf die CWD Funktion vergleichen, die das Skriptverzeichnis erhält. Ich brauche eine Funktion, die den Namen des Skripts auch erhält.

Antwort

64

Der Name des laufenden Programms in dem $0 Variable gefunden werden.

+0

Manchmal ist das laufende Programm nicht die PL-Datei, sondern ein Stapeljob, der die PL-Datei geladen und ausgeführt hat. Wenn Ihre Dateinamen Ihren Paketnamen ähneln, drucken Sie "(". Caller. ")"; ist am nützlichsten. – HoldOffHunger

40
use File::Basename; 
my $name = basename($0); 

PS. getcwd()and friends geben Sie nicht das Verzeichnis des Skripts! Sie geben Ihnen das Arbeitsverzeichnis. Wenn sich das Skript in Ihrem PATH befindet und Sie es nur nach Namen und nicht nach seinem vollständigen Pfad aufrufen, wird getcwd() nicht das tun, was Sie sagen. Sie wollen dirname($0) (dirname ist auch in File::Basename).

print $0; 

man perlvar für andere spezielle Variablen:

+1

Dies ist falsch; 'dirname ($ 0)' gibt auch den relativen Pfad an. Wenn Sie ein Skript mit 'perl script' oder'./Script' ausführen, wird '.' Zurückgegeben. – felwithe

7

Sie könnten auch interessiert sein an mehr über __FILE__, und möglicherweise __LINE__, die Ihnen die aktuelle Zeile und ich häufig zusammen verwenden.

Wenn Sie dies zu Debuggingzwecken möchten, möchten Sie vielleicht auch mehr über "warn", "Carp", "caller" erfahren.

2

Auschecken Modul FindBin, Teil der Kern-Perl-Verteilung. Es exportiert die Variablen, die Sie suchen.

EXPORTABLE VARIABLES 
     $Bin   - path to bin directory from where script was invoked 
     $Script  - basename of script from which Perl was invoked 
     $RealBin  - $Bin with all links resolved 
     $RealScript - $Script with all links resolved 
+0

Siehe auch http://StackOverflow.com/a/90721/834416 für eine differenziertere Antwort. –

Verwandte Themen