เหตุใดผลลัพธ์ของบางโปรแกรมของ Linux จึงไม่ใช่ทั้ง STDOUT และ STDERR
ที่จริงแล้วฉันต้องการทราบวิธีการจับเอาท์พุทของโปรแกรมทั้งหมดอย่างน่าเชื่อถือไม่ว่าจะใช้ 'สตรีม' ปัญหาที่ฉันมีคือบางโปรแกรมดูเหมือนจะไม่ยอมให้มีการบันทึกผลลัพธ์
ตัวอย่างคือคำสั่ง 'เวลา':
time sleep 1 2>&1 > /dev/null
real 0m1.003s
user 0m0.000s
sys 0m0.000s
หรือ
time sleep 1 &> /dev/null
real 0m1.003s
user 0m0.000s
sys 0m0.000s
เหตุใดฉันจึงเห็นเอาต์พุตทั้งสองครั้ง ผมคาดว่ามันทุกคนที่จะได้รับการประปาเข้า/ dev / null
สตรีมเอาต์พุตใดที่ใช้เวลาและฉันจะไพพ์ลงในไฟล์ได้อย่างไร
วิธีหนึ่งในการแก้ไขปัญหาคือสร้างสคริปต์Bashตัวอย่างเช่นcombine.sh
บรรจุคำสั่งนี้:
$@ 2>&1
จากนั้นสามารถบันทึกเอาต์พุตของ 'เวลา' ในวิธีที่ถูกต้อง:
combine.sh time sleep 1 &> /dev/null
(ไม่เห็นเอาต์พุต - ถูกต้อง)
มีวิธีในการบรรลุสิ่งที่ฉันต้องการโดยไม่ใช้สคริปต์การรวมที่แยกต่างหากหรือไม่
2>&1 > /dev/null
หมายถึง "2 ตอนนี้ไปที่ที่ 1 ไป (เช่น terminal โดยปริยาย) จากนั้น 1 ไปที่ / dev / null (แต่ 2 ยังไปที่ terminal!) ใช้>/dev/null 2>&1
เพื่อบอกว่า "1 ไปที่ / dev / null จากนั้น 2 ไปที่ 1 ไป (เช่นไปยัง / dev / null) สิ่งนี้ยังคงไม่ทำงานที่นี่เนื่องจาก 'เวลา' ในตัวจะไม่ถูกเปลี่ยนเส้นทาง แต่โดยทั่วไปจะถูกต้องมากกว่า (ตัวอย่างเช่นจะใช้งานได้หากคุณใช้ / usr / bin / time) คิดเกี่ยวกับ "2> & 1" เป็นการคัดลอก "ทิศทาง" ของ 1 ลงใน 2 ไม่ใช่ 2 ไปที่ 1