
這可能是新手的問題,但我不明白這是如何配置的以及為什麼time
在這兩種情況下命令的輸出格式不同:
如果使用 via 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
。
答案1
第一個是bash
自己的內建關鍵字time
(用 編譯bash
),第二個是外部執行檔time
(/usr/bin/time
隨time
套件一起提供)。
另外,which
無法顯示 shell 的內建命令或關鍵字,因為它只是搜索PATH
,您需要使用type
它。作為 shell 內建本身,type
可以額外檢查 shell 的內部實體(以及PATH
),因此您可以透過以下方式發現差異:
type -a time
這裡:
$ type -a time
time is a shell keyword
time is /usr/bin/time
如果您只使用 則將執行第一個time
。您也可以僅使用type
(不帶)來獲取正在執行的命令-a
:
type time
告訴-a
我們type
在 shell 的內部實體中搜索,也在PATH
ie 中搜尋所有可能的來源。
如果您因為某些原因需要外部的,請使用以下任一:
\time
"time"
'time'
command time
答案2
內建和外部實用程式之間的另一個區別是,Bash 的內建實用程式time
將計時完成管道或呼叫 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
...
雖然時間是指定的在標準中,它沒有指定它應該如何在管道中運行,因此像這樣更強大的內部實現是可能的。