ฉันพยายามเปลี่ยนทิศทางผลลัพธ์ของคำสั่งเวลา แต่ไม่สามารถ:
$time ls > filename
real 0m0.000s
user 0m0.000s
sys 0m0.000s
ในไฟล์ฉันเห็นผลลัพธ์ของls
คำสั่งไม่ใช่ของtime
. โปรดอธิบายว่าทำไมฉันถึงทำไม่ได้และทำอย่างไร
ฉันพยายามเปลี่ยนทิศทางผลลัพธ์ของคำสั่งเวลา แต่ไม่สามารถ:
$time ls > filename
real 0m0.000s
user 0m0.000s
sys 0m0.000s
ในไฟล์ฉันเห็นผลลัพธ์ของls
คำสั่งไม่ใช่ของtime
. โปรดอธิบายว่าทำไมฉันถึงทำไม่ได้และทำอย่างไร
คำตอบ:
คุณสามารถเปลี่ยนเส้นทางเอาต์พุตเวลาโดยใช้
(time ls) &> file
เนื่องจากคุณต้องใช้ (time ls) เป็นคำสั่งเดียวจึงจะใช้วงเล็บปีกกาได้
&>
เกี่ยวกับเรื่องนี้ฉันสามารถเรียนรู้เกี่ยวกับสิ่งเหล่านี้ได้ที่ไหน
&>file
คล้ายกับ>file 2>&1
. มันกำกับทั้ง stdout และ stderr
ไม่จำเป็นต้องเปิดเชลล์ย่อย ใช้บล็อกรหัสจะทำเช่นกัน
{ time ls; } 2> out.txt
หรือ
{ time ls > /dev/null 2>&1 ; } 2> out.txt
2>
กรุณา ฉันจะเรียนรู้สิ่งเหล่านี้ได้ที่ไหน
เวลาคำสั่งจะส่งเอาต์พุตไปยัง STDERR (แทน STDOUT) นั่นเป็นเพราะคำสั่งที่ดำเนินการตามเวลาตามปกติ (ในกรณีนี้คือ ls) ส่งออกเป็น STDOUT
หากคุณต้องการบันทึกผลลัพธ์ของเวลาให้พิมพ์:
(time ls) 2> filename
ที่จับเฉพาะเอาต์พุตของเวลา แต่เอาต์พุตของ ls ไปที่คอนโซลเป็นปกติ หากคุณต้องการจับภาพทั้งสองในไฟล์เดียวให้พิมพ์:
(time ls) &> filename
2> เปลี่ยนเส้นทาง STDERR &> เปลี่ยนเส้นทางทั้งสอง
เวลาเป็นเชลล์ในตัวและฉันไม่แน่ใจว่ามีวิธีเปลี่ยนเส้นทางหรือไม่ อย่างไรก็ตามคุณสามารถใช้
/usr/bin/time
แทนได้ซึ่งยอมรับการเปลี่ยนเส้นทางเอาต์พุตอย่างแน่นอน
bash time mycmd 2>file
เมื่อต้องการเปลี่ยนเส้นทางเวลาในตัวผมเชื่อว่าคุณจะต้องทำสิ่งที่ชอบ หรือเรียก/usr/bin/time
ตามที่กล่าวมา
สาเหตุที่ดูเหมือนว่าการเปลี่ยนเส้นทางใช้งานไม่ได้time
คือมันเป็นคำสงวน bash (ไม่ใช่ builtin!) เมื่อใช้หน้าไปป์ไลน์ ทุบตี (1):
หากคำสงวนเวลานำหน้าไปป์ไลน์เวลาที่ผ่านไปเช่นเดียวกับเวลาของผู้ใช้และระบบที่ใช้โดยการดำเนินการจะถูกรายงานเมื่อไปป์ไลน์สิ้นสุดลง
ดังนั้นหากต้องการเปลี่ยนเส้นทางเอาต์พุตtime
ให้ใช้วงเล็บปีกกา:
{ time ls; } 2> filename
หรือโทร/usr/bin/time
:
/usr/bin/time ls 2> filename
หากคุณไม่ต้องการผสมเอาต์พุตจากtime
และคำสั่ง ด้วยเวลา GNU คุณสามารถใช้-o file
เช่น:
/usr/bin/time -o tim grep -e k /tmp 1>out 2>err
ในขณะที่tim
เป็นผลลัพธ์ของเวลาout
และerr
มี stdout และ stderr grep
จาก
ฉันใช้วิธีการเปลี่ยนเส้นทางของ stdout และ stderr กับวงเล็บปีกกาสำหรับการทดสอบ หมายถึงนี้แต่สั้น
วงเล็บปีกกาจะดำเนินการคำสั่งในเชลล์ปัจจุบัน ดู: man bash&>>rpt
>>rpt 2>&1
{ time ls a*; } &>>rpt