我有以下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命令时,没有问题。有什么问题?
答案 0 :(得分:4)
您的空格不能包含=
符号。用
cmd="
source=$(mktemp)
echo $source
"
system("#{cmd}")
system("source=$(mktemp)")
注意:=
符号后没有空格。
在=
符号后面留空格的问题是sh
将尝试执行$(mktemp)
扩展所给出的命令(即命令/tmp/tmp.EpXeLNkqjN
变量source
被设置为空字符串的类似东西 - 不存在的东西。
答案 1 :(得分:2)
您的代码中存在许多错误,包括非法空格,无法正确取消引用变量,以及潜在的IFS或引用问题。
使用合法的Bash语法可以正常工作。例如:
cmd='source=$(mktemp); echo "$source"'
system(cmd)
在我的系统上,这会在标准输出上正确打印预期结果,并正确返回。例如,撬显示:
/tmp/tmp.of89uLTUqf
=> true
为什么不使用反引号在Ruby中分配变量,而不是使用Kernel#system进行炮轰?例如:
source = `mktemp`
# => "/tmp/tmp.KVhGMzZRiG\n"
这似乎更简单,更不容易出错。
答案 2 :(得分:1)
确保您将文件的权限设置为可执行。