выполнить команду cd в скрипте ruby - PullRequest
4 голосов
/ 05 августа 2010

Я бы хотел изменить pwd текущей оболочки из сценария ruby. Итак:

> pwd
/tmp
> ruby cdscript.rb
> pwd
/usr/bin

Это код, который у меня сейчас есть:

exec('cd /usr/bin')

К сожалению, cd - встроенная команда. Итак:

`exec': No such file or directory - cd (Errno:ENOENT)

Есть ли обходной путь для этого?


Нет способа заставить его работать в самом ruby, поэтому я переключил передачи. Я изменил скрипт, чтобы вывести путь к целевому каталогу, а затем определил функцию в .bashrc, которая передавала бы аргументы через скрипт, а затем cd в нужный каталог. Не самодостаточный, как я бы надеялся, но он сделал свою работу.

Спасибо за ответы, ребята.

Ответы [ 6 ]

12 голосов
/ 05 августа 2010

Dir.chdir("/usr/bin") изменит pwd в скрипте ruby, но это не изменит PWD оболочки, когда скрипт выполняется в дочернем процессе.

8 голосов
/ 05 августа 2010

Вы не сможете изменить рабочий каталог вашей оболочки.

Когда он выполняет ruby, он разветвляется, и вы получаете новую среду с новым рабочим каталогом.

6 голосов
/ 14 августа 2012

Наткнулся на это во время поиска, чтобы сделать то же самое.

Мне удалось решить эту проблему, запустив несколько операторов в обратных чертах.

'cd #{path} && <statement> && cd ..'
3 голосов
/ 05 августа 2010

Как уже указывалось в других ответах, вы можете изменить pwd внутри вашего скрипта ruby, но это влияет только на дочерний процесс (ваш скрипт ruby).Pwd родительского процесса не может быть изменен из дочернего процесса.

Один из возможных способов - заставить скрипт вывести команду (команды) оболочки для выполнения и вызвать ее в обратных галочках (т. Е. Оболочка выполняет сценарий ипринимает свои выходные данные как команды для выполнения)

myscript.rb:

# … fancy code to build somepath …
puts "cd #{somepath}"

, чтобы вызвать его:

`ruby myscript.rb`

сделать его простой командой, используя псевдоним:

alias myscript='`ruby /path/to/myscript.rb`'

К сожалению, таким образом вы не можете получить текст, выводимый сценарием, пользователю, поскольку любой текст, выводимый сценарием, выполняется оболочкой (хотя и здесь есть и другие обходные пути).

0 голосов
/ 23 ноября 2016

Вы можете попробовать использовать system вместо exec. Это работает для меня.

Нравится system("cd #{new_path} && <statement> && cd #{original_path}")

0 голосов
/ 05 августа 2010

Вы не можете изменить рабочий каталог (или переменные среды) оболочки, которая вызвала вас в сценарии ruby ​​(или в любом другом приложении). Единственными командами, которые могут изменить pwd текущей оболочки, являются встроенные модули оболочки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...