从Ruby获得系统调用的控制台输出

时间:2015-03-25 18:01:06

标签: ruby unix

我想创建一个前缀控制台输出的Ruby脚本。例如:

我想实现这样的界面:

puts 'MainLogger: Saying hello'
prefix_output_with('MainLogger') do
  system 'echo hello'
end

所以这会显示在控制台中:

MainLogger: Saying hello
MainLogger: hello

为所有系统调用输出添加前缀以获得一些记录器的好方法是什么?

注意:如果我们回应系统调用的内容,我不在乎

1 个答案:

答案 0 :(得分:1)

这里重要的一点是,无法知道system是否会实际产生输出。我假设你不想在系统调用没有打印任何东西的情况下都需要空白MainLogger:,所以你需要在shell中做前缀:

def prefix_system_calls pre
  sys = Kernel.instance_method(:system)
  # redefine to add prefix
  Kernel.send(:define_method, :system) do |cmd|
    sys.bind(self)["#{cmd} | sed -e 's/^/#{pre}: /'"]
  end

  yield
  # redefine to call original method
  Kernel.send(:define_method, :system) do |*args|
    sys.bind(self)[*args]
  end
end

system "echo foo"
prefix_system_calls("prefix") do
  system "echo bar"
end
system "echo baz"
# foo
# prefix: bar
# baz

但这个实现非常脆弱。它不处理all the different ways you can call system,包含特殊shell字符的前缀可能会导致错误。