¿Por qué el formato de salida del tiempo varía dependiendo de cómo lo llame?

14

Puede ser una pregunta para novatos, pero no entiendo cómo está configurado y por qué el formato de salida del timecomando es diferente en estos dos casos:

si se usa vía time, la salida es de tres filas con información básica

$ time sleep 1

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

entonces puedo ver qué binario se usa

$ which time
/usr/bin/time

y llamarlo directamente para obtener resultados en un formato completamente diferente, con mucha más información

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

no hay alias relacionados con time

$ alias | grep time
$ 

Estoy corriendo Ubuntu 16.04.

xaxa
fuente
Por eso whiches básicamente inútil ...
Bakuriu

Respuestas:

23

La primera es la bashpropia palabra clave incorporada time(compilada con bash), y la segunda es el ejecutable externo time( /usr/bin/timeviene con el timepaquete).

Además, whichno puede mostrar los comandos incorporados del shell o las palabras clave, ya que solo busca PATH, debe usar typepara eso. Al ser un constructor de shell en sí mismo, también typepuede verificar las entidades internas de shell (y también PATH), para que pueda detectar la diferencia al:

type -a time

Aquí:

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

El primero se ejecutará si solo lo usa time. También puede obtener cuál se está ejecutando simplemente usando type(sin -a):

type time

Le -adice typeque busque en las entidades internas de la shell y también, PATHes decir, busque en todas las fuentes posibles.

Si por alguna razón necesita el externo, use cualquiera de:

\time
"time"
'time'
command time
heemayl
fuente
Ah, ya veo, ¿entonces whichno considera las incorporaciones? Y siempre debería consultar type -aprimero. En realidad, parece que typees superior a la whichya que da salida a la ubicación /usr/bin/time, así
xaxa
@xaxa Sí, revisa mis ediciones.
heemayl
gracias por una respuesta detallada! ¿Para qué whichsirve entonces?
xaxa
1
@xaxa typees de hecho superior --- si estás usando bash. Es posible que otro caparazón no tenga ni la typebulitina ni la acumulación time.
jpaugh
2
@jpaugh No del todo bien. POSIX permite timeser externo solamente, pero no type, typeestá disponible en todas las conchas compatibles con POSIX.
heemayl
4

Otra diferencia entre las utilidades incorporadas y las externas es que la time construcción integrada de Bash cronometrará canalizaciones completas o llamadas a funciones de shell (aparentemente incluso bucles, pero el manual no parece prometer eso). Lo externo timeno puede, ya que está fuera del shell, no sabe sobre el código circundante.

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

Si bien el tiempo se especifica en el estándar, no se especifica cómo debe actuar en una tubería, por lo que es posible una implementación interna más potente como esta.

ilkkachu
fuente