ในกรณีที่คนจะใช้เปลือกหอยอื่น ๆ กว่าbash, ksh93และzshมีจุดลอย$SECONDSตัวแปรถ้าคุณทำtypeset -F SECONDSซึ่งจะมีประโยชน์ในการวัดเวลาที่มีความแม่นยำ:
$ typeset -F SECONDS=0
$ do-something
something done
$ echo "$SECONDS seconds have elapsed"
18.3994340000 seconds have elapsed
ตั้งแต่เวอร์ชั่น 4.3.13 (2011) zshมี$EPOCHREALTIMEตัวแปรทศนิยมพิเศษในzsh/datetimeโมดูล:
$ zmodload zsh/datetime
$ echo $EPOCHREALTIME
1364401642.2725396156
$ printf '%d\n' $((EPOCHREALTIME*1000))
1364401755993
หมายเหตุว่าของที่ได้มาจากจำนวนเต็มสองจำนวน (ต่อวินาทีและนาโนวินาที) clock_gettime()ส่งกลับโดย ในระบบส่วนใหญ่นั้นมีความแม่นยำมากกว่าdoubleตัวเลขจุดลอยตัวC เดียวดังนั้นคุณจะสูญเสียความแม่นยำเมื่อคุณใช้ในการแสดงออกทางคณิตศาสตร์ (ยกเว้นวันที่ในช่วงสองสามเดือนแรกของปี 1970)
$ t=$EPOCHREALTIME
$ echo $t $((t))
1568473231.6078064442 1568473231.6078064
ในการคำนวณความแตกต่างของเวลาที่มีความแม่นยำสูง (แม้ว่าฉันสงสัยว่าคุณต้องการความแม่นยำมากกว่ามิลลิวินาที) คุณอาจต้องการใช้$epochtimeอาร์เรย์พิเศษแทน (ซึ่งมีวินาทีและนาโนวินาทีเป็นองค์ประกอบแยกสองส่วน)
ตั้งแต่รุ่น 5.7 (2018) strftimeเชลล์ builtin ยังสนับสนุน%Nรูปแบบ nanosecond à la GNU dateและ a %.เพื่อระบุความแม่นยำดังนั้นจำนวนมิลลิวินาทีนับตั้งแต่ยุคสามารถดึงได้ด้วย:
zmodload zsh/datetime
strftime %s%3. $epochtime
(หรือเก็บไว้ในตัวแปรด้วย-s var)