Чому команда ">" на консолі 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


3
Яка різниця між 2>&1вашою відповіддю та 1<&2посиланням? Я завжди бачив це по-своєму, і інший спосіб має сенс також (просто перенаправлення "введення" замість "виведення", але в іншому випадку з'являється те саме), але цікаво бачити другий вибір.
Джо

6
семантика ... 2>&1говорить про те, що вихід з STDERR повинен бути перенаправлений на той же вихід, що і STDOUT. 1<&2говорить, що вихід з STDERR повинен використовуватися як вхід до STDOUT. Обидва дають однаковий результат, і це просто питання переваги
SeanC

Зверніть увагу , що ви повинні поставити 2>&1 після> log.log .
smwikipedia
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.