2010-07-06 5 views
3

En C/C++ (bash, aussi?), Le premier argument de ligne de commande, argv [0], est le nom de fichier binaire (préfixé par un chemin absolu ou relatif tel qu'appelé par l'utilisateur).Comment obtenir le chemin et le nom du script Perl en cours d'exécution (argv [0] en C)

En Perl, le premier argument de ligne de commande $ ARGV [0] est le premier argument de ligne de commande après le chemin et le nom du script.

Comment un script Perl peut-il obtenir le chemin et le nom utilisés pour l'invoquer?

Merci!

Répondre

6

"en C/C++ (bash, aussi?) Le premier argument de ligne de commande, argv [0], est le nom de fichier binaire"

est tout à fait tort, par la voie. La norme ISO ne prévoit rien de tel.

De C99:

Si la valeur de argc est supérieure à zéro, la chaîne pointée par argv [0] représente le nom du programme; argv [0] [0] doit être le caractère nul si le nom du programme n'est pas disponible dans l'environnement hôte.

Et notez qu'il indique "représente le nom du programme", pas "est l'emplacement de l'exécutable binaire". C'est parce qu'il ya un précédent extrait qui stipule:

... les membres du groupe argv [0] à argv [argc-1] inclus contient des pointeurs vers des chaînes, qui sont données des valeurs définies de mise en œuvre par l'environnement hôte avant le programme de démarrage. »

Il est tout à fait légal pour votre argv[0] pour la commande « sleep 60 » pour être « fantastique utilitaire de sommeil pax » plutôt que «/bin/sommeil ».

en bref, la l'environnement n'a pas à fournir une représentation du programme et, même si c'est le cas, il n'a pas o être quelque chose utilisable pour localiser le binaire.


Mais, après vous avoir ennuyé avec ma diatribe, Perl fournit $0 ou $PROGRAM_NAME (dans ce mode "anglais" hideux) à cet effet. Voir perlvar pour plus de détails.

+0

Ok, bien. Je suppose que je ne cherchais pas une portabilité parfaite. BTW, est-ce que POSIX dit quelque chose sur ce que argv [0] contient? –

+0

Je n'aurais pas dû associer ce comportement argv avec C ou n'importe quel langage de haut niveau. Voici ce que dit POSIX.1: http://www.opengroup.org/onlinepubs/009695399/functions/exec.html L'argument argv est un tableau de pointeurs de caractères pour des chaînes à terminaison nulle. L'application doit s'assurer que le dernier membre de ce tableau est un pointeur nul. Ces chaînes constitueront la liste d'arguments disponible pour la nouvelle image de processus. La valeur dans argv [0] doit pointer vers un nom de fichier associé au processus démarré par l'une des fonctions exec. –

+0

Pas de problèmes, Posco, je pensais juste que je l'aborderais. Quand quelqu'un parle de la norme C, cela signifie invariablement que ISO - POSIX est le prochain niveau, pour ainsi dire.Dans tous les cas, une fois que vous vous êtes habitué aux «avocats de la langue» qui ont élaboré les documents de normes (et nos documents d'exigences), vous réalisez que «doit» et «devrait» avoir des significations très spécifiques. "Doit" signifie que c'est le cas alors que "devrait" indique seulement que, bien, cela devrait être le cas, mais ce n'est pas nécessairement le cas. Voir l'annexe H des directives ISO/CEI que POSIX suit également: http://www.iec.ch/tiss/iec/Directives-Part2-Ed5.pdf – paxdiablo

7

$0 contient le nom du fichier contenant le script Perl en cours d'exécution.

Questions connexes