我有一个我开发的Ruby脚本,允许我安装和构建多个C ++包。我能够执行Ruby脚本并安装包没有错误。
但是,我希望能够将所有输出(包括cerr)捕获到我选择的“日志”文件中。我能够重定向Ruby的cerr和标准输出,但我无法捕获bash命令:qmake
,make
或make install
cerr。输出仍然流向终端。
我希望能够运行Ruby脚本,而不会看到来自任何qmake
,make
或make install
bash命令的任何调试消息,但能够检查日志文件稍后用于构建结果。
答案 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
的“重定向”部分。