Изменить текущий рабочий каталог вызывающей оболочки из сценария ruby - PullRequest
4 голосов
/ 12 марта 2010

Я пишу простую утилиту командной строки ruby ​​sandbox для копирования и разархивирования каталогов из удаленной файловой системы в локальный рабочий каталог, чтобы разархивировать их и позволить пользователям редактировать файлы. Я использую Dir.mktmpdir в качестве стандартного рабочего каталога, который дает действительно ужасный путь (например: / var / folder / zz / zzzivhrRnAmviuee +++ 1vE +++ yo / -Tmp- / d20100311-70034-abz5zj)

Мне бы хотелось, чтобы последнее действие сценария копирования и распаковки переместило вызывающую оболочку в новый рабочий каталог, чтобы люди могли легко получить к ней доступ, но я не могу понять, как изменить PWD вызывающего ракушка. Одна из возможностей состоит в том, чтобы утилита распечатала новый путь к stdout, а затем запустила скрипт как часть подоболочки (т.е. cd $(sandbox my_dir)), но я хочу распечатать процесс копирования и распаковки, поскольку он может занять до 10 минут, так что это не сработает. Должен ли я просто перейти к заранее определенному, простому в поиске каталогу? У кого-нибудь есть лучшее предложение? Заранее спасибо за помощь. -Erik

Ответы [ 4 ]

3 голосов
/ 12 марта 2010

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

1 голос
/ 12 марта 2010

Как отмечает Гленн Джекман, дочерний процесс не может изменить текущий рабочий каталог своего родителя (или переменные среды и т. Д.). Если вы не считаете нарушение родительского процесса отладчиком…

Процесс, выполняемый как часть подстановки команды, может записать в stderr, чтобы предоставить вывод пользователю, пока вывод stdout захватывается подстановкой команды:

cd "$(sandbox whatever)"

Где команда sandbox отправляет большую часть своих выводов в stderr, а только последний каталог to для chdir to ’в stdout. Если бы sandbox был сценарием оболочки, вы могли бы сделать это так:

#!/bin/sh
newdir="$(mktemp -dt sandobox)"
{
# do whatever, in a sub-shell
# use a group command (or change the braces to parens to use a sub-shell) to
# capture all stdout and send it to stderr 
} 1>&2
echo "$newdir"

Я уверен, что в Ruby можно сделать что-то подобное.

1 голос
/ 12 марта 2010

Процесс не может изменить среду своего родительского процесса, поэтому вам придется выполнить некоторые действия в родительском процессе.

Ваши пользователи могут получить сценарий оболочки, и этот сценарий вызывает программу ruby ​​и где-то компакт-диск. Когда вы используете исходную команду вашей оболочки (. или source), это влияет на текущий процесс.

0 голосов
/ 12 марта 2010

Сначала создайте временный каталог из сценария оболочки, а затем передайте его в качестве аргумента командной строки в сценарий Ruby.

...