J'essaie d'organiser des scripts de tiers Bash de mon programme de rubis. p>
Avant de pouvoir les exécuter, ils ont besoin de moi pour sourmer un fichier. Sur la ligne de commande, tout fonctionne bien, mais à l'intérieur de Ruby, cela ne fonctionne pas. J'ai découvert que les commandes du système ouvrent un nouveau processus d'enregistrement de l'enfant et tout approvisionnement sera effectué dans cela et ne peut être vu à partir du processus de shell parent exécutant le script Ruby. Lorsque l'appel du système se termine, la coque de l'enfant est également tuée. p>
Comment puis-je contourner ce problème? P>
5 Réponses :
Je ne suis pas sûr si je comprends votre question correctement. Essayez-vous de créer un script shell avant d'en exécuter un autre? Dans ce cas, la réponse est simple: si le fichier source contient des variables que votre commande doit utiliser que vous devez utiliser mise à jour: janv. 26, 2010 - 15:10 em> p> Vous pouvez utiliser io.popen pour ouvrir une nouvelle coque: p> exporter code>. Il est également possible de définir des variables d'environnement dans votre script Ruby en utilisant
env ['
Je ne pense pas que l'exécution avec le système aidera, car les VARS ne seront définis que pour le processus Shell qui est généré pour exécuter cette commande.
Je ne peux même pas obtenir le système "source .bstrucc" de travailler dans mon répertoire utilisateur. Il se plaint de la commande non trouvée. Êtes-vous sûr que Source peut être utilisé comme vous avez posté?
Cela a fonctionné pour moi. J'ai essayé cela sur OSX 10.6. Shell de l'utilisateur qui exécute le script défini sur / bin / bash? (J'ai aussi mis à jour ma réponse.)
Merci pour votre réponse. J'ai été googling ceci et je ne peux pas comprendre pourquoi je ne peux pas chercher la source .CASHRC à l'intérieur du script. Comment vérifier si la coque est réglée sur / bin / bash?
La Shell Varibale $ Shell stocke la coquille de connexion de l'utilisateur. Je pense que cela devrait fonctionner dans ce cas particulier. Mais rappelez-vous que c'est que les utilisateurs se connectent Shell, donc en cours d'exécution de quelque chose comme / bin / sh -c "echo $ shell" à partir d'une coque bash imprimée / bin / bash.
Pour déterminer la coque actuelle, utilisez la variable d'environnement 0 $.
Quel est le point d'exécuter cela? L'environnement modifié ne sera pas reflété dans l'objet env code>.
faire ceci: puis dans RUBY: P> File.readlines("variables.txt").each do |line|
values = line.split("=")
ENV[values[0]] = values[1]
end
Malade essayer ceci. Cela signifie donc que le script peut modifier les variables d'environnement de son processus de coque contenant et donc tout autre processus enfant créé par les appels système avec hériter?
Non, mais tout processus exécuté à partir du script Ruby héritera des variables du script.
Ce qui précède fonctionne pour un seul fil et je fais ci-dessous. Mais une question que j'ai comment puis-je utiliser une copie fusionnée de l'environnement avec io.popen? D'une manière ou d'une autre, cela ne semble pas fonctionner. avec "système" je peux faire: # ... créer un nouveau "chemin" ici Subenv = Hash.New; Subenv.Merge! (env); # copier l'ancien subvenv environnement ['chemin'] = chemin; # Définir de nouvelles valeurs dans le système de copie (Subenv, Commandline);
Si vous avez une valeur avec un = code> cela ne fonctionnera pas (E.g.
url = http: //google.com? Q = foo code>).
Split code> prend un deuxième argument qui limite le fractionnement. À la place faire:
clé, valeur = ligne.split "=", 2; Env [clé] = valeur code>
Je l'ai fait parce que je ne voulais pas avoir à écrire un fichier ni à mélanger mon code rubis avec ce truc: je l'ai mis dans ~ / bin / run_with_env.sh. et ensuite, par exemple, je peux exécuter: p>
C'est horrible, mais ..
env = %x{. /some/shell/script/which/setups/your/env && env} env.split("\n").each do |line| key, value = line.split("=", 2) ENV[key] ||= value unless value.nil? or value.empty? end
Cela attrape toutes les variables exportées. Cela fonctionne, mais cela semble être un comportement médiocre.
Modification d'ENV ne fonctionne que pour un seul fil et je fais ci-dessous. Mais une question que j'ai comment puis-je utiliser une copie fusionnée de l'environnement avec io.popen? D'une manière ou d'une autre, cela ne semble pas fonctionner.
avec "système" je peux faire: p>