8
votes

Comment (terminal) CD dans le dossier de Ruby Script

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 $ home Dans le terminal, je souhaite CD dans $ home / myDir à la fin du script.

J'ai essayé quelques choses, mais je trouve toujours dans le même réalisateur où le script a été lancé.

choses que j'ai essayé: < Pré> xxx

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.

J'ai trouvé quelque chose de similaire dans, mais c'est Lié à Python et réponse semble négatif.


< P> Vous pouvez demander pourquoi?

Je suis actuellement impliqué dans une application de ligne de commande (en utilisant GLI ) qui, comme point de départ, a besoin d'un dossier de projet. Donc, ma première commande ressemble à: xxx

qui crée un nouveau dossier avec nom Project dans le répertoire actuel. Maintenant, pour pouvoir travailler avec les autres commandes, j'ai besoin de: xxx

donc j'étais simplement penser que ce serait bien de me trouver Dans Project après avoir exécuté myfoo nouveau projet .


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 eval ?


merci pour les réponses. Mais j'ai bien peur que personne ne soit acceptable. Probablement la question n'était probablement pas :).


4 commentaires

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 . Je devrais intégrer la chose au niveau de l'exécution de la commande (voir la commande nouvelle ici )


4 Réponses :


2
votes

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"')


4 commentaires

Ok, mais je finis dans mon script avec % [eval $ (Ruby -e'putts "CD / TMP")] , 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 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) , et vous l'appellerez comme source my_script_that_evals.sh .



2
votes

Je doute qu'il y ait un moyen simple de le faire.

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 dir.chdir il modifie le répertoire de travail actuel du processus de script (enfant), pas le parent.

Peut-être que votre script pourrait lancer un coquille neuf 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 ...


1 commentaires

J'ai étendu la réponse qui demande à la chose l'inverse.



0
votes

commandant de minuit le fait, en utilisant un alias de shell et un script wrapper.

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 source 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.

Dans l'ensemble, cela permet de modifier le répertoire de travail actuel à la sortie.

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>


2 commentaires

Y a-t-il une documentation sur? Comment appliquer cela à mon cas d'utilisation?


C'est la même chose que ma réponse.



1
votes

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'"


2 commentaires

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' . De la ligne de commande, modifiez l'appel à être Exec MyFoo Nouveau projet . C'est toujours maladroit cependant :(