web-dev-qa-db-fra.com

Que dois-je utiliser pour la ligne Shebang d'un script Perl?

Laquelle de celles-ci est meilleure ou plus rapide à utiliser comme ligne Shebang pour un script Perl?

#! Perl

#! Perl.exe

#! fullpath/Perl(/Perl.exe)

#! partialpath/Perl(/Perl.exe)

Et, lorsque vous utilisez #!Perl, quand cela fonctionne sur un système particulier, comment puis-je trouver dans le script l'interpréteur Perl que j'utilise pour pouvoir le mettre dans la ligne Shebang?


Et, si vous utilisez un /path/path/Perl, sont * ou ... autorisé à être utilisé pour les dossiers?

44
Anonymous

Si vous devez coder en dur # !, utilisez #!/usr/bin/env Perl. Pourquoi? Ce que vous voulez, c'est que le programme Perl s'exécute avec le Perl préféré de l'utilisateur. Ce sera le premier dans leur PATH. #!Perl ne fait pas ce que je veux dire, il ne recherche pas le CHEMIN de l'utilisateur, #!/usr/bin/env Perl c'est comme ça que vous réussissez. /usr/bin/env sera toujours présent sur les systèmes Unix.

Si l'utilisateur utilise Windows, comme d'autres l'ont souligné, cela n'a pas d'importance. Windows n'utilise pas #! il utilise des associations d'extension de fichier. Assurez-vous que votre programme s'appelle foo.pl ou quelque chose et ça marchera. Mais incluez le #! de toute façon car certains utilitaires et éditeurs l'utilisent.

Si vous expédiez du code, laissez l'installateur s'en occuper. Tous les deux MakeMaker/Makefile.PL et Module::Build/Build.PL va changer votre #! pour correspondre au Perl utilisé par l'utilisateur pour l'installation. Ils s'occuperont de ce problème pour vous.

Si vous installez du code pour votre propre utilisation en production, vous devez utiliser le chemin complet vers une copie particulière de Perl. Quelle copie de perl? Un spécifique à votre projet. Est-ce à dire que vous devez compiler Perl pour chaque projet? Non, vous pouvez créer un lien symbolique. Le projet foo pourrait avoir /usr/local/bin/fooperl pointez sur /usr/bin/Perl5.18. Utilisation #!/usr/local/bin/fooperl. Maintenant, si vous décidez de mettre à niveau Perl, vous pouvez le faire par projet en modifiant le lien symbolique.

62
Schwern

Un she-bang Windows (déduit du Perl.exe bit) semble hors de propos puisque votre (ahem) "Shell" ne le fait probablement pas analyser (corrigez-moi si je me trompe, aurait pu être changé récemment).

Certains drapeaux de ligne de commande peuvent toujours être récupérés par Perl lui-même ( selon ce fil ).

8
ChristopheD
  1. Comme ChristopheD l'a noté, je peux confirmer par la pratique (ActivePerl sur XP) que la ligne Shebang n'est pas vraiment nécessaire sous Windows.

    Une ligne Shebang indique à Unix Shell à quel interpréteur transmettre le script.

    Sous Windows, le programme pour transmettre le script sera déterminé par des associations basées sur l'extension.

  2. Sous Unix, la troisième option (chemin complet vers l'exécutable Perl) est la meilleure.

    Et oui, vous pouvez utiliser ".." en théorie (Shell s'en fiche) mais vous ne devriez pas vraiment utiliser de chemin relatif - vous ne savez jamais quel sera votre répertoire de travail actuel lors de l'exécution d'un script.

6
DVK

Si vous exécutez CGI via Apache sous Windows, le Shebang IS USED. Vous aurez besoin du chemin complet vers Perl.

6
user2509628

Si vous développez sous Unix en utilisant Perl et que vous utilisez "perlbrew" pour basculer facilement entre différentes versions de Perl, alors la ligne Shebang "! #/Usr/bin/env Perl" fonctionne bien.

4

La première ligne représente Shebang. Il indique essentiellement au programme où se trouve l'interpréteur Perl, car Perl est un langage interprété. Sous Linux, vous pouvez taper dans le terminal:

whereis Perl

qui vous donnera l'emplacement exact de celui-ci. Habituellement, c'est à l'intérieur / usr/bin/Perl. Cela signifie que vous voulez faire Shebang en ce qui concerne/usr/bin/Perl

#! /usr/bin/Perl

use strict;
use warnings;
use v5.10.1;
.
.
.

Ce n'est qu'une bonne pratique, c'est donc évidemment la solution la plus rapide.

J'espère que vous trouvez ça utile,

Merci.

2
miksiii

Et, lorsque vous utilisez "#! Perl", lorsqu'il fonctionne sur un système particulier, quel est le print () pour afficher le chemin complet vers Perl.exe, qui pourrait être inclus dans la ligne Shebang?

Eh bien, si vous utilisez l'instruction print, vous exécutez déjà du code Perl, alors ...

C'est l'un des choses que je n'aime pas à propos de Perl .

Sous Windows, si vous utilisez au moins ActiveState Perl, si le fichier se termine par .pl, le registre Windows exécutera l'interpréteur Perl pour vous, quelle que soit la ligne Shebang. Sur Cygwin, je ne sais pas pourquoi mais #! Perl fonctionne aussi. Sous Unix, vous devez mettre le chemin complet vers votre exécutable Perl dans la ligne Shebang. L'idée de Schwern d'utiliser env est pratique, mais présente un certain danger, comme je l'ai souligné dans un commentaire.

C'est pourquoi je vous suggère que la meilleure solution est de conditionner vos scripts Perl en modules CPAN . Les installateurs CPAN comme Module :: Build changeront alors la ligne Shebang en chemin complet vers votre interpréteur Perl. (Je ne sais pas si le programme d'installation de Schwern, ExtUtils :: MakeMaker, fait cela ou utilise env, car je ne l'utilise pas.)

0
user181548