2014-05-08 4 views
0

J'ai récemment reçu un script perl avec la première ligneQue fait #! Perl exactement?

#!perl 

Bien sûr, ne fonctionne pas, mais je voudrais savoir exactement ce qu'il fait. Quelqu'un peut-il aider?

+1

http://fr.wikipedia.org/wiki/Shebang_(Unix) – Kent

+0

Pour un shebang invalide comme ça, c'est juste un indice, pourrait être pour l'éditeur ou pour l'utilisateur. –

+0

@glennjackman Le truc c'est que ça fait quelque chose si vous l'essayez. Peut-être qu'il cherche juste perl dans le répertoire courant? – eleanora

Répondre

2

Appelée shebang, cette variable est utilisée (sous Unix) pour spécifier quel binaire d'interpréteur doit être utilisé pour exécuter un script.

C'est un très bon mécanisme, surtout avec la façon dont le file system permissions peut être utilisé pour transformer un fichier de script en quelque chose que le shell (et le chargeur de programme) considèrent comme étant exécutable.

Il semble the interpreter name must be absolute. Le texte lié dit qu'un nom relatif (comme le perl nu ici) sera interprété comme ./perl, donc il pourrait fonctionner s'il est exécuté à partir du répertoire le binaire perl est dans. Pas un cas d'utilisation très courant mais au moins cela pourrait fonctionner si utilisé de cette façon, si vous voulez envelopper un binaire perl avec un script, voulez ce script pour exécuter le binaire qui est au même endroit que le script, et n'utilisez pas de chemins absolus pour choisir un autre binaire. Je n'ai pas testé cela.

Une approche plus typique (au moins sous Linux) est d'utiliser le programme env pour choisir le perl:

#!/usr/bin/env perl 
+0

Cela ne fonctionne pas même si perl est dans le $ PATH actuel, ce qui est l'une des raisons pour lesquelles j'ai posé la question. – eleanora

1

Si vous donnez la ligne de tralala comme celui-ci,

#!perl 

il sera Recherchez l'interpréteur perl dans le répertoire en cours. Si l'interpréteur Perl existe dans le répertoire en cours, le script Perl commencera à s'exécuter, sinon il affichera l'erreur bad interpreter.