我在写一个简单的红宝石沙盒命令行实用程序从远程文件系统,以解压缩他们,让用户编辑文件复制并解压目录到本地临时目录。我使用Dir.mktmpdir作为默认的临时目录,这给了一个非常难看的路径(例如:在/ var /文件夹/ ZZ / zzzivhrRnAmviuee +++ 1VE +++哟/ -Tmp- / d20100311-70034-abz5zj)

我想复制和解压脚本到CD调用shell进入新的临时目录中,以便人们可以轻松地访问它的最后一个动作,但我无法弄清楚如何改变调用的PWD贝壳。一种可能性是有实用打印出新的路径到标准输出,然后运行该脚本在一个子shell的部分(即cd $(sandbox my_dir)),但我想打印出的复制和解压的进步,因为它可能需要长达10分钟,所以这是不行的。我是不是应该有它去一个预先确定的,容易找到的临时目录?有没有人有一个更好的建议?在此先感谢您的帮助。 -Erik

有帮助吗?

解决方案

您可能会死到一个新的外壳,坐在你从头目录,但我无法理解这一切的地步。如果您的用户要编辑这些文件,那么我想他们要么希望保留它们,或者您正计划与修改后的文件工作。在第一种情况下,将文件放在一个合理的位置,你会不会担心你的用户找到他们(当前工作目录)。在第二种情况下,催生了用户一个子shell,在划痕DIR坐镇,并指示他们要编辑的文件。当子shell退出,你可以继续从同一个Ruby程序处理您的文件。

其他提示

一个进程不能改变它的父进程的环境,所以你将不得不做父一些行动。

您可以有你的用户来源shell脚本,而脚本调用Ruby程序和CD的地方。当你使用你的shell命令源(.source),影响当前进程。

由于格伦·杰克曼笔记,一个子进程不能改变其母公司的当前工作目录(或环境变量等)。除非你违反了父进程使用调试器......

运行作为一个命令替换的部分的方法,可以写入到stderr,以提供输出到用户,而标准输出输出由命令替换捕获:

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来完成。

从包装外壳脚本创建临时目录第一和然后将其传递作为一个命令行参数传送给Ruby脚本。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top