Почему команда «>» в ​​консоли Windows не перенаправляет все сообщения в файл?

21

Я пытаюсь построить проект Scala с помощью sbt , поэтому я запускаю команду:

sbt clean test > log.log

Это означает, что любые сообщения, которые инструмент sbt записывает в консоль Windows, должны быть записаны в файл «log.log». Но иногда я получаю стека трассировки записывается в консоль, а не в файл:

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

Почему команда ">" не перенаправляет все сообщения в файл?

вишня
источник

Ответы:

35

То, что вы вставили, - это не стандартный вывод команды (STDOUT), а вывод ошибки команды (STDERR).

Когда вы добавляете «> output_file» в команду, вы только перенаправляете STDOUT в этот файл, а не STDERR.

Если вы хотите вывести ошибки, в тот же файл, что и стандартный вывод, вам нужно использовать

sbt clean test > log.log 2>&1

то, что делает «2> & 1», это говорит о том, что выводит ошибку в то же место, что и стандартный вывод результатов.

Вы также можете сделать что-то вроде этого:

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

Он выведет STDOUT в log.log, а STDERR во второй файл с именем error.log, если вы хотите разделить их.

Смотрите об операторах перенаправления команд

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

rAlen
источник
3
В чем разница между 2>&1вашим ответом и 1<&2ссылкой? Я всегда видел это по-своему, и имеет смысл и другой способ (просто перенаправление «ввода» вместо «вывода», но в остальном выглядит одинаково), но интересно увидеть второй вариант.
Джо
6
семантика ... 2>&1говорит, что вывод из STDERR должен быть перенаправлен на тот же вывод, что и STDOUT. 1<&2говорит, что вывод из STDERR должен использоваться как вход для STDOUT. Оба дают одинаковый результат, и это просто вопрос предпочтений
SeanC
Обратите внимание , что вы должны поставить 2>&1 после> log.log .
smwikipedia