2010-06-10 13 views

Respuesta

5
./yourscript.rb 2>&1 > log.txt 

redireccionará stdout y stderr al mismo archivo.

+3

Suponiendo que se está ejecutando en * nix –

+0

@Steve: Creo que '>' funciona en Windows, aunque no estoy seguro de '2>'. –

+2

Esto funcionará en Windows también. – gthomaslynch

58

De dentro de un script de Ruby, puede redirigir stdout y stderr con el método IO#reopen.

# a.rb 
$stdout.reopen("out.txt", "w") 
$stderr.reopen("err.txt", "w") 

puts 'normal output' 
warn 'something to stderr' 
 
$ ls 
a.rb 
$ ruby a.rb 
$ ls 
a.rb err.txt out.txt 
$ cat err.txt 
something to stderr 
$ cat out.txt 
normal output 
+2

¿Cómo se puede restablecer $ stdout normal después? – shevy

+0

¿por qué deberíamos usar el método de reapertura? significa que si "out.txt" no existe, se creará? – wind

+0

Eche un vistazo a [esta respuesta] (http://stackoverflow.com/a/22777806/1287376) sobre cómo restaurar $ stdout después. –

13

Nota: reapertura de los flujos estándares a/dev/null es un buen método antiguo de ayudar a un proceso para convertirse en un demonio. Por ejemplo:

# daemon.rb 
$stdout.reopen("/dev/null", "w") 
$stderr.reopen("/dev/null", "w") 
+2

¿Qué quiere decir con "ayudar a que un proceso se convierta en un daemon"? – silvamerica

+4

En UNIX para convertir un programa en un daemon, el programador no debería simplemente copiarlo en un segundo plano sino también redirigirlo a los flujos estándar de E/S. ¿Estás familiarizado con esto? –

+0

Nota: Si usa el 'Process.daemon' incorporado, puede hacer esto por usted. Ver [documentos aquí] (http://ruby-doc.org/core-2.2.2/Process.html#method-c-daemon). – captainpete

7
def silence_stdout 
    $stdout = File.new('/dev/null', 'w') 
    yield 
ensure 
    $stdout = STDOUT 
end 
+0

Bueno, pero esto es mejor, en caso de que STDOUT fuera otra cosa. http://stackoverflow.com/a/4459463/26604 –

Cuestiones relacionadas