Pourquoi la commande «>» dans une console Windows ne redirige-t-elle pas tous les messages vers un fichier?

21

J'essaie de construire un projet Scala avec sbt , donc j'exécute une commande:

sbt clean test > log.log

Ce qui signifie que tous les messages que l'outil sbt écrit dans la console Windows doivent être écrits dans le fichier "log.log". Mais parfois, j'obtiens stacktrace écrit sur la console et non dans le fichier:

C:\path>sbt clean test > log.log
java.lang.ExceptionInInitializerError
        at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
        at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
        at scala.concurrent.impl.ExecutionContextImpl$AdaptedForkJoinTask.exec(ExecutionContextImpl.scala:121)
        at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
        at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
        at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
        at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
Caused by: java.lang.ClassCastException: Class org.infinispan.configuration.parsing.Parser60 does not implement org.infinispan.configuration.parsing.ConfigurationParser

Pourquoi la commande ">" ne redirige-t-elle pas tous les messages vers un fichier?

Cerise
la source

Réponses:

35

Ce que vous avez collé n'est pas une sortie standard de commande (STDOUT), mais une sortie d'erreur de la commande (STDERR).

Lorsque vous ajoutez "> fichier_sortie" à la commande, vous redirigez uniquement STDOUT vers ce fichier, pas STDERR.

Si vous souhaitez générer des erreurs, dans le même fichier que la sortie standard, vous devez utiliser

sbt clean test > log.log 2>&1

ce que "2> & 1" fait, c'est, dit-il, d'envoyer l'erreur au même endroit que les résultats de sortie standard.

Vous pouvez également faire quelque chose comme ceci:

sbt clean test > log.log 2>error.log

Il affichera STDOUT dans log.log et STDERR dans le deuxième fichier appelé error.log, si vous souhaitez les séparer.

Voir ceci à propos des opérateurs de redirecteur de commandes

http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/redirection.mspx?mfr=true

rAlen
la source
3
Quelle est la différence entre 2>&1votre réponse et 1<&2le lien? Je l'ai toujours vu comme vous le souhaitez, et l'autre sens a également du sens (rediriger simplement "entrée" au lieu de "sortie" mais apparaissant de la même manière), mais il est intéressant de voir le deuxième choix.
Joe
6
sémantique ... 2>&1dit que la sortie de STDERR devrait être redirigée vers la même sortie que STDOUT. 1<&2dit que la sortie de STDERR doit être utilisée comme entrée pour STDOUT. Les deux produisent le même résultat et sont simplement une question de préférence
SeanC
Notez que vous devez mettre 2>&1 après le > log.log.
smwikipedia