Vargrantfile - Ruby - 意外的文件结尾

问题描述 投票:0回答:1

我是红宝石的新手。我试图修改现有的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 vagrant vagrantfile
1个回答
1
投票

这是一个语法错误,但不是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")。但这是一个单独的故事:)

© www.soinside.com 2019 - 2024. All rights reserved.