Mengapa format waktu keluaran bervariasi tergantung pada bagaimana saya menyebutnya

14

Ini mungkin pertanyaan pemula, tapi saya tidak mengerti bagaimana ini dikonfigurasikan dan mengapa format output dari timeperintah berbeda dalam dua kasus ini:

jika digunakan via time, output adalah tiga baris dengan info dasar

$ time sleep 1

real    0m1.003s
user    0m0.000s
sys     0m0.000s

maka saya bisa memeriksa biner mana yang digunakan

$ which time
/usr/bin/time

dan panggil langsung untuk mendapatkan output dalam format yang sama sekali berbeda, dengan lebih banyak info

$ /usr/bin/time sleep 1
0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 2000maxresident)k
0inputs+0outputs (0major+77minor)pagefaults 0swaps

tidak ada alias yang terkait dengan time

$ alias | grep time
$ 

Saya sedang berlari Ubuntu 16.04.

xaxa
sumber
Itulah sebabnya whichpada dasarnya tidak berguna ...
Bakuriu

Jawaban:

23

Yang pertama adalah bashkata kunci bawaan sendiri time(dikompilasi dengan bash), dan yang kedua adalah executable eksternal time( /usr/bin/time, datang dengan timepaket).

Selain itu, whichtidak dapat menampilkan perintah atau kata kunci bawaan Shell karena hanya menelusuri PATH, Anda perlu menggunakannya type. Menjadi shell builtin itu sendiri, juga typedapat memeriksa entitas internal shell (dan juga PATH), sehingga Anda dapat melihat perbedaannya dengan:

type -a time

Sini:

$ type -a time
time is a shell keyword
time is /usr/bin/time

Yang pertama akan dieksekusi jika Anda hanya menggunakan time. Anda juga bisa mendapatkan yang sedang dieksekusi hanya dengan menggunakan type(tanpa -a):

type time

The -amemberitahu typeuntuk mencari di entitas internal yang shell dan juga di PATHyaitu mencari di semua kemungkinan sumber.

Jika karena alasan tertentu Anda memerlukan yang eksternal, gunakan salah satu dari:

\time
"time"
'time'
command time
heemayl
sumber
ah, begitu, jadi whichtidak mempertimbangkan builtin? Dan saya harus selalu memeriksa type -adulu. Sebenarnya, ini tampaknya typelebih unggul daripada whichkarena itu mengeluarkan lokasi /usr/bin/timejuga
xaxa
@xaxa Ya, periksa suntingan saya.
heemayl
terima kasih atas jawaban terinci! Apa whichgunanya untuk itu?
xaxa
1
@xaxa typememang lebih unggul --- jika Anda menggunakan bash. Cangkang lain mungkin tidak memiliki typebulitin, atau timebuiltin.
jpaugh
2
@ jpaugh Tidak benar. POSIX memungkinkan timeuntuk menjadi eksternal saja tetapi tidak type, typetersedia di semua shell yang sesuai dengan POSIX.
heemayl
4

Perbedaan lain antara utilitas builtin dan eksternal adalah, bahwa built-in Bash time akan mengatur waktu pipeline atau panggilan ke fungsi shell (tampaknya bahkan loop, tetapi manual tampaknya tidak menjanjikan itu). Eksternal timetidak bisa, karena berada di luar shell, tidak tahu tentang kode di sekitarnya.

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

Sementara waktu ditentukan dalam standar, itu tidak ditentukan bagaimana harus bertindak dalam pipa, sehingga implementasi internal yang lebih kuat seperti ini dimungkinkan.

ilkkachu
sumber