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

Che*_*rry 21 windows console redirection command-line scala

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

sbt clean test > log.log
Run Code Online (Sandbox Code Playgroud)

这意味着 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
Run Code Online (Sandbox Code Playgroud)

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

rAl*_*len 35

您粘贴的不是命令标准输出(STDOUT),而是命令的错误输出(STDERR)。

当您将“> output_file”添加到命令时,您只是将 STDOUT 重定向到该文件,而不是 STDERR。

如果要输出错误,则需要使用与标准输出相同的文件

sbt clean test > log.log 2>&1
Run Code Online (Sandbox Code Playgroud)

“2>&1”的作用是,它表示将错误输出到与标准输出结果相同的位置。

你也可以做这样的事情:

sbt clean test > log.log 2>error.log
Run Code Online (Sandbox Code Playgroud)

如果您想将它们分开,它会将 STDOUT 输出到 log.log,并将 STDERR 输出到名为 error.log 的第二个文件。

请参阅有关命令重定向器运算符的信息

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

  • 语义... `2>&1` 是说 STDERR 的输出应该重定向到与 STDOUT 相同的输出。`1<&2` 表示 STDERR 的输出应该用作 STDOUT 的输入。两者产生相同的结果,只是偏好问题 (6认同)
  • 您的答案中的“2>&1”与链接中的“1<&2”之间有什么区别?我一直以你的方式看待它,另一种方式也有意义(只是重定向“输入”而不是“输出”,但其他方面看起来相同),但看到第二个选择很有趣。 (3认同)