在ruby中捕获bash命令的整个输出?

时间:2012-08-20 15:54:00

标签: c++ ruby gentoo

我有一个我开发的Ruby脚本,允许我安装和构建多个C ++包。我能够执行Ruby脚本并安装包没有错误。

但是,我希望能够将所有输出(包括cerr)捕获到我选择的“日志”文件中。我能够重定向Ruby的cerr和标准输出,但我无法捕获bash命令:qmakemakemake install cerr。输出仍然流向终端。

我希望能够运行Ruby脚本,而不会看到来自任何qmakemakemake install bash命令的任何调试消息,但能够检查日志文件稍后用于构建结果。

4 个答案:

答案 0 :(得分:2)

你可以做到

require 'open3'

log = File.new("#{your_log_dir}/script.log", "w+")
command = "make"

Open3.popen3(command) do |stdin, stdout, stderr|
     log.puts "[OUTPUT]:\n#{stdout.read}\n"
     unless (err = stderr.read).empty? then 
          log.puts "[ERROR]:\n#{err}\n"
     end
end

答案 1 :(得分:0)

%x[#insert bash command here]捕获回复。如果你需要处理STDERR,你会想把它传递给STDOUT我相信。

答案 2 :(得分:0)

直接将子进程的stdout和stderr转储到文件:

cmd = ['ls', '-ahl', '/my/directory'] # example directory listing
pid = Process.spawn *cmd, out: '/path/to/stdout/log', err: '/path/to/stderr/log'
Process.wait pid

您也可以传递文件描述符而不是路径字符串。

答案 3 :(得分:0)

如果您使用的是Mac OS或Linux,如果要将STDOUT和STDERR捕获到脚本中的变量,则可以使用标准重定向和简单的shell调用:

asdf = `ls foo 2>&1`
asdf # => "ls: foo: No such file or directory\n"

2>&1只是将命令输出中的STDERR重定向到STDOUT,该程序在程序运行时被捕获。

如果要将STDOUT和STDERR重定向到同一文件以供日后使用,请使用:

`ls foo > output.log 2>&1`

&2>1生效之前必须重定向STDOUT,但这将捕获两者。

有关详细信息,请参阅man sh的“重定向”部分。