為什麼時間的輸出格式會根據我的呼叫方式而變化

為什麼時間的輸出格式會根據我的呼叫方式而變化

這可能是新手的問題,但我不明白這是如何配置的以及為什麼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/timetime套件一起提供)。

另外,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 的內部實體中搜索,也在PATHie 中搜尋所有可能的來源。

如果您因為某些原因需要外部的,請使用以下任一:

\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
...

雖然時間是指定的在標準中,它沒有指定它應該如何在管道中運行,因此像這樣更強大的內部實現是可能的。

相關內容