Mengapa perintah ">" di konsol Windows tidak mengalihkan semua pesan ke file?

21

Saya mencoba membangun proyek Scala dengan sbt , jadi saya menjalankan perintah:

sbt clean test > log.log

Yang berarti bahwa setiap pesan yang ditulis oleh alat sbt ke konsol Windows harus ditulis ke file "log.log". Tapi kadang-kadang saya mendapatkan stacktrace yang ditulis ke konsol dan tidak ke dalam file:

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

Mengapa ">" perintah tidak mengalihkan semua pesan ke file?

ceri
sumber

Jawaban:

35

Apa yang telah Anda tempel bukanlah output standar perintah (STDOUT), tetapi output kesalahan dari perintah (STDERR).

Ketika Anda menambahkan "> output_file" ke perintah, Anda hanya mengarahkan STDOUT ke file itu, bukan STDERR.

Jika Anda ingin menghasilkan kesalahan, ke file yang sama dengan output standar yang perlu Anda gunakan

sbt clean test > log.log 2>&1

apa "2> & 1" tidak, adalah, ia mengatakan kesalahan output ke tempat yang sama dengan hasil keluaran standar.

Anda juga dapat melakukan sesuatu seperti ini:

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

Ini akan menampilkan STDOUT ke log.log, dan STDERR ke file kedua yang disebut error.log, jika Anda ingin memisahkannya.

Lihat ini tentang operator pengalih perintah

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

rAlen
sumber
3
Apa perbedaan antara 2>&1dari jawaban Anda, dan 1<&2dari tautannya? Saya selalu melihatnya dengan cara Anda, dan cara lain juga masuk akal (hanya mengarahkan "input" alih-alih "output" tetapi sebaliknya tampak sama), tetapi menarik untuk melihat pilihan kedua.
Joe
6
semantik ... 2>&1mengatakan bahwa output dari STDERR harus diarahkan ke output yang sama dengan STDOUT. 1<&2mengatakan bahwa output dari STDERR harus digunakan sebagai input ke STDOUT. Keduanya menghasilkan hasil yang sama, dan hanya masalah preferensi
SeanC
Perhatikan bahwa, Anda harus menempatkan 2>&1 setelah itu > log.log.
smwikipedia