Por que o comando ">" no console do Windows não redireciona todas as mensagens para um arquivo?

21

Estou tentando criar um projeto Scala com sbt , então eu executo um comando:

sbt clean test > log.log

O que significa que todas as mensagens que a ferramenta sbt grava no console do Windows devem ser gravadas no arquivo "log.log". Mas às vezes eu recebo o stacktrace gravado no console e não no arquivo:

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

Por que o comando ">" não redireciona todas as mensagens para um arquivo?

cereja
fonte

Respostas:

35

O que você colou não é a saída padrão do comando (STDOUT), mas a saída de erro do comando (STDERR).

Quando você adiciona "> output_file" ao comando, você está redirecionando apenas STDOUT para esse arquivo, não STDERR.

Se você deseja gerar erros, no mesmo arquivo que a saída padrão, use

sbt clean test > log.log 2>&1

o que "2> & 1" faz, é, ele diz que gera erro no mesmo local que os resultados de saída padrão.

Você também pode fazer algo assim:

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

Ele produzirá STDOUT para log.log e STDERR para o segundo arquivo chamado error.log, se você desejar separá-los.

Veja isso sobre operadores de redirecionador de comando

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

rAlen
fonte
3
Qual é a diferença entre a 2>&1sua resposta e 1<&2o link? Eu sempre vi do seu jeito, e o outro caminho também faz sentido (apenas redirecionando "entrada" em vez de "saída", mas aparentando o mesmo), mas é interessante ver a segunda opção.
Joe
6
semântica ... 2>&1está dizendo que a saída de STDERR deve ser redirecionada para a mesma saída que STDOUT. 1<&2está dizendo que a saída de STDERR deve ser usada como uma entrada para STDOUT. Ambos produzem o mesmo resultado e são simplesmente uma questão de preferência #
SeanC
Observe que você deve colocar 2>&1 após o > log.log.
smwikipedia