Comment puis-je rediriger temporairement stderr en Ruby?
J'aimerais temporairement rediriger stderr dans un script Ruby pour la durée d'un bloc, veillant à ce que je le réinitialiser à sa valeur d'origine à la fin du bloc.
J'ai eu du mal à trouver comment faire cela dans le rubis docs.
- Question connexe: stackoverflow.com/questions/3018595/...
Vous devez vous connecter pour publier un commentaire.
En Ruby,
$stderr
désigne le flux de sortie qui est actuellement utilisé comme stderr, alors queSTDERR
est le par défaut flux stderr. Il est facile d'attribuer temporairement un autre flux de sortie pour$stderr
.Maintenant, vous pouvez effectuer les opérations suivantes:
Le même principe fonctionne également pour les
$stdout
etSTDOUT
.$stderr
en interne. Et si, pour quelque raison que ce soit, il n'est pas le cas (ce qui serait un bug) puis, malheureusement, vous ne serez pas en mesure de faire quelque chose à ce sujet dans votre code Ruby.StringIO
bibliothèque?Ici est un résumé de la solution (crédit va à David Heinemeier Hansson):
Utilisation:
Essentiellement la même chose que @molf réponse, et a le même usage:
Il utilise StringIO très légèrement de façon plus concise, et préserve $stderr comme ce qu'il était avant capture_stderr a été appelé.
J'aime la StringIO réponses. Mais si vous appelez d'un processus externe, et
$stderr = StringIO.new
ne fonctionne pas, vous pouvez écrire stderr dans un fichier temporaire: