您如何計算命令執行的時間?
您如何知道一個正在執行的程序需要多長時間才能完成?
例子:
date; dd bs=1m if=/foo of=bar; date
^此範例只有 1 秒的解析度。
任何外殼都是可以接受的。
使用
time
:$ time longrunningcommand --takeyourtime
time
將作為命令執行命令行的其餘部分(在此範例中longrunningcommand --takeyourtime
),當命令完成時,它將列印經過的時間。範例輸出(bash 內置
time
)$ time longrunningcommand --takeyourtime ... output of longrunningcommand ... real 0m5,020s user 0m0,010s sys 0m0,010s
有趣的資訊是
real 0m5,020s
。這意味著該命令大約需要 5 秒。有關其他數字的更多資訊,請參見此處:https ://stackoverflow.com/questions/556405/what-do-real-user-and-sys-mean-in-the-output-of-time1
time
是大多數 shell 中的內置命令。上面的範例輸出來自內置的 bash。有時您會想要使用“系統時間”。例如,為了避免暫時生成一個 shell。如果您想使用該系統
time
,請這樣做:$ /usr/bin/time longrunningcommand --getsomecoffee $ \time longrunningcommand --callmom $ command time longrunningcommand --mowthelawn
反斜杠在 bash 和其他一些 shell 中有效。
command
適用於大多數外殼。/usr/bin/time
應該一直工作。使用系統的範例輸出
time
:$ /usr/bin/time ./longrunningcommand --callmom ... output of longrunningcommand 0.00user 0.01system 0:06.02elapsed 0%CPU (0avgtext+0avgdata 3656maxresident)k 0inputs+0outputs (0major+1089minor)pagefaults 0swaps
有趣的資訊是
0:06.02elapsed
。這意味著該命令大約需要 6 秒。對於其他數字的含義,請閱讀以下手冊頁time
: http: //man7.org/linux/man-pages/man1/time.1.html你可以改變系統的輸出
time
。用於-p
獲取類似於 shell 內置的輸出time
。$ /usr/bin/time -p sleep 0.5 real 0.50 user 0.00 sys 0.00
用於
-f
編寫自己的格式。%E
是“經過”的部分。那是您通常最感興趣的部分。$ /usr/bin/time -f %E sleep 0.5 0:00.50
shell 內置命令和系統命令的區別不僅僅是輸出的格式。有關更多資訊,請閱讀此處的區別:內置命令與非內置命令有什麼區別?
如何重定向或擷取輸出
展示觀察命令
hellostdoutstderr
:#!/bin/sh sleep 0.5 echo stdout echo stderr >&2
範例呼叫:
$ ./hellostdoutstderr stdout stderr
分別擷取 stdout 和 stderr
$ ./hellostdoutstderr >stdout 2>stderr $ cat stdout stdout $ cat stderr stderr
系統
time
列印到 stderr,因此它在 stderr 重定向中被擷取$ /usr/bin/time ./hellostdoutstderr >stdout 2>stderr $ cat stdout stdout $ cat stderr stderr 0.00user 0.00system 0:00.50elapsed 1%CPU (0avgtext+0avgdata 3672maxresident)k 0inputs+16outputs (0major+311minor)pagefaults 0swaps
您可以告訴系統
time
列印到單獨的文件$ /usr/bin/time -o timeout ./hellostdoutstderr >stdout 2>stderr $ cat stdout stdout $ cat stderr stderr $ cat timeout 0.00user 0.00system 0:00.50elapsed 1%CPU (0avgtext+0avgdata 3676maxresident)k 0inputs+16outputs (0major+309minor)pagefaults 0swaps
time
即使 stdout 和 stderr 被重定向,bash 內置總是列印到終端。這是可能的,因為它是內置的並且可以做任何牠喜歡的事情(在 shell 中)$ time ./hellostdoutstderr >stdout 2>stderr real 0m0,511s user 0m0,005s sys 0m0,006s
(stdout 和 stderr 被擷取但
time
仍然可以列印到 shell)或在這裡:https ://www.cyberciti.biz/faq/unix-linux-time-command-examples-usage-syntax/
時間更複雜的命令你有幾個選項
如果您只想為兩個命令一個接一個地計時
$ time { command1 ; command2 ; }
也適用於管道
$ time { command1 | command2 ; }
對於更複雜的東西
$ time sh -c ' complex command chain '
但請注意引用和其他惡作劇。最好將命令放在腳本文件中:
$ time ./script.sh