J'utilise un appel système pour effectuer des tâches 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). P> Qu'est-ce que je fais mal? P> est le système code> Créez une nouvelle coquille (sans paramètres de variable d'environnement)? Comment puis-je éviter ça? P> p>
7 Réponses :
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")
Essayez système ("echo \ $ shell"); code> sur votre système. P>
C'est faux. Système Code> L'appel ne respecte pas $ Shell en aucune manière, forme ou formulaire. Voir la réponse de Matt Kane
C'est compliqué. Perl n'invoque pas nécessairement une coquille. Perldoc dit: P>
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. P> blockQuote>
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 . P>
Si vous ne voulez pas appeler une coquille, appelle Si vous voulez une coque spécifique, appelez-le explicitement: < / p> système code> avec une liste:
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});'
$
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"'
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 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: p> 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 "(). P>
blockquote> Si la coque utilisée par Perl n'hérite pas implicitement les variables d'environnement, ils ne seront pas définis pour vous. P> P> homme perlrun code> et il mentionne une variable appelée
perl5shell code> ( spécifique au port Win32 em>). Ce qui suit a résolu ensuite le problème: p>