2010-06-10 5 views

Répondre

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

Redirigera stdout et stderr dans le même fichier.

+3

En supposant que vous utilisez sur * nix –

+0

@Steve: Je pense que '>' fonctionne sous Windows - je ne suis pas sûr de '2>'. –

+2

Cela fonctionnera aussi sur Windows. – gthomaslynch

58

De dans un script Ruby, vous pouvez rediriger stdout et stderr avec la méthode 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

Comment normal $ stdout peut-il être restauré par la suite? – shevy

+0

pourquoi devrions-nous utiliser la méthode rouvrir? cela signifie que si "out.txt" n'existe pas, il sera créé? – wind

+0

Jetez un coup d'œil à [cette réponse] (http://stackoverflow.com/a/22777806/1287376) pour savoir comment restaurer $ stdout par la suite. –

13

Note: réouverture des flux standard vers/dev/null est une bonne vieille méthode d'aider un processus pour devenir un démon. Par exemple:

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

Que voulez-vous dire par «aider un processus à devenir un démon»? – silvamerica

+4

Sous UNIX, pour que le programme devienne un démon, le programmeur ne doit pas simplement le mettre en arrière-plan, mais également rediriger ses flux d'E/S standard. Connaissez-vous cela? –

+0

Note: Si vous utilisez 'Process.daemon' intégré, il peut le faire pour vous. Voir [docs ici] (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

Bon, mais c'est mieux, dans le cas où STDOUT était autre chose. http://stackoverflow.com/a/4459463/26604 –

Questions connexes