ทำไมคำสั่ง“>” ในคอนโซล Windows ไม่เปลี่ยนเส้นทางข้อความทั้งหมดไปยังไฟล์


21

ฉันกำลังพยายามสร้างโครงการScalaด้วยsbtดังนั้นฉันจึงเรียกใช้คำสั่ง:

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

ทำไมคำสั่ง ">" จึงไม่เปลี่ยนเส้นทางข้อความทั้งหมดเป็นไฟล์?

คำตอบ:


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กับลิงค์คืออะไร ฉันเห็นมันเสมอในแบบของคุณและวิธีอื่นก็สมเหตุสมผลเช่นกัน (เพียงแค่เปลี่ยนเส้นทาง "อินพุต" แทนที่จะเป็น "เอาท์พุท" แต่จะปรากฏเหมือนเดิม) แต่ก็น่าสนใจที่จะเห็นตัวเลือกที่สอง
โจ

6
ซีแมนทิกส์ ... 2>&1กำลังพูดว่าเอาต์พุตจาก STDERR ควรถูกเปลี่ยนเส้นทางไปยังเอาต์พุตเดียวกันกับ STDOUT 1<&2กำลังบอกว่าเอาต์พุตจาก STDERR ควรใช้เป็นอินพุตไปยัง STDOUT ทั้งคู่ให้ผลลัพธ์ที่เหมือนกันและเป็นเรื่องของความชอบ
SeanC

โปรดทราบว่าคุณต้องใส่2>&1 หลังจาก > log.log
smwikipedia
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.