Ruby 将stderr和stdout重定向回终端?
目前,我有:Ruby 将stderr和stdout重定向回终端?,ruby,Ruby,目前,我有: $stdout.sync = true $stderr.sync = true orig_stdout = $stdout.clone orig_stderr = $stderr.clone $stdout.reopen("log.txt","w") $stderr.reopen("log.txt","w") #Run some processes that I want to hide from user view $stdout.reopen(orig_stdout) $s
$stdout.sync = true
$stderr.sync = true
orig_stdout = $stdout.clone
orig_stderr = $stderr.clone
$stdout.reopen("log.txt","w")
$stderr.reopen("log.txt","w")
#Run some processes that I want to hide from user view
$stdout.reopen(orig_stdout)
$stderr.reopen(orig_stderr)
#Display feedback on processes completing and continue with Ruby program.
end
但是,当我运行这个程序时,Ruby不会将stdout和stderr发送回终端。它们一直保持不显示,直到程序进程终止,然后显示在终端上
有没有办法将stdout和stderr立即交换回终端?
多谢各位
编辑:
在
#运行一些我想从用户视图中隐藏的进程
在这些过程中,我还需要用户输入svn用户名和svn密码。
这就是程序不会输出回终端的原因
我仍然需要能够将所有的输出重定向到一个“log.txt”文件,然后再返回,但是要实现svn 这是个老问题,我发现自己也处于同样的情况。我编写了一个多IO类,它扩展了
文件
并覆盖了写入
放置
和关闭
方法,我还确保了它的线程安全:
require 'singleton'
class MultiIO < File
include Singleton
@@targets = []
@@mutex = Mutex.new
def self.instance
self.open('/dev/null','w+')
end
def puts(str)
write "#{str}\n"
end
def write(str)
@@mutex.synchronize do
@@targets.each { |t| t.write str; flush }
end
end
def setTargets(targets)
raise 'setTargets is a one-off operation' unless @@targets.length < 1
targets.each do |t|
@@targets.push STDOUT.clone if t == STDOUT
@@targets.push STDERR.clone if t == STDERR
break if t == STDOUT or t == STDERR
@@targets.push(File.open(t,'w+'))
end
self
end
def close
@@targets.each {|t| f.close}
end
end
STDOUT.reopen MultiIO.instance.setTargets(['/tmp/1.log',STDOUT,STDERR])
STDERR.reopen STDOUT
threads = []
5.times.each do |i|
threads.push(
Thread.new do
10000.times.each do |j|
STDOUT.puts "out#{i}:#{j}"
end
end
)
end
5.times.each do |i|
threads.push(
Thread.new do
10000.times.each do |j|
STDERR.puts "err#{i}:#{j}"
end
end
)
end
threads.each {|t| t.join}
require'singleton'
类MultiIO
这里有一个类似的问题,并有一个公认的答案:检查我编辑的内容。我已经使用了这个答案和其他几个答案来获得我现在所拥有的。问题是,我需要它处理SVN参数,这导致输出无法切换。您运行的是哪个版本的Ruby?我用irb
(ruby 1.8.7)测试了你的代码,它对我很有效。我不明白你所说的“svn实现”是什么意思,你能澄清一下吗?你能澄清一下这是什么意思吗?“Ruby不会将stdout和stderr发送回终端。在程序进程终止之前,它们不会被显示,然后在终端上显示。”哪个stdout和stderr输出被保留?这是过程的输出吗?当你的程序“显示对流程的反馈”时,它是在写什么?