1

我有以下 Ruby 代码:

cmd="
source= $(mktemp)
echo source
"
system("#{cmd}")
system("source= $(mktemp)")

我希望代码执行“mktemp”命令并将临时文件名输出到变量“source”。但是,我收到的错误消息是:

sh: /tmp/tmp.EpXeLNkqjN: Permission denied

sh: /tmp/tmp.wVCqdqHSpp: Permission denied


------------------
(program exited with code: 0)
Press return to continue

即使我以 root 身份运行程序,错误也是一样的。

但是,当我只运行 mktemp 命令时,没有问题。怎么了?

4

3 回答 3

4

=符号不能有空格。将您的代码替换为

cmd="
source=$(mktemp)
echo $source
"
system("#{cmd}")
system("source=$(mktemp)")

注意:标志后面没有空格=

=在符号后面留一个空格的问题是,sh它将尝试执行由扩展给出的命令$(mktemp)(即命令/tmp/tmp.EpXeLNkqjN或类似的东西——不存在),变量source被设置为空字符串。

于 2012-12-31T16:03:45.517 回答
2

问题:无效的 Shell 语法

您的代码中有许多错误,包括非法空格、未能正确取消引用变量以及潜在的 IFS 或引用问题。

解决方案:使用正确的 Shell 语法

使用合法的 Bash 语法可以正常工作。例如:

cmd='source=$(mktemp); echo "$source"'
system(cmd)

在我的系统上,这会在标准输出上正确打印预期结果,并正确返回。例如,pry 显示:

/tmp/tmp.of89uLTUqf
=> true

更好的解决方案:使用反引号

与其使用Kernel#system进行脱壳,为什么不使用反引号在 Ruby 中分配变量?例如:

source = `mktemp`
# => "/tmp/tmp.KVhGMzZRiG\n"

这似乎更简单,更不容易出错。

于 2012-12-31T17:22:14.760 回答
1

确保您将文件的权限设置为可执行。

于 2012-12-31T11:18:46.467 回答