我是红宝石的新手。我试图修改现有的Vargrantfile,它是ruby语法。我在下面
def has_program(program)
ENV['PATH'].split(File::PATH_SEPARATOR).any? do |directory|
File.executable?(File.join(directory, program.to_s))
end
end
is_exist = has_program("some-command")
puts is_exist
$my_script = %{
if is_exist == false
if ! some-command status; then
#Do some staff
fi
end
# do some staff
}
Vagrant.configure("2") do |config|
node.vm.provision "shell", inline: $my_script
end
然后在运行vagrant up --provision
时我遇到了错误
syntax error: unexpected end of file
你能告诉我我在做什么错吗?
关于,-M-
这是一个语法错误,但不是Ruby代码中的错误。这是您在Ruby脚本中执行的shell代码中未完成的语句。
如果您将一个块未封闭,就会发生这种情况。解析器期望找到它的结束但是遇到脚本的结尾。
让我们看一下执行shell命令的部分
$my_script = %{
if is_exist == false
if ! some-command status; then
#Do some staff
fi
end
# do some staff
}
现在,让我们去掉你周围的Ruby部分。作业$my_script =
仍然是Ruby代码。花括号中的部分是% notation中的字符串文字,您稍后使用Vagrant的inline
作为shell脚本执行...但是,看起来您在结束字符串文字之前切换回Ruby语法。
解释器解析为shell脚本的是这部分:
if is_exist == false
if ! some-command status; then
#Do some staff
fi
end
# do some staff
请注意,整个外部if
表达式使用Ruby的if
语法。它不是有效的shell命令,因此是错误。
我不确定这个表达式的语义在你的情况下是什么,但是你需要将它转换为shell if
或者将它移动到你使用inline
选项传递给Vagrant的字符串文字之外。在旁注中,内部的逻辑似乎很奇怪。如果some-command
返回false,你正在调用has_program("some-command")
。但这是一个单独的故事:)