ในksh, bashและzsh, timeไม่ได้เป็นคำสั่ง (ในตัวหรือไม่) มันเป็นคำสงวนในภาษาที่เหมือนหรือforwhile
โดยจะใช้เวลาในการท่อ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)