Вы можете использовать модуль Open3
( manual ). Он возвращает 3 объекта: stdin, stdout, stderr
Однако вы не можете сохранить порядок между stdout и stderr.
Пример:
#include <stdio.h>
int main(int argc, char *argv[]) {
fprintf(stdout, "Normal output\n");
fprintf(stderr, "Error output\n");
fprintf(stdout, "Normal output\n");
}
Захвачено как:
Normal output
Normal output
Error output
Единственный способ сохранить порядок - запустить программу дважды. : - (
Пример кода рубина:
#!/usr/bin/env ruby
require 'open3'
require 'pathname'
logfile = ARGV.first()
cmd = ARGV.drop(1).join(" ")
dir = Pathname(logfile).dirname
if not File.directory?(dir)
Dir.mkdir(dir)
end
file = File.open(logfile, "w")
stdin, stdout, stderr = Open3.popen3(cmd)
stdin.close()
file.puts(stdout.read())
error = stderr.read()
file.puts(error)
puts error
file.close