ฉันต้องการตัวจับเวลาซึ่งจะเริ่มในตอนต้นของสคริปต์และหยุดในตอนท้าย
time yourprogram.shที่ @Marius Cotofana อธิบาย
ฉันต้องการตัวจับเวลาซึ่งจะเริ่มในตอนต้นของสคริปต์และหยุดในตอนท้าย
time yourprogram.shที่ @Marius Cotofana อธิบาย
คำตอบ:
หากคุณต้องการระยะเวลาเป็นวินาทีที่การใช้งานสูงสุด
start=$SECONDS
และในตอนท้าย
duration=$(( SECONDS - start ))
คุณสามารถใช้timeคำสั่งในตัวของ Linux จากหน้าคน:
เวลา COMMAND [อาร์กิวเมนต์]
เวลากำหนดว่าข้อมูลใดที่จะแสดงเกี่ยวกับทรัพยากรที่ใช้โดยคำสั่งจากสตริงรูปแบบ หากไม่มีการระบุรูปแบบบนบรรทัดคำสั่ง แต่ตั้งค่าตัวแปรสภาพแวดล้อม TIME ค่าจะถูกใช้เป็นรูปแบบ
ในการกำหนดเวลาcleanup.shสคริปต์ให้ใช้:
$ time cleanup.sh
timeคุณกำลังใช้ hackernoon.com/…
ฉันรู้ว่านี่เป็นคำถามที่ค่อนข้างเก่า แต่นี่เป็นวิธีที่ฉันทำเพื่อทุกสิ่งเมื่อฉันต้องการ / จำเป็นต้องรู้ว่าจะต้องใช้เวลานานแค่ไหน
Bash มีตัวจับเวลาวินาทีในตัวในรูปแบบของตัวแปรภายในชื่อSECONDS(ดู: ที่นี่สำหรับตัวแปรภายในอื่น ๆ )
ใส่ SECONDS=0ก่อนสิ่งที่คุณกำลังตรวจสอบเวลาทำงานของ จะต้องอยู่หลังการป้อนข้อมูลของผู้ใช้เพื่อให้ได้ผลลัพธ์ที่ดีดังนั้นหากคุณได้รับพร้อมท์สำหรับข้อมูลให้วางไว้หลังพรอมต์
จากนั้นให้ใส่ส่วนท้ายของสิ่งที่คุณกำลังตรวจสอบ:
if (( $SECONDS > 3600 )) ; then
let "hours=SECONDS/3600"
let "minutes=(SECONDS%3600)/60"
let "seconds=(SECONDS%3600)%60"
echo "Completed in $hours hour(s), $minutes minute(s) and $seconds second(s)"
elif (( $SECONDS > 60 )) ; then
let "minutes=(SECONDS%3600)/60"
let "seconds=(SECONDS%3600)%60"
echo "Completed in $minutes minute(s) and $seconds second(s)"
else
echo "Completed in $SECONDS seconds"
fi
หากคุณต้องการทราบเวลาเป็นวินาทีเท่านั้นคุณสามารถลดความซับซ้อนของด้านบนเป็น:
echo "Completed in $SECONDS seconds"
ตัวอย่างเช่น:
read -rp "What's your name? " "name"
SECONDS=0
echo "Hello, $name"
if (( $SECONDS > 3600 )) ; then
let "hours=SECONDS/3600"
let "minutes=(SECONDS%3600)/60"
let "seconds=(SECONDS%3600)%60"
echo "Completed in $hours hour(s), $minutes minute(s) and $seconds second(s)"
elif (( $SECONDS > 60 )) ; then
let "minutes=(SECONDS%3600)/60"
let "seconds=(SECONDS%3600)%60"
echo "Completed in $minutes minute(s) and $seconds second(s)"
else
echo "Completed in $SECONDS seconds"
fi
date +%T -d "1/1 + $SECONDS sec"(จำกัด ให้น้อยกว่า 24 ชั่วโมง แต่คุณสามารถปรับตัวเพื่อเพิ่มวันได้เช่นกัน)
#!/bin/bash
start=$(date +%s)
#
# do something
sleep 10
#
#
end=$(date +%s)
seconds=$(echo "$end - $start" | bc)
echo $seconds' sec'
echo 'Formatted:'
awk -v t=$seconds 'BEGIN{t=int(t*1000); printf "%d:%02d:%02d\n", t/3600000, t/60000%60, t/1000%60}'
@anask แก้ปัญหาที่ชาญฉลาดสำหรับคำตอบนี้ฉันแนะนำให้ใช้ native $SECONDSแทนการสร้างคำตอบใหม่
awk -v t=$SECONDS 'BEGIN{t=int(t*1000); printf "Elapsed Time (HH:MM:SS): %d:%02d:%02d\n", t/3600000, t/60000%60, t/1000%60}'
วัตถุประสงค์ของการprintfและการหารคือการแปลงวินาทีที่ผ่านไปเป็นชั่วโมงเอกภาพสอดคล้อง Mins, Secs ตามลำดับ
timeคำสั่ง (time ./script.sh) เพื่อพิมพ์dateคำสั่งใช้เวลาปัจจุบันและอื่น ๆ