对Ruby来说很新,无法在这段代码中看到名称语法错误:
#! /usr/bin/env ruby
require 'sensu-plugin/metric/cli'
class MetricAvailableUpdates < Sensu::Plugin::Metric::CLI::Graphite
option :scheme,
description: 'Metric naming scheme',
long: '--scheme SCHEME',
short: '-s SCHEME',
default: "#{Socket.gethostname}"
def run
# Get the metrics.
output = %x[/usr/lib/update-notifier/apt-check --human-readable]
output_lines = output.split(/(\n)/)
metrics = {}
updates_pattern = " packages can be updated."
updates = output_lines[0].tr(upgrades_pattern, "").to_i
metrics[:available_updates] = updates
security_updates_pattern = " updates are security updates."
security_updates = output_lines[2].tr(security_updates_pattern, "").to_i
metrics[:available_security_updates] = security_updates
# Print them in graphite format.
metrics.each do |k, v|
output [config[:scheme], k].join('.'), v
end
# Done
ok
end
end
如果语法错误实际上在本节之前,我可以添加前面的代码。 修改:为每条评论请求添加完整的文件内容
完整错误,如果有用:
./metrics-available-updates.rb:29: syntax error, unexpected ',', expecting keyword_end
output [config[:scheme], k].join('.'), v
答案 0 :(得分:3)
如果你玩了一下,你会发现语法错误消失了,当你注释掉有问题的行,或者行
output = %x[/usr/lib/update-notifier/apt-check --human-readable]
当Ruby解析文件时,需要猜测符号是表示方法调用还是变量引用。在这种情况下,output
作为变量存在,但是进一步向下,你写
output [config[:scheme], k].join('.'), v
这意味着它突然变成了方法调用。
我承认Ruby lexer应该提供更有用的错误消息....
答案 1 :(得分:0)
添加parentheses
...
metrics.each do |k, v|
output([config[:scheme], k].join('.'), v)
end
...