11
votes

Quelle shell a-t-il une utilisation d'un système Perl ()?

J'utilise un appel système pour effectuer des tâches xxx

mais il se plaint de variables d'environnement manquantes. Ces variables d'environnement sont fixées à mon coquille Bash (d'où je gère le code Perl).

Qu'est-ce que je fais mal?

est le système Créez une nouvelle coquille (sans paramètres de variable d'environnement)? Comment puis-je éviter ça?


0 commentaires

7 Réponses :


3
votes

Système () Appels / Bin / SH en tant que shell. Si vous êtes sur une boîte quelque peu différente, comme un bras, il serait bon de lire la page d'homme de la famille d'appels Exec - Comportement par défaut. Vous pouvez appeler votre .profile si vous en avez besoin, puisque System () prend une commande

system(" . myhome/me/.profile && /path/to/mycommand")


0 commentaires

0
votes

Essayez système ("echo \ $ shell"); sur votre système.


1 commentaires

C'est faux. Système L'appel ne respecte pas $ Shell en aucune manière, forme ou formulaire. Voir la réponse de Matt Kane



18
votes

C'est compliqué. Perl n'invoque pas nécessairement une coquille. Perldoc dit:

S'il n'y a qu'un seul argument scalaire, l'argument est vérifié pour les métacaracters Shell et, le cas échéant, l'ensemble de l'argument est transmis au shell de commande du système pour analyse (ceci / bin / sh -c sur des plates-formes UNIX, mais varie sur d'autres plates-formes). S'il n'y a pas de shell métacaracters dans l'argument, il est divisé en mots et transmis directement à ExecvP, ce qui est plus efficace.

Cela ressemble donc à ce que vous auriez que les arguments passaient droit à la recherche. En outre, si la coquille chargea votre .bstrucc, .profile ou .bash_profile dépend de la question de savoir si la coquille est interactive. Probablement ce n'est pas le cas, mais vous pouvez vérifier comme Ceci .


0 commentaires

5
votes

Si vous ne voulez pas appeler une coquille, appelle système avec une liste: xxx

Si vous voulez une coque spécifique, appelez-le explicitement: < / p> xxx


0 commentaires

4
votes

Je pense que ce n'est pas la question du choix de Shell, car les variables d'environnement sont toujours em> héritées par des sous-processus à moins que le nettoyage explicitement. Êtes-vous sûr d'avoir exporté vos variables? Cela fonctionnera:

$ A=5
$ perl -e 'system(q{echo $A});'

$


0 commentaires

1
votes

i Misted avec des variables d'environnement définies pour mon script sur Ce message où j'avais besoin de la variable env + dbus_session_bus_address pour être défini, mais ce ne serait pas quand j'ai appelé le script en tant que root. Vous pouvez lire à travers cela, mais à la fin, vous pouvez vérifier si% ENV contient vos variables nécessaires et si vous ne les ajoutez pas.

de Perlvar P>

user@host:~$ perl -e 'print $ENV{q/MY_ENV_VARIABLE/} . "\n"'


0 commentaires

3
votes

J'ai eu du mal pendant 2 jours de travailler à ce sujet. Dans mon cas, les variables d'environnement ont été correctement définies sous Linux mais pas Cygwin.

de MKB's réponse je pensais vérifier homme perlrun et il mentionne une variable appelée perl5shell ( spécifique au port Win32 ). Ce qui suit a résolu ensuite le problème: xxx

Comme c'est souvent le cas - tout ce que je peux vraiment dire est "ça marche pour moi", bien que la documentation implique que cela puisse être une solution sensible:

peut être réglé sur une autre coque que Perl doit utiliser en interne pour exécuter des commandes ou un système de backtk "().

Si la coque utilisée par Perl n'hérite pas implicitement les variables d'environnement, ils ne seront pas définis pour vous.


0 commentaires