Perché il formato di output del tempo varia a seconda di come lo chiamo io


14

Potrebbe essere una domanda da principiante, ma non capisco come sia configurato e perché il formato di output del timecomando sia diverso in questi due casi:

se utilizzato tramite time, l'output è di tre righe con informazioni di base

$ time sleep 1

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

quindi posso verificare quale binario viene utilizzato

$ which time
/usr/bin/time

e chiamalo direttamente per ottenere l'output in un formato completamente diverso, con molte più informazioni

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

non ci sono alias correlati time

$ alias | grep time
$ 

Sto correndo Ubuntu 16.04.


Ecco perché whichè praticamente inutile ...
Bakuriu,

Risposte:


23

La prima è la bashparola chiave incorporata time(compilata con bash) e la seconda è l'eseguibile esterno time( /usr/bin/time, viene fornito con il timepacchetto).

Inoltre, whichnon è possibile mostrare i comandi o le parole chiave incorporati della shell mentre cerca PATH, è necessario utilizzarli type. Essendo una shell incorporata, typepuoi anche verificare le entità interne della shell (e anche PATH), in modo da poter individuare la differenza:

type -a time

Qui:

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

Il primo verrà eseguito se lo usi time. Puoi anche ottenere quello che viene eseguito semplicemente usando type(senza -a):

type time

La -adice typedi cercare in entità interne di shell ed anche in PATHvale a dire la ricerca in tutte le fonti possibili.

Se per qualche motivo hai bisogno di quello esterno, usa uno di:

\time
"time"
'time'
command time

ah, capisco, quindi whichnon considera i builtin? E dovrei sempre verificare type -aprima. In realtà, sembra typeè superiore a whichquanto emette posizione /usr/bin/timecosì
xaxa

@xaxa Sì, controlla le mie modifiche.
heemayl

grazie per una risposta dettagliata! A cosa whichserve allora?
Xaxa,

1
@xaxa typeè davvero superiore --- se stai usando bash. Un'altra shell potrebbe non avere né il typebulitin, né il timebuiltin.
jpaugh

2
@jpaugh Non proprio. POSIX permette timedi essere solo, ma non esterna type, typeè disponibile in tutte le shell compatibili POSIX.
heemayl

4

Un'altra differenza tra i programmi di utilità incorporati e quelli esterni è che il programma di Bash time eseguirà il cronometraggio di pipeline complete o chiamate a funzioni di shell (apparentemente anche cicli, ma il manuale non sembra prometterlo). L'esterno timenon può, dal momento che si trova all'esterno della shell, non è a conoscenza del codice circostante.

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

Mentre il tempo è specificato nello standard, non è specificato come dovrebbe agire in una pipeline, quindi è possibile un'implementazione interna più potente come questa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.