รับดังต่อไปนี้:
C:\>perl -E " say STDOUT 111; say STDERR 222; say STDOUT 333; "
111
222
333
C:\>perl -E " say STDOUT 111; say STDERR 222; say STDOUT 333; " | cat
222
111
333
ลำดับของเอาต์พุตไม่ถูกสงวนไว้เมื่อคำสั่ง piping เนื่องจาก stdout ถูกบัฟเฟอร์และ stderr ถูกยกเลิกการบัฟเฟอร์ stdout สามารถเชื่อถือได้อย่างไรเพื่อให้คำสั่งนั้นถูกเก็บไว้เมื่อไพพ์คำสั่ง?
ฉันค้นหาทั่วพยายามหาวิธีแก้ปัญหาฉันลองใช้สคริปต์เช่นunbuffer
จากexpect
แพคเกจใน cygwin และ Linux แต่ใช้งานได้เฉพาะภายใน Cygwin (ด้านนอกของมันในที่ดินเปล่า cmd.exe คำสั่งยังไม่ถูกต้อง stderr ยังมาเร็วกว่าที่คาด) เหมือนกันstdbuf -i0 -o0 -e0 ...
ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมาก.
C:\>perl -E " say STDOUT 111; say STDERR 222; say STDOUT 333; " 2>&1 | cat
=>222 111 333
perl
Windows ก็ไม่ง่ายที่จะทดสอบ ฉันเดาว่าเป็นเพราะทั้งสองสตรีมเอาต์พุตถูกบัฟเฟอร์และเอาต์พุตถูกสร้างขึ้นเฉพาะเมื่อปิดทั้งคู่ซึ่งในกรณีนี้การสั่งซื้อจะขึ้นอยู่กับลำดับของการปิดไฟล์ ในโปรแกรม C คุณสามารถตั้งค่าสตรีมเอาท์พุทให้เป็นแบบไม่มีบัฟเฟอร์หรือโปรแกรมต่อfflush
จากfputs
นั้น แต่ฉันไม่ทราบว่าเป็นไปได้หรือไม่perl
- อาจจะเรียกใช้ฟังก์ชัน C เพื่อทำมัน
stdout
ข้อความล่าช้าโดยถูกส่งไปยังcat
ในขณะที่ข้อความจะstderr
ถูกเขียนโดยตรงไปยังเทอร์มินัลเมื่อสร้างขึ้น ทางออกที่ง่ายที่สุดที่จะเปลี่ยนเส้นทางstderr
ไปยังท่อก่อนที่จะเป็นในstdout
... 2>&1 | cat
มีวิธีการเพื่อให้มั่นใจว่าการทำงานไม่เป็นจะขัดขวางการดำเนินการของcat
perl