ในksh
, bash
และzsh
, time
ไม่ได้เป็นคำสั่ง (ในตัวหรือไม่) มันเป็นคำสงวนในภาษาที่เหมือนหรือfor
while
โดยจะใช้เวลาในการท่อ1
ใน:
time for i in 1 2; do cmd1 "$i"; done | cmd2 > redir
คุณมีไวยากรณ์พิเศษที่บอกให้เชลล์เรียกใช้ไพพ์ไลน์นั้น:
for i in 1 2; do cmd1 "$i"; done | cmd2 > redir
และรายงานสถิติเวลาของมัน
ใน:
time cmd > output 2> error
ก็เหมือนกันคุณเวลาcmd > output 2> error
คำสั่งและสถิติเวลายังคงไปบน stderr เปลือก
คุณต้องการ:
{ time cmd > output 2> error; } 2> timing-output
หรือ:
exec 3>&2 2> timing-output
time cmd > output 2> error 3>&-
exec 2>&3 3>&-
สำหรับ stderr ของเชลล์ที่จะถูกเปลี่ยนทิศทางไปtiming-output
ก่อนการสร้างเวลา (อีกครั้งไม่ใช่คำสั่ง ) จะถูกใช้ (ที่นี่เป็นครั้งคราวcmd > output 2> error 3>&-
)
คุณยังสามารถเรียกใช้time
งานโครงสร้างนั้นในsubshellที่เปลี่ยนเส้นทาง stderr ได้:
(time cmd > output 2> error) 2> timing-output
แต่ไม่จำเป็นต้องใช้ subshell ที่นี่คุณจะต้องเปลี่ยนเส้นทาง stderr ในเวลาที่การtime
สร้างถูกเรียกใช้
ระบบส่วนใหญ่ก็มีtime
คำสั่ง คุณสามารถเรียกใช้อันนั้นโดยปิดการใช้งานtime
คำหลัก สิ่งที่คุณต้องทำคืออ้างว่าคำหลักใดก็ตามที่เป็นคำหลักที่ได้รับการยอมรับเช่นเมื่อตัวอักษร
'time' cmd > output 2> error-and-timing-output
แต่ระวังรูปแบบอาจแตกต่างกันและ stderr ของทั้งสองtime
และcmd
จะถูกรวมเข้าerror-and-timing-output
ด้วยกัน
นอกจากนี้time
คำสั่งซึ่งตรงข้ามกับการtime
สร้างไม่สามารถกำหนดเวลาไปป์ไลน์หรือคำสั่งผสมหรือฟังก์ชันหรือเชลล์บิลด์อิน ...
หากเป็นคำสั่ง builtin มันอาจสามารถกำหนดเวลาการเรียกใช้ฟังก์ชันหรือบิลด์อินได้ แต่ไม่สามารถเปลี่ยนเส้นทางหรือไพพ์ไลน์หรือคำสั่งผสมได้
1ทราบว่าbash
ได้ (สิ่งที่ถือได้ว่าเป็น) ข้อผิดพลาดโดยtime (cmd) 2> file
( แต่ไม่ได้time cmd | (cmd2) 2> file
เป็นต้น) การเปลี่ยนเส้นทางการส่งออกระยะเวลาในการfile
time
/usr/bin/time
อาจมีชุดคำอธิบายหลายชุดที่เกี่ยวข้องที่นี่ (เปลือกของและชุดที่แนบกับtime
กระบวนการ) และอย่าลืมเกี่ยวกับสิ่งที่แสดงโดย()
subshell ( กำลังรอผู้เชี่ยวชาญด้านทุบตี : p)