181 votes

Comment obtenir le chemin complet d'un script Perl en cours d'exécution ?

J'ai Perl script et j'ai besoin de déterminer le chemin complet et le nom de fichier du script pendant l'exécution. J'ai découvert que, selon la façon dont vous appelez le script $0 varie et contient parfois le fullpath+filename et parfois juste filename . Étant donné que le répertoire de travail peut également varier, je ne vois pas comment obtenir de manière fiable l'adresse de l'utilisateur. fullpath+filename du script.

Quelqu'un a une solution ?

0 votes

Je sais que c'était il y a longtemps mais je cherchais juste une façon de faire en perl Windows et je suis assez content de ma solution #!/usr/bin/perl -w my @catalog= dir ; $myHome = substr($catalog[3],14) ; $myHome = &rtrim($myHome) ; print qq(<$myHome> \n ) ; # Fonction Right trim pour supprimer les espaces blancs de fin de ligne sub rtrim { my $string = shift ; $string =~ s/ \s +$// ; return $string ; } j'ai juste pensé que je devais le partager.

271voto

Drew Stephens Points 4692

Il y a plusieurs façons :

  • $0 est le script en cours d'exécution tel qu'il est fourni par POSIX, par rapport au répertoire de travail actuel si le script se trouve au niveau du CWD ou en dessous.
  • En outre, cwd() , getcwd() y abs_path() sont fournis par le Cwd et vous indique d'où le script est exécuté
  • Le module FindBin fournit le $Bin & $RealBin les variables qui généralement sont le chemin vers le script en cours d'exécution ; ce module fournit également $Script & $RealScript qui sont le nom du script
  • __FILE__ est le fichier réel que l'interpréteur Perl traite pendant la compilation, y compris son chemin complet.

J'ai vu les trois premiers ( $0 le Cwd et le module FindBin ) échouent sous mod_perl de façon spectaculaire, produisant des produits sans valeur tels que '.' ou une chaîne vide. Dans de tels environnements, j'utilise __FILE__ et obtenir le chemin à partir de cela en utilisant le File::Basename module :

use File::Basename;
my $dirname = dirname(__FILE__);

2 votes

C'est vraiment la meilleure solution, surtout si vous disposez déjà d'un 0 $ modifié.

1 votes

Upvote. Je ne sais pas vraiment pourquoi cette réponse n'a pas été acceptée car la réponse acceptée ci-dessus n'est pas fonctionnelle étant donné qu'elle implique de dépouiller le nom script de la fin du chemin.

9 votes

Il semble que abs_path doive être utilisé avec _____FILE_____ car il peut contenir le nom uniquement avec le chemin.

149voto

Ovid Points 7256

0 $ est généralement le nom de votre programme, alors que diriez-vous de ceci ?

use Cwd 'abs_path';
print abs_path($0);

Il me semble que cela devrait fonctionner puisque abs_path sait si vous utilisez un chemin relatif ou absolu.

Mise à jour Pour ceux qui lisent ceci des années plus tard, vous devriez lire La réponse de Drew . C'est bien mieux que le mien.

12 votes

Petit commentaire, sur activestate perl sous Windows $0 contient typiquement des backslashes et abs_path retourne des forward slashes, donc un rapide "tr /\//". \\ / ;" était nécessaire pour le corriger.

3 votes

Je voulais ajouter qu'il y a un realpath qui est un synonyme de abs_path au cas où vous préféreriez le nom "sans score".

0 votes

@Chris , avez-vous signalé le bug au mainteneur du module Cwd ? Il semble que ce soit un bug d'adoption de Windows.

38voto

Mark Points 33086
use File::Spec;
File::Spec->rel2abs( __FILE__ );

http://perldoc.perl.org/File/Spec/Unix.html

0 votes

Ensuite, il faut ajouter dirname() pour obtenir le chemin absolu - juste ce dont j'avais besoin !

16voto

bmdhacks Points 9074

Je pense que le module que vous recherchez est FindBin :

#!/usr/bin/perl
use FindBin;

$0 = "stealth";
print "The actual path to this is: $FindBin::Bin/$FindBin::Script\n";

11voto

Benjamin W. Smith Points 442

Vous pourriez utiliser FindBin , Cwd , Fichier::Nom de base ou une combinaison de ceux-ci. Ils sont tous dans la distribution de base de Perl IIRC.

J'ai utilisé Cwd dans le passé :

Cwd :

use Cwd qw(abs_path);
my $path = abs_path($0);
print "$path\n";

0 votes

@bmdhacks, vous avez raison. La présomption est que tu n'as pas changé 0$. Par exemple, vous faites le travail ci-dessus dès que script démarre (dans le bloc d'initialisation), ou ailleurs quand vous ne changez pas $0. Mais $0 est un excellent moyen de changer la description du processus visible sous l'outil unix 'ps' :) Cela peut montrer l'état actuel du processus, etc. Cela dépend de l'objectif du programmeur :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X