Warum leitet der Befehl ">" in einer Windows-Konsole nicht alle Nachrichten in eine Datei um?

21

Ich versuche, ein Scala- Projekt mit sbt zu erstellen , daher führe ich einen Befehl aus:

sbt clean test > log.log

Das bedeutet, dass alle Nachrichten, die das sbt-Tool in die Windows-Konsole schreibt, in die Datei "log.log" geschrieben werden sollten. Aber manchmal bekomme ich Stacktrace auf die Konsole geschrieben und nicht in die Datei:

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

Warum leitet der Befehl ">" nicht alle Nachrichten in eine Datei um?

Kirsche
quelle

Antworten:

35

Was Sie eingefügt haben, ist nicht die Befehlsstandardausgabe (STDOUT), sondern die Fehlerausgabe des Befehls (STDERR).

Wenn Sie dem Befehl "> output_file" hinzufügen, leiten Sie STDOUT nur in diese Datei um, nicht in STDERR.

Wenn Sie Fehler ausgeben möchten, müssen Sie dieselbe Datei wie die Standardausgabe verwenden

sbt clean test > log.log 2>&1

"2> & 1" bewirkt, dass der Fehler an derselben Stelle ausgegeben wird wie die Standardausgabeergebnisse.

Sie können auch Folgendes tun:

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

Es gibt STDOUT in log.log und STDERR in die zweite Datei mit dem Namen error.log aus, wenn Sie sie trennen möchten.

Informationen zu Befehlsumleitungsoperatoren finden Sie hier

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

rAlen
quelle
3
Was ist der Unterschied zwischen 2>&1Ihrer Antwort und 1<&2dem Link? Ich habe es immer so gesehen, und der andere Weg macht auch Sinn (nur "Eingabe" statt "Ausgabe" umleiten, aber ansonsten gleich aussehen), aber es ist interessant, die zweite Wahl zu sehen.
Joe
6
Semantik ... 2>&1besagt, dass die Ausgabe von STDERR an dieselbe Ausgabe wie STDOUT umgeleitet werden soll. 1<&2bedeutet, dass die Ausgabe von STDERR als Eingabe für STDOUT verwendet werden sollte. Beide produzieren das gleiche Ergebnis und sind einfach eine Frage der Präferenz
SeanC
Beachten Sie, dass Sie 2>&1 nach dem setzen müssen > log.log.
smwikipedia