Dlaczego polecenie „>” w konsoli Windows nie przekierowuje wszystkich wiadomości do pliku?

21

Próbuję zbudować projekt Scala za pomocą sbt , więc uruchamiam polecenie:

sbt clean test > log.log

Co oznacza, że ​​wszelkie komunikaty, które narzędzie sbt zapisuje na konsoli Windows, powinny zostać zapisane w pliku „log.log”. Ale czasami dostaję stos śledzenia śledzenia do konsoli, a nie do pliku:

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

Dlaczego polecenie „>” nie przekierowuje wszystkich wiadomości do pliku?

wiśnia
źródło

Odpowiedzi:

35

To, co wkleiłeś, nie jest standardowym wyjściem polecenia (STDOUT), ale wyjściem błędu polecenia (STDERR).

Gdy dodajesz do polecenia „> plik_wyjściowy”, przekierowujesz tylko STDOUT do tego pliku, a nie STDERR.

Jeśli chcesz wyprowadzać błędy, musisz użyć tego samego pliku, co standardowe wyjście

sbt clean test > log.log 2>&1

to, co robi „2> i 1”, polega na wypisywaniu błędu w to samo miejsce, co standardowe wyniki wyjściowe.

Możesz także zrobić coś takiego:

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

Wyśle STDOUT do log.log, a STDERR do drugiego pliku o nazwie error.log, jeśli chcesz je rozdzielić.

Zobacz to o operatorach readresatora poleceń

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

rAlen
źródło
3
Jaka jest różnica między 2>&1odpowiedzią a 1<&2linkiem? Zawsze widziałem to po swojemu, a drugi sposób również ma sens (przekierowanie „danych wejściowych” zamiast „danych wyjściowych”, ale poza tym wygląda tak samo), ale interesujący jest drugi wybór.
Joe
6
semantyka ... 2>&1mówi, że wyjście z STDERR powinno zostać przekierowane do tego samego wyjścia, co STDOUT. 1<&2mówi, że dane wyjściowe z STDERR powinny być użyte jako dane wejściowe do STDOUT. Oba dają ten sam wynik i są po prostu kwestią preferencji
SeanC
Należy pamiętać, że należy umieścić 2>&1 po> log.log .
smwikipedia,