【问题标题】:Process throwing "Unexpected return" error进程抛出“意外返回”错误
【发布时间】:2017-08-16 01:10:13
【问题描述】:

我正在尝试创建一个 Chef 配方,它将从 Role 读取属性,其中一个属性将包含需要在服务器上执行的 Bash 代码。

因此,我创建了以下流程:

def proc_test(command)
  proc = Proc.new { |command| command_out = Mixlib::ShellOut.new(command) ; command_out.run_command ; return command_out.stdout + command_out.stderr  }
  proc.call(command)
end

其中,当这样运行时:

node.set['attributes']['nested_attribute'] = proc_test("hostname")

有效。但如果我尝试这样做:

command="hostname"
node.set['attributes']['nested_attribute'] = proc_test(command)

它会抛出这个错误:

LocalJumpError
--------------
unexpected return

有人可以帮我解决这个问题吗?

如果我不使用return 关键字,而是使用put,我会得到同样的错误。

【问题讨论】:

  • 将所有的 Proc 代码放在一行是没有意义的,并且严重影响了可读性。你为什么这样做?
  • @tadman 除了我之外没有人会看到这段代码。所以它并不那么重要。
  • 猜猜看,我们现在正在查看您的代码。这很重要。
  • @tadman 是的。你说的对。我的错。

标签: ruby bash chef-infra


【解决方案1】:

我不明白你为什么认为你需要一个 Proc。只需使用普通的shell_out! 辅助方法或bash 资源即可。

【讨论】:

  • 我该怎么做?我不介意使用进程。很简单,当我尝试直接在代码上使用它时,它也失败了。
  • 是的。无论如何,伊戈尔的反应完美无缺。现在唯一的问题是,如果我发送到进程的命令在服务器上不存在,我会得到该异常。例如,如果 command 等于“pwd”,这个“proc_test(command)”将完美运行,但如果 command 等于“blahblahblah”,它将抛出异常。我期待得到 Unix 错误流,“找不到命令”或类似的东西,没有 Ruby 抛出异常。 :(
  • 我们可能应该把它带到 Slack,无论你想做什么都可能是个坏主意。
【解决方案2】:

问题是不能从Ruby procs 调用return。跳过return 即可避免错误:

 def proc_test(command)
     proc = Proc.new do |command|
       command_out = Mixlib::ShellOut.new(command) 
       command_out.run_command
       command_out.stdout + command_out.stderr
     end

     proc.call(command)
 end

【讨论】:

  • 非常感谢。它就像魅力一样。一个问题,如果我尝试运行服务器上不存在的命令(例如手指不可用的“手指”),它也会向我抛出一个关于“本地跳转:意外返回”的错误。我怎么能抓住它?
猜你喜欢
  • 2021-07-29
  • 1970-01-01
  • 2022-01-18
  • 2020-07-18
  • 2020-11-02
  • 2016-08-10
  • 2022-11-21
  • 2017-10-30
  • 1970-01-01
相关资源
最近更新 更多