запустить команду в родительской оболочке из ruby - PullRequest
0 голосов
/ 18 июня 2009

Я пытаюсь изменить каталог оболочки. Я запускаю форму скрипта ruby ​​через сам скрипт ruby ​​...

Моя цель - создать небольшую программу для управления избранными каталогами и их легкого переключения между ними.

Вот что я сделал

#!/usr/bin/ruby
Dir.chdir("/Users/luca/mydir")

and than tried executing it in many ways...

my_script (this doesn't change the directory)
. my_script (this is interpreted as bash)
. $(ruby my_script) (this is interpreted as bash too!)

есть идеи?

Ответы [ 2 ]

4 голосов
/ 18 июня 2009

Не может быть сделано. Дочерние процессы не могут изменять среду своих родителей (включая текущий рабочий каталог родителя). Трюк . (также известный как source) работает только со сценариями оболочки, потому что вы говорите оболочке запускать этот код в текущем процессе (а не создавать подпроцесс для его запуска). Просто для удовольствия попробуйте поместить exit в файл, который вы запускаете таким образом (спойлер: вы выйдете из системы).

Если вы хотите иметь иллюзию этой работы, вам нужно создать функции оболочки, которые вызывают ваш скрипт на Ruby и имеют функцию оболочки, которая выполняет cd. Поскольку функции выполняются в текущем процессе, они могут изменить каталог. Например, учитывая этот скрипт ruby ​​(с именем temp.rb):

#!/usr/bin/ruby

print "/tmp";

Вы можете написать эту функцию BASH (скажем, у вас ~/.profile):

function gotmp {
    cd $(~/bin/temp.rb)
}

И тогда вы можете сказать gotmp в командной строке и изменить каталог.

0 голосов
/ 18 июня 2009
#!/usr/bin/env ruby

`../your_script`

Как это?

Или запустите ваш скрипт в каталоге, в котором вы хотите что-то сделать.

Может быть, я не понимаю ваш вопрос. Укажите более подробную информацию.

...