ฉันได้สำรวจคำถามที่คล้ายกันเกือบทั้งหมดที่ มีอยู่ แล้วเพื่อประโยชน์
ให้ฉันอธิบายปัญหาโดยละเอียด:
ฉันรันสคริปต์ที่ไม่ต้องใส่ข้อมูลบางส่วนและสิ่งเหล่านี้สามารถสร้างเอาต์พุตมาตรฐานและบรรทัดข้อผิดพลาดมาตรฐานได้ฉันต้องการจับภาพพวกเขาตามลำดับที่ถูกต้องตามที่แสดงโดยเทอร์มินัลอีมูเลเตอร์แล้วเพิ่มคำนำหน้าเช่น "STDERR:" และ "STDOUT:"
ฉันได้ลองใช้ไพพ์และแม้กระทั่งวิธีที่อิงจากพวกมันเพื่อประโยชน์แล้ว ฉันคิดว่าวิธีการแก้ปัญหาคือการใช้ pty แม้ว่าฉันจะไม่มีความเชี่ยวชาญในเรื่องนั้น ฉันได้แอบมองเข้าไปในซอร์สโค้ดของVTE ของ Gnomeแต่ก็ไม่ได้มีประโยชน์อะไรมาก
เป็นการดีที่ฉันจะใช้Goแทน Bash เพื่อทำสิ่งนี้ แต่ฉันไม่สามารถทำได้ ดูเหมือนว่าท่อโดยอัตโนมัติห้ามการสั่งซื้อบรรทัดที่ถูกต้องเพราะบัฟเฟอร์
มีใครบางคนที่สามารถทำสิ่งที่คล้ายกันได้หรือไม่? หรือเป็นไปไม่ได้เลยเหรอ? ฉันคิดว่าถ้าเทอร์มินัลอีมูเลเตอร์สามารถทำได้มันอาจไม่ใช่ - โดยการสร้างโปรแกรม C ขนาดเล็กที่จัดการ PTY แตกต่างกันหรือไม่
นึกคิดฉันจะใช้อินพุตแบบอะซิงโครนัสเพื่ออ่านสตรีม 2 รายการ (STDOUT และ STDERR) จากนั้นพิมพ์อีกครั้งตามความต้องการของฉัน แต่ลำดับของอินพุตเป็นสิ่งสำคัญ!
หมายเหตุ:ฉันทราบถึงstderredแต่มันไม่ได้ผลสำหรับฉันกับสคริปต์ Bash และไม่สามารถแก้ไขเพื่อเพิ่มคำนำหน้าได้อย่างง่ายดาย (เนื่องจากโดยทั่วไปแล้วจะมี syscalls มากมาย)
อัปเดต:เพิ่มด้านล่างสองส่วน
(สามารถเพิ่มการหน่วงเวลาย่อยวินาทีที่สองในสคริปต์ตัวอย่างที่ฉันให้ไว้เพื่อพิสูจน์ผลลัพธ์ที่สอดคล้องกัน)
อัปเดต:วิธีแก้ปัญหาสำหรับคำถามนี้จะช่วยแก้ปัญหาอื่น ๆตามที่ @Gilles ระบุ อย่างไรก็ตามฉันได้ข้อสรุปว่ามันเป็นไปไม่ได้ที่จะทำสิ่งที่ถามที่นี่และที่นั่น เมื่อใช้2>&1
ทั้งสองกระแสจะถูกรวมอย่างถูกต้องที่ระดับ pty / pipe แต่การใช้กระแสแยกต่างหากและในลำดับที่ถูกต้องอย่างใดอย่างหนึ่งควรใช้วิธีการของstderredที่ involes syscall hooking และสามารถมองเห็นว่าสกปรกในหลาย ๆ
ฉันจะกระตือรือร้นที่จะอัปเดตคำถามนี้หากใครบางคนสามารถปิดการใช้งานดังกล่าวข้างต้น