Il existe plusieurs façons:
$0
est le script en cours d'exécution tel que fourni par POSIX, par rapport au répertoire de travail actuel si le script est au niveau ou en dessous du CWD
- De plus,
cwd()
, getcwd()
et abs_path()
sont fournis par le Cwd
module et vous dire où le script est exécuté à partir
- Le module
FindBin
fournit les variables $Bin
& $RealBin
qui sont généralement 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 traité par l'interpréteur Perl lors de la compilation, y compris son chemin complet.
J'ai vu les trois premiers ( $0
, le Cwd
module et le FindBin
module) échouer de façon mod_perl
spectaculaire, produisant une sortie sans valeur telle qu'une '.'
chaîne vide. Dans de tels environnements, j'utilise __FILE__
et j'obtiens le chemin à partir de celui en utilisant le File::Basename
module:
use File::Basename;
my $dirname = dirname(__FILE__);
__FILE__
) ne fonctionne pas comme prévu? Je me retrouve avec le chemin relatif à partir duquel le script a été exécuté, tandis que la réponse acceptée me donne le chemin absolu complet.dirname(__FILE__)
ne suit pas les liens symboliques, donc si vous avez lié le fichier exécutable et où dans l'espoir de trouver l'emplacement d'un autre fichier dans l'emplacement d'installation, vous devez vérifierif( -l __FILE__)
et ensuitedirname(readlink(__FILE__))
.perl -e 'use Module::CoreList; print Module::CoreList->first_release("File::Basename");'; echo
. PourFile::Basename
cela, il y avait Perl 5.0.0, qui a été publié à la fin des années 90 - je pense qu'il est maintenant prêt à être utilisé.$ 0 est généralement le nom de votre programme, alors qu'en est-il de cela?
Il me semble que cela devrait fonctionner car abs_path sait si vous utilisez un chemin relatif ou absolu.
Mise à jour Pour quiconque lira ces années plus tard, vous devriez lire la réponse de Drew . C'est bien mieux que le mien.
la source
realpath
, qui est un synonyme deabs_path
, au cas où vous préférez le nom sans trait de soulignementperl -e 'use Cwd "abs_path";print abs_path($0);'
impressions/tmp/-e
-e
), je crois que perl crée un fichier temporaire pour stocker votre script en ligne. On dirait que l'emplacement, dans votre cas, est/tmp
. À quoi espériez-vous le résultat?http://perldoc.perl.org/File/Spec/Unix.html
la source
Je pense que le module que vous recherchez est FindBin:
la source
Vous pouvez utiliser FindBin , Cwd , File :: Basename 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:
la source
Obtenir le chemin absolu vers
$0
ou__FILE__
est ce que vous voulez. Le seul problème est que si quelqu'un a fait unchdir()
et que le$0
était relatif - alors vous devez obtenir le chemin absolu dans aBEGIN{}
pour éviter toute surprise.FindBin
essaie de faire mieux et de ramper dans le$PATH
pour quelque chose qui correspond àbasename($0)
, mais il y a des moments où cela fait des choses beaucoup trop surprenantes (en particulier: lorsque le fichier est "juste devant vous" dans le cwd.)File::Fu
aFile::Fu->program_name
etFile::Fu->program_dir
pour cela.la source
chdir()
au moment de la compilation?Quelques brèves informations:
Malheureusement, l'API Unix ne fournit pas de programme en cours d'exécution avec le chemin complet de l'exécutable. En fait, le programme qui exécute le vôtre peut fournir tout ce qu'il veut sur le terrain qui indique normalement à votre programme ce qu'il est. Il existe, comme toutes les réponses le soulignent, diverses heuristiques pour trouver des candidats probables. Mais rien de moins qu'une recherche dans tout le système de fichiers fonctionnera toujours, et même cela échouera si l'exécutable est déplacé ou supprimé.
Mais vous ne voulez pas de l'exécutable Perl, qui est ce qui est en cours d'exécution, mais du script qu'il exécute. Et Perl a besoin de savoir où se trouve le script pour le trouver. Il stocke cela dans
__FILE__
, alors qu'il$0
provient de l'API Unix. Cela peut encore être un chemin relatif, alors prenez la suggestion de Mark et canonisez-la avecFile::Spec->rel2abs( __FILE__ );
la source
__FILE__
me donne encore un chemin relatif. c'est à dire '.'.As-tu essayé:
ou
Cela dépend vraiment de la façon dont il est appelé et si c'est CGI ou exécuté à partir d'un shell normal, etc.
la source
Afin d'obtenir le chemin vers le répertoire contenant mon script, j'ai utilisé une combinaison de réponses déjà données.
la source
perlfaq8 répond à une question très similaire en utilisant la
rel2abs()
fonction on$0
. Cette fonction peut être trouvée dans File :: Spec.la source
Il n'est pas nécessaire d'utiliser des modules externes, avec une seule ligne, vous pouvez avoir le nom du fichier et le chemin relatif. Si vous utilisez des modules et devez appliquer un chemin relatif au répertoire de script, le chemin relatif est suffisant.
la source
: DD
la source
Vous cherchez cela?:
La sortie ressemblera à ceci:
Cela fonctionne à la fois sous Windows et Unix.
la source
la source
Le problème avec
__FILE__
est qu'il affichera le chemin du module principal ".pm" pas nécessairement le chemin du script ".cgi" ou ".pl" en cours d'exécution. Je suppose que cela dépend de votre objectif.Il me semble qu'il
Cwd
suffit de mettre à jour mod_perl. Voici ma suggestion:Veuillez ajouter des suggestions.
la source
Sans aucun module externe, valable pour le shell, fonctionne bien même avec '../':
tester:
la source
Le problème avec la simple utilisation
dirname(__FILE__)
est qu'il ne suit pas les liens symboliques. J'ai dû l'utiliser pour que mon script suive le lien symbolique vers l'emplacement réel du fichier.la source
Toutes les solutions sans bibliothèque ne fonctionnent pas pour plus de quelques façons d'écrire un chemin (pensez ../ ou /bla/x/../bin/./x/../ etc. Ma solution ressemble à ci-dessous. J'ai une particularité: je n'ai pas la moindre idée de la raison pour laquelle je dois exécuter les remplacements deux fois. Sinon, j'obtiens un faux "./" ou "../". À part cela, il me semble assez robuste.
la source
Aucune des réponses «top» ne me convenait. Le problème avec l'utilisation de FindBin '$ Bin' ou Cwd est qu'ils renvoient un chemin absolu avec tous les liens symboliques résolus. Dans mon cas, j'avais besoin du chemin exact avec les liens symboliques présents - le même que celui qui renvoie la commande Unix "pwd" et non "pwd -P". La fonction suivante fournit la solution:
la source
Sur Windows, l'utilisation
dirname
etabs_path
ensemble fonctionnaient mieux pour moi.Voici pourquoi:
la source
Quel est le problème avec
$^X
?Vous donnerait le chemin complet du binaire Perl utilisé.
Evert
la source
Sur * nix, vous avez probablement la commande "whereis", qui recherche votre $ PATH à la recherche d'un binaire avec un nom donné. Si $ 0 ne contient pas le nom du chemin complet, exécuter whereis $ scriptname et enregistrer le résultat dans une variable devrait vous indiquer où se trouve le script.
la source