Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 将stderr和stdout重定向回终端?_Ruby - Fatal编程技术网

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输出被保留?这是过程的输出吗?当你的程序“显示对流程的反馈”时,它是在写什么?