4

我正在编写一个简单的 ruby​​ 沙箱命令行实用程序来将目录从远程文件系统复制和解压缩到本地临时目录,以便解压缩它们并让用户编辑文件。我使用 Dir.mktmpdir 作为默认的临时目录,它提供了一个非常丑陋的路径(例如:/var/folders/zz/zzzivhrRnAmviuee+++1vE+++yo/-Tmp-/d20100311-70034-abz5zj)

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

4

4 回答 4

3

您可能会死于位于您的暂存目录中的新外壳,但我无法理解这一切的意义。如果您的用户要编辑这些文件,那么我想他们要么想要保留它们,要么您正计划使用修改后的文件。在第一种情况下,将文件放在合理的位置,您不必担心用户会找到它们(当前工作目录)。在第二种情况下,为您的用户生成一个位于临时目录中的子 shell,并指示他们编辑文件。当 subshel​​l 退出时,您可以继续从同一个 ruby​​ 程序处理您的文件。

于 2010-03-12T01:29:58.313 回答
1

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

您可以让您的用户获取一个 shell 脚本,并且该脚本调用 ruby​​ 程序和 cd 在某处。当您使用 shell 的源命令(.source)时,会影响当前进程。

于 2010-03-12T00:56:33.977 回答
1

正如 glenn jackman 所指出的,子进程不能更改其父进程的当前工作目录(或环境变量等)。除非你算上使用调试器违反父进程...</p>

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

cd "$(sandbox whatever)"

命令将其大部分输出发送到 stderr,并且仅将最终的“chdir 目录”发送到 stdout。如果沙盒是一个 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 中可以做一些等效的事情。

于 2010-03-12T01:39:16.817 回答
0

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

于 2010-03-12T12:10:57.317 回答