J'aimerais savoir s'il est possible de changer le répertoire du terminal actuel de l'endroit où j'exécute mon script Ruby.
Par exemple, si j'exègre le script de J'ai essayé quelques choses, mais je trouve toujours dans le même réalisateur où le script a été lancé. P> choses que j'ai essayé: p> < Pré> xxx pré> Ils changent réellement répertoire, mais uniquement dans le fil de l'exécution du script. Lorsque le script se termine, mon emplacement actuel du terminal est toujours le même que j'étais avant de lancer le script. P> J'ai trouvé quelque chose de similaire dans, mais c'est Je suis actuellement impliqué dans une application de ligne de commande (en utilisant qui crée un nouveau dossier avec nom donc j'étais simplement em> penser que ce serait bien de me trouver Dans Comme j'avais peur, ce n'est pas si facile (pas possible du tout). Alors qu'en est-il d'utiliser un script Bash qui fait que les appels rubis que je veux, à la place du fichier standard généré par des rubygems? Est-ce réalisable? Suis-je stupide? Devrais-je utiliser merci pour les réponses. Mais j'ai bien peur que personne ne soit acceptable. Probablement la question n'était probablement pas :). P> p> $ home code > Dans le terminal, je souhaite CD dans $ home / myDir code> à la fin du script. P>
< P> Vous pouvez demander pourquoi? P> GLI code>) qui, comme point de départ, a besoin d'un dossier de projet. Donc, ma première commande ressemble à: p> Project code> dans le répertoire actuel. Maintenant, pour pouvoir travailler avec les autres commandes, j'ai besoin de: p> Project code> après avoir exécuté myfoo nouveau projet code>. p>
eval code>? P>
4 Réponses :
Ce n'est pas possible, à ma connaissance, car ils sont des processus différents. Si vous avez besoin d'affecter le processus parent de Ruby Script (Bash), BASH devra provoquer quelque chose. Donc, vous pourriez avoir votre script rubis de sortie de script de rubis certaines commandes Bash, puis avoir un wrapper Bash de la sortie de Ruby de la source.
Essayez ceci comme exemple, dans Bash: P>
eval $(ruby -e'puts "cd /tmp"')
Ok, mais je finis dans mon script avec % [eval $ (Ruby -e'putts "CD / TMP")] code>, qui ne fait aucune différence.
Droite, parce que vous êtes en train de reproduire un processus d'enfant Bash (un petit-enfant du processus Bash que vous souhaitez affecter), évaluer votre code, puis le laisser mourir. Vous devez exécuter Eval directement dans le processus Bash que vous souhaitez modifier. Plus tard, vous pouvez le ranger avec un alias ou quelque chose comme ça.
J'ai étendu la réponse qui demande à la chose l'inverse.
Vous êtes toujours i> au besoin d'appeler source du processus de bash actuel. Vous ne pouvez pas vous déplacer ça. Donc, vous pouvez avoir un script Bash qui ressemble à eval $ (ruby my_script_that_outputs_bash.rb) code>, et vous l'appellerez comme source my_script_that_evals.sh code>.
Je doute qu'il y ait un moyen simple de le faire. P>
Lorsque vous lancez un programme de votre shell de connexion, sous la hotte, il fait une fourchette / EXED, ce qui signifie qu'un nouveau processus (enfant) est créé (qui possède son propre environnement, tel que le répertoire de travail actuel) et son entrée standard / Les flux de sortie / d'erreur sont associés au processus de coque (parent). Donc, lorsque votre script appelle Peut-être que votre script pourrait lancer un coquille neuf em> avant de sortir, il semble donc que votre terminal a modifié le répertoire. Bien que vous devriez quitter cette coquille supplémentaire avant de quitter votre session de terminal ... P> dir.chdir code> il modifie le répertoire de travail actuel du processus de script (enfant), pas le parent. P>
J'ai étendu la réponse qui demande à la chose l'inverse.
commandant de minuit le fait, en utilisant un alias de shell et un script wrapper. p>
Le wrapper est destiné à CD'ing à un répertoire déterminé par le contenu d'un fichier écrit par MC (1) à la sortie et que l'alias est utilisé pour Dans l'ensemble, cela permet de modifier le répertoire de travail actuel à la sortie. P>
Pour ce faire, vous auriez besoin de dupliquer la fonctionnalité d'alias / wrapper. Voir http://midnight-commander.org/browser/contrib pour la façon dont ils l'ont fait. < / p> source code> l'emballage, ce qui le fait exécuter Dans la coque de connexion, au lieu du sous-groupe qui aurait été fourchu, si le script a été lancé normalement. P>
Y a-t-il une documentation sur? Comment appliquer cela à mon cas d'utilisation?
C'est la même chose que ma réponse.
Peut-être légèrement plus facile,
Vous pouvez utiliser EXED en combinaison avec Maerics Post sur la création d'une nouvelle coque bash à l'intérieur de Ruby pour y parvenir. P>
exec ruby -e "Dir.chdir( 'mydir' ); exec 'bash'"
Comment intégrer cela avec un rubygem qui a sa propre commande, comme celui décrit dans la réponse?
@empo à la fin du script Ruby Ajouter Exec 'Bash' Code>. De la ligne de commande, modifiez l'appel à être Exec MyFoo Nouveau projet code>. C'est toujours maladroit cependant :(
Il semble peu probable que vous puissiez faire cela. Tous les appels système de Ruby fonctionnent dans un fil différent de votre script / shell et n'auraient aucun effet sur l'emplacement actuel. De quoi espérez-vous utiliser cela?
@ Douglas-F-Shearer: J'ai étendu mes raisons un peu dans la réponse
Juste hors de curiosité, pourquoi ma réponse n'a-t-elle pas fonctionné? J'ai utilisé cette technique à quelques reprises et je ne suis pas clair comment cela ne convient pas à votre situation.
@Ian: Votre réponse fonctionne, mais n'est pas facile applicable à ma situation. J'ai cinq commandes (peut-être plus dans le futur) et je veux rester avec un
rubygem code>. Je devrais intégrer la chose au niveau de l'exécution de la commande (voir la commandenouvelle code> ici )