为什么Windows控制台中的“>”命令不能将所有消息重定向到文件?


21

我正在尝试使用sbt构建一个Scala项目,所以我运行了一个命令:

sbt clean test > log.log

这意味着sbt工具写入Windows控制台的所有消息均应写入“ log.log”文件。但是有时我将stacktrace写入控制台而不是写入文件:

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

为什么“>”命令不能将所有消息重定向到文件?

Answers:


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链接之间有什么区别?我一直以您的方式看过它,而另一种方式也很有意义(只是重定向“输入”而不是“输出”,但看起来还是一样),但是看到第二种选择很有趣。
2014年

6
语义... 2>&1是说STDERR的输出应重定向到与STDOUT相同的输出。1<&2就是说STDERR的输出应该用作STDOUT的输入。两者都产生相同的结果,并且只是一个优先事项
SeanC 2014年

需要注意的是,你必须把2>&1 之后> log.log
smwikipedia
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.