从ruby脚本更改调用shell的当前工作目录

从ruby脚本更改调用shell的当前工作目录,ruby,shell,copy,sandbox,unzip,Ruby,Shell,Copy,Sandbox,Unzip,我正在编写一个简单的ruby sandbox命令行实用程序,将目录从远程文件系统复制并解压缩到本地临时目录,以便解压缩目录并允许用户编辑文件。我使用Dir.mktmpdir作为默认的临时目录,它给出了一个非常难看的路径(例如:/var/folders/zz/zzzivhrnamviuee+++1vE+++yo/-Tmp-/d20100311-70034-abz5zj) 我希望复制和解压脚本的最后一个操作将调用shell cd到新的scratch目录中,以便人们可以轻松访问它,但我不知道如何更改调

我正在编写一个简单的ruby sandbox命令行实用程序,将目录从远程文件系统复制并解压缩到本地临时目录,以便解压缩目录并允许用户编辑文件。我使用Dir.mktmpdir作为默认的临时目录,它给出了一个非常难看的路径(例如:/var/folders/zz/zzzivhrnamviuee+++1vE+++yo/-Tmp-/d20100311-70034-abz5zj)


我希望复制和解压脚本的最后一个操作将调用shell cd到新的scratch目录中,以便人们可以轻松访问它,但我不知道如何更改调用shell的PWD。一种可能是让实用程序打印出stdout的新路径,然后作为子shell的一部分运行脚本(即,
cd$(sandbox my_dir)
),但我想打印出拷贝和解压缩的进度,因为这可能需要10分钟,所以这不起作用。我应该让它进入一个预先确定的、容易找到的临时目录吗?有人有更好的建议吗?提前感谢你的帮助-Erik

进程无法更改其父进程的环境,因此您必须在父进程中执行某些操作


您可以让用户编写一个shell脚本,该脚本调用ruby程序和cd。当您使用shell的source命令(
source
)时,会影响当前进程。

您可能会死在位于scratch dir的新shell中,但我很难理解这一切的意义。如果您的用户要编辑这些文件,那么我想他们要么想要保留这些文件,要么您打算使用修改过的文件。在第一种情况下,将文件放在一个合理的位置,您就不必担心用户会找到它们(当前工作目录)。在第二种情况下,为用户生成一个位于scratch目录中的子shell,并指示他们编辑文件。当子shell退出时,您可以继续处理来自同一ruby程序的文件。

正如glenn jackman指出的,子进程不能更改其父进程的当前工作目录(或环境变量等)。除非您认为使用调试器违反父进程

作为命令替换的一部分运行的进程可以写入stderr,以便在命令替换捕获stdout输出时向用户提供输出:

cd "$(sandbox whatever)"
其中,sandbox命令将其大部分输出发送到stderr,而将最后一个“directory to chdir to”发送到stdout。如果sandbox是一个shell脚本,您可以这样做:

#!/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中可以做一些类似的事情。

首先从包装shell脚本创建临时目录,然后将其作为命令行参数传递给Ruby脚本。

$()
没有使用子shell,而是命令替换。子shell使用空括号完成:
(cd/tmp)
(实际上什么也不做,因为只有子shell执行chdir,而原始shell保持不变。另请参见和其他内容……输出到cwd并不坏,但复制和解压缩的原因之一是将数据传输到本地文件系统,延迟要高得多,尽管没有规则规定用户不能自行创建cratch目录。一个更直观的解决方案可能是默认为一个已知的临时目录(/tmp,例如),并告诉他们查看那里。我想用正确的方法(mktmpdir)来做,但我认为这样做的持续时间不会超过程序的运行时间(不像我需要的那样持续数小时)