J'essaie d'exécuter des commandes de Ruby via code> système code> (ou en utilisant des backtsticks), mais je rencontre des problèmes. Lorsque j'essaie d'appeler une commande, la coquille est incapable de le trouver, même si je sais que cela fonctionne si je l'appelle droite. Par exemple:
`zip` >> sh: zip: command not found
3 Réponses :
Je suppose que Ruby utilise la fonction system () code> c, qui utilise
/ bin / sh code>. Dans la plupart des systèmes,
/ bin / sh code> est juste un lien symbolique vers un autre shell, vous pouvez donc passer à ce que vous voulez p>
Hm. / bin / sh est en effet un symboliste ... à / bin / bash! Donc, pour une raison quelconque, il définit le chemin code> pour être quelque chose de différent de ce qu'il n'est normalement?
Autant que je sache, la seule façon de le faire est d'invoquer explicitement la coquille, par exemple ou p> Ou avec système: Cependant, Ruby (et tous les processus engendrés par Ruby) devraient hériter de l'environnement des processus parents et donc Avoir $ chemin de chemin correctement même lorsque vous utilisez une autre coquille. Êtes-vous peut-être exécuté Ruby d'un travail cron ou d'un script Init ou similaire, où le chemin n'est tout simplement pas réglé correctement? P> P> Système ("Bash", "-c", commande) code> p>
L'appel est fabriqué à partir du Web, non de cron ou en tant que script. Est-ce que Apache pourrait changer mon chemin?
C'est très probablement le cas Oui. (Bien probablement apache ne change pas de chemin, mais le chemin n'a pas été défini sur sa valeur habituelle, car vos fichiers RC ne sont pas achetés avant d'invoquer Apache).
Si vous devez remplacer zip code> avec une commande multi-mots et que vous ne pouvez pas utiliser plusieurs arguments (par exemple,
io.popen code>), utilisez des guillemets évasés, comme
Système ("Bash -C \" Cat Food \ "") Code>
Pourquoi ne pas simplement spécifier le chemin complet de l'exécutable ZIP. P>
Yah, je pourrais. La raison pour laquelle je n'ai pas, c'est que cela a été développé dans plusieurs environnements de développement et que le chemin n'est pas nécessairement le même sur chacun d'entre eux.
Une commande comme l'endroit doit toujours être sur le chemin. Ou lieu commun dans toutes les distributions / usr / bin / où cela pourrait être une bonne solution pour trouver des bacs pouvant être dispersés.