ฉันจะเปลี่ยนทิศทางเอาต์พุต "time" และเอาต์พุตคำสั่งไปยังไพพ์เดียวกันได้อย่างไร


24

fooสมมติว่าฉันมีไบนารีที่เรียกว่า

หากฉันต้องการเปลี่ยนเส้นทางผลลัพธ์fooไปยังกระบวนการอื่นbarฉันสามารถเขียน./foo | barได้

ในทางกลับกันถ้าฉันต้องการtimefoo และเปลี่ยนเส้นทางผลลัพธ์ของtimeฉันสามารถเขียน, time (./foo) | bar.

คำถามของฉันคือฉันจะติดเอาท์พุทของtimeไปยังจุดสิ้นสุดของการส่งออกfooและท่อผ่านท่อเดียวกันได้อย่างไร

วิธีการแก้ปัญหาต่อไปนี้เป็นไม่ได้สิ่งที่ฉันกำลังมองหาเพราะมันเริ่มต้นสองกรณีแยกต่างหากของกระบวนการในขณะที่ฉันต้องการท่อที่ใช้ร่วมกันเดียวกับเช่นเดียวของbarbar

time (./foo | bar)  | bar

สำหรับผู้ที่อยากรู้อยากเห็นเหตุผลที่ไม่ต้องการเริ่มต้นสองอินสแตนซ์ของbarเพราะbarเป็นเครือข่ายลูกค้าและฉันต้องการข้อมูลเวลาที่จะถูกส่งไปยังเซิร์ฟเวอร์เป็นส่วนหนึ่งของhttp POSTข้อความเดียวกันเป็นผลลัพธ์ของกระบวนการ


ตอบที่นี่คำตอบที่ค่อนข้างดีกว่า: stackoverflow.com/questions/13356628/…
JDS

คำตอบ:


29

ถ้าฉันเข้าใจสิ่งที่คุณขอฉันจะทำ ผมใช้คำสั่งls ~และteeเป็นขาตั้ง-ins สำหรับ./fooและbarแต่รูปแบบทั่วไปของสิ่งที่คุณต้องการคือ:

$ ( time ./foo ) |& bar

หมายเหตุ:การส่งออกของtimeกำลังถูกแนบมาในตอนท้ายของการส่งออกใด ๆ./fooก็เป็นเพียงการดำเนินการใน STDERR ในการเปลี่ยนเส้นทางผ่านไพพ์คุณต้องรวม STDERR กับ STDOUT คุณสามารถใช้อย่างใดอย่างหนึ่ง|&หรือ2>&1เพื่อทำเช่นนั้น

$ ( time ./foo ) |& bar

-or-

$ ( time ./foo ) 2>&1 | bar

ตัวอย่าง

$ ( time ls . ) |&  tee cmd.log
cmd.log
file1
file2
file3
file4
file5

real    0m0.005s
user    0m0.000s
sys     0m0.001s

และนี่คือเนื้อหาของแฟ้มที่ผลิตโดยcmd.logtee

$ more cmd.log 
cmd.log
file1
file2
file3
file4
file5

real    0m0.005s
user    0m0.000s
sys     0m0.001s

โปรดทราบว่าไวยากรณ์นี้ใช้ไม่ได้กับ BASH
jvriesem

1
@jvriesem ตัวอย่างทั้งหมดมาจาก bash
slm

9

timeส่งเอาต์พุตไปที่ stderr แทนที่จะเป็น stdout โดยค่าเริ่มต้น คุณเพียงแค่ต้องเปลี่ยนเส้นทางที่คุณต้องการ

คุณพูดว่า"ในทางกลับกันถ้าฉันอยากจะtimeฟูและเปลี่ยนเส้นทางการส่งออกของtimeฉันสามารถเขียนtime (./foo) | barได้" แต่นี่ไม่ถูกต้องจริง ในกรณีนี้เอาต์พุตของเวลาจะยังคงปรากฏบนคอนโซลของคุณเฉพาะ stdout เท่านั้นที่จะถูกเปลี่ยนเส้นทาง

คุณสามารถเปลี่ยนเส้นทาง stderr โดยเฉพาะกับ:

(time foo) 2>&1 | bar

หรือท่อทั้งหมดที่มี:

(time foo) |& bar

วงเล็บปีกกาจำเป็นสำหรับการทำงานอย่างถูกต้อง


0

ฉันพบว่ามันใช้งานได้กับ Solaris (time ls) &> file


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