为什么从我的Ruby脚本调用mktemp说权限被拒绝了?

时间:2012-12-31 09:15:57

标签: ruby bash permissions

我有以下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命令时,没有问题。有什么问题?

3 个答案:

答案 0 :(得分:4)

您的空格不能包含=符号。用

替换你的代码
cmd="
source=$(mktemp)
echo $source
"
system("#{cmd}")
system("source=$(mktemp)")

注意:=符号后没有空格。

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

答案 1 :(得分:2)

问题:无效的Shell语法

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

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

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

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

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

/tmp/tmp.of89uLTUqf
=> true

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

为什么不使用反引号在Ruby中分配变量,而不是使用Kernel#system进行炮轰?例如:

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

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

答案 2 :(得分:1)

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