8
votes

Quelle est la différence entre System, EXEC et Backticks à Perl?

en Perl, pour exécuter un autre script Perl de mon script ou pour exécuter des commandes système telles que mv , cp , pkgADD , < Code> pkgrm , pkginfo , RPM , etc., nous pouvons utiliser ce qui suit:

  • système ()
  • exécuté ()
  • `` (backticks)

    sont tous les trois identiques ou sont-ils différents? Est-ce que tous les trois donnent le même résultat dans chaque cas? Sont-ils utilisés dans différents scénarios, aiment appeler un programme PERL, nous devons utiliser système () et pour d'autres que nous devons utiliser `` ` (backtsticks).

    S'il vous plaît conseiller, car j'utilise actuellement système () pour tous les appels.


3 commentaires

Ceci est un duplicatin de Stackoverflow.com/Questtions/797127/...


Ce n'est pas un duplicata, comme cette question ne mentionne pas exécuté () .


Non, mais c'est un duplicatin de Stackoverflow.com/questions/799968/... :)


6 Réponses :


3
votes

L'option meilleure est d'utiliser un module, que ce soit dans la bibliothèque standard ou dans la CPAN, qui fait le travail pour vous. Cela va être plus portable et éventuellement plus rapide pour des tâches rapides (pas de destination au système).

Cependant, si cela n'est pas assez bon pour vous, vous pouvez utiliser l'une de ces trois, et non, ils ne sont pas les mêmes. Lire le pages Perldoc sur système () , EXEC () et Backticks pour voir la différence.


2 commentaires

Il y a plus d'une page dans Perlop (section "Opérateurs de citation", sous-section "QX / String /") ainsi que Perldoc -f Readpipe .


Je l'ai trouvé. Il semble que j'ai manqué une forêt pour des arbres. Ou quelque chose.



13
votes

Ils sont tous différents et les docs expliquent comment ils sont différents. Backticks capturent et retourne la sortie; système renvoie un statut de sortie et exec ne revient jamais du tout s'il réussit.


0 commentaires

1
votes

appeler système est généralement une erreur. Par exemple, au lieu de dire xxx

, vous devez dire xxx

regarder sur cpan pour des modules qui gèrent d'autres commandes pour vous. Si vous vous trouvez en train d'écrire beaucoup d'appels vers système , il peut être temps de revenir dans un script shell à la place.


2 commentaires

Je ne dirais pas que c'est généralement une erreur, juste que vous pourriez être capable de faire cette tâche dans Pure Perl. Il y a beaucoup d'utilisations valides pour le système ().


Je ne dis pas appeler système est une erreur, mais la plupart des gens appellent que ce sont des erreurs. Vous avez besoin d'une bonne raison d'appeler système .



-1
votes

Si vous ne voulez pas que la coque s'implique (généralement, vous ne le faites pas) et si vous attendez que la commande système soit acceptable, je vous recommande d'utiliser IPC :: RUN3 . Il est simple, flexible et la tâche commune de l'exécution d'un programme, de l'alimentation en entrée et de la capture de ses flux de sortie et d'erreur.


0 commentaires

6
votes

IPC :: System :: Simple est probablement ce que vous voulez.

Il fournit des alternatives sûres et portables aux backticks, System () et d'autres commandes IPC.

Il vous permet également d'éviter la coque pour la plupart desdites commandes, ce qui peut être utile dans certaines circonstances.


0 commentaires

1
votes

Eh bien, plus les gens sont les plus réponses.

Ma réponse est d'éviter généralement l'exécution des commandes externes. Si vous pouvez - utiliser des modules. Il n'y a pas de point d'exécution "CP", "MV" et beaucoup d'une autre commande - il existe des modules qui le font. Et le bénéfice de l'utilisation de modules est qu'ils fonctionnent généralement dans une plate-forme inter-plate-forme. Pendant que votre système ("MV") pourrait ne pas.

Lorsque vous avez mis en place une situation que je n'ai pas d'autre moyen, mais pour appeler la commande externe, je préfère utiliser IPC :: Run . L'idée est que toutes les méthodes simplistes (backtsticks, qx, système, ouverture avec tuyau) sont intrinsèquement peu sûres et nécessitent une attention particulière aux paramètres.

avec IPC :: Run , je gère des commandes comme je le ferais avec système (@array), qui est beaucoup plus sécurisé et que je peux se lier à STDIN, STDOUT et STDERR séparément, à l'aide de variables ou de rappel, qui est très cool lorsque vous serez dans la situation que vous avoir à transmettre des données au programme externe du code à long terme.

En outre, il possède une manipulation intégrée des délais d'attente, qui sont pratiques plus d'une fois :)


0 commentaires