ทำไมรูปแบบผลลัพธ์ของเวลาแตกต่างกันไปขึ้นอยู่กับวิธีที่ฉันเรียกมัน


14

อาจเป็นคำถามของมือใหม่ แต่ฉันไม่เข้าใจว่าการกำหนดค่านี้เป็นอย่างไรและสาเหตุที่รูปแบบเอาต์พุตของtimeคำสั่งแตกต่างกันในสองกรณีนี้:

หากใช้ผ่านtimeเอาต์พุตจะมีสามแถวพร้อมข้อมูลพื้นฐาน

$ time sleep 1

real    0m1.003s
user    0m0.000s
sys     0m0.000s

จากนั้นฉันสามารถตรวจสอบว่ามีการใช้ไบนารีใด

$ which time
/usr/bin/time

และเรียกมันโดยตรงเพื่อให้ได้ผลลัพธ์ในรูปแบบที่แตกต่างอย่างสิ้นเชิงพร้อมข้อมูลเพิ่มเติมอีกมากมาย

$ /usr/bin/time sleep 1
0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 2000maxresident)k
0inputs+0outputs (0major+77minor)pagefaults 0swaps

ไม่มีนามแฝงที่เกี่ยวข้องกับ time

$ alias | grep time
$ 

Ubuntu 16.04ฉันทำงาน


ซึ่งเป็นสาเหตุที่whichไม่มีประโยชน์โดยทั่วไป ...
Bakuriu

คำตอบ:


23

อันแรกคือbashคีย์เวิร์ดบิวด์อินของตัวเองtime(คอมไพล์ด้วยbash) และอันที่สองคือเอ็กซีคิ้วท์ภายนอกtime( /usr/bin/timeมาพร้อมกับtimeแพ็คเกจ)

นอกจากนี้whichไม่สามารถแสดงคำสั่งหรือคำหลักในตัวของเชลล์ได้เมื่อคุณค้นหาPATHคุณจำเป็นต้องใช้คำสั่งtypeนั้น การเป็นเชลล์ในตัวเองtypeสามารถตรวจสอบเอนทิตีภายในของเชลล์เพิ่มเติม (และPATH) ได้ดังนั้นคุณสามารถเห็นความแตกต่างโดย:

type -a time

ที่นี่:

$ type -a time
time is a shell keyword
time is /usr/bin/time

timeคนแรกที่จะดำเนินการถ้าคุณเพียงแค่ใช้ นอกจากนี้คุณยังสามารถรับสิ่งที่กำลังดำเนินการโดยใช้type(โดยไม่ต้อง-a):

type time

การ-aบอกtypeให้ค้นหาในเอนทิตีภายในของเชลล์และในการPATHค้นหาเช่นในแหล่งที่เป็นไปได้ทั้งหมด

หากด้วยเหตุผลบางอย่างที่คุณต้องการจากภายนอกใช้หนึ่งใน:

\time
"time"
'time'
command time

อาฉันเห็นแล้วwhichไม่คิดว่าบิลด์อินล่ะ? และฉันควรตรวจสอบtype -aก่อนเสมอ ที่จริงแล้วมันดูtypeดีกว่าwhichเพราะมันส่งออกตำแหน่ง/usr/bin/timeเช่นกัน
xaxa

@xaxa ใช่ตรวจสอบการแก้ไขของฉัน
heemayl

ขอบคุณสำหรับคำตอบอย่างละเอียด! แล้วมีwhichประโยชน์อย่างไร
xaxa

1
@xaxa typeนั้นยอดเยี่ยมจริง ๆ --- ถ้าคุณใช้ bash กระสุนอื่นอาจไม่มีtypebulitin หรือtimebuiltin
jpaugh

2
@jpaugh ไม่ถูกต้อง POSIX ช่วยให้timeจะเป็นภายนอกเท่านั้น แต่ไม่ได้type, typeสามารถใช้ได้ในทุกเปลือกหอยตามมาตรฐาน POSIX
heemayl

4

ความแตกต่างอีกอย่างหนึ่งระหว่าง builtin และยูทิลิตี้ภายนอกคือว่า builtin ของ Bash time จะใช้เวลาในการทำ pipelinesหรือการเรียกไปยังฟังก์ชัน shell (ดูเหมือนจะเป็นลูป แต่ดูเหมือนว่าคู่มือจะไม่ได้สัญญา) ภายนอกtimeไม่สามารถเนื่องจากอยู่นอกเชลล์ไม่ทราบเกี่ยวกับรหัสที่อยู่รอบ ๆ

bash$ time echo blah | sleep 3
real    0m3.002s
...
bash$ /usr/bin/time echo blah | sleep 3
0.00user 0.00system 0:00.00elapsed ?%CPU 
...
bash$ time for x in 1 2 3 ; do sleep 1 ; done
real    0m3.006s
...

แม้ว่าเวลาจะถูกระบุในมาตรฐาน แต่ก็ไม่มีการระบุว่าควรทำอย่างไรในการวางท่อดังนั้นการใช้งานภายในที่มีประสิทธิภาพยิ่งขึ้นเช่นนี้เป็นไปได้

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