10
votes

Comment spécifier la coquille à utiliser pour un appel de système Ruby?

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


0 commentaires

3 Réponses :


4
votes

Je suppose que Ruby utilise la fonction system () c, qui utilise / bin / sh . Dans la plupart des systèmes, / bin / sh est juste un lien symbolique vers un autre shell, vous pouvez donc passer à ce que vous voulez


1 commentaires

Hm. / bin / sh est en effet un symboliste ... à / bin / bash! Donc, pour une raison quelconque, il définit le chemin pour être quelque chose de différent de ce qu'il n'est normalement?



10
votes

Autant que je sache, la seule façon de le faire est d'invoquer explicitement la coquille, par exemple xxx

ou xxx

Ou avec système: Système ("Bash", "-c", commande)

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?


3 commentaires

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 avec une commande multi-mots et que vous ne pouvez pas utiliser plusieurs arguments (par exemple, io.popen ), utilisez des guillemets évasés, comme Système ("Bash -C \" Cat Food \ "")



0
votes

Pourquoi ne pas simplement spécifier le chemin complet de l'exécutable ZIP.


2 commentaires

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.