10 votes

Comment puis-je spécifier le shell à utiliser pour un appel système ruby ?

J'essaie d'exécuter des commandes depuis ruby via system (ou en utilisant des backticks), mais je rencontre des problèmes. Lorsque j'essaie d'appeler une commande, le shell est incapable de la trouver, même si je sais qu'elle fonctionne si je l'appelle directement. Par exemple :

`zip`
>> sh: zip: command not found

Le problème semble être que ruby utilise l'option sh dans laquelle $PATH n'est pas défini correctement, plutôt que bash et je ne sais pas pourquoi. L'utilisateur sous lequel mon application est exécutée est configuré de manière à utiliser bash par défaut.

Existe-t-il un moyen de dire à ruby d'utiliser bash au lieu de sh ?

10voto

sepp2k Points 157757

Pour autant que je sache, la seule façon de le faire est d'invoquer explicitement le shell, par exemple

`bash -c zip`

ou

`#{ ENV['SHELL'] } -c zip`

Ou avec le système : system("bash", "-c", command)

Cependant, ruby (et tous les processus engendrés par ruby) devraient hériter de l'environnement des processus parents et donc avoir $PATH correctement défini, même en utilisant un autre shell. Peut-être exécutez-vous ruby à partir d'une tâche cron ou d'un init script ou autre, où le PATH n'est tout simplement pas défini correctement ?

4voto

Javier Points 33134

Je suppose que Ruby utilise l'option system() La fonction 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 le changer pour ce que vous voulez.

0voto

Corban Brook Points 8836

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X