¿Por qué el formato de salida de la hora varía según cómo lo llamo?

¿Por qué el formato de salida de la hora varía según cómo lo llamo?

Puede que sea una pregunta de novato, pero no entiendo cómo se configura esto y por qué el formato de salida del timecomando es diferente en estos dos casos:

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

$ time sleep 1

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

entonces puedo comprobar qué binario se utiliza

$ which time
/usr/bin/time

y llámelo 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 contime

$ alias | grep time
$ 

Estoy corriendo Ubuntu 16.04.

Respuesta1

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

Además, whichno se pueden mostrar los comandos o palabras clave integrados del shell, ya que solo busca PATH, debe usarlos typepara eso. Al ser un shell incorporado en sí mismo, typetambién puede verificar las entidades internas del shell (y también PATH), para que pueda detectar la diferencia de la siguiente manera:

type -a time

Aquí:

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

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

type time

Le -aindica typeque busque en las entidades internas de Shell y también, PATHes decir, que busque en todas las fuentes posibles.

Si por alguna razón necesitas el externo, usa cualquiera de:

\time
"time"
'time'
command time

Respuesta2

Otra diferencia entre las utilidades integradas y externas es que las utilidades integradas de Bashtime ¿El tiempo completará las tuberías?o llamadas a funciones de Shell (aparentemente incluso bucles, pero el manual no parece prometer eso). El externo timeno puede, ya que al estar fuera del shell, no conoce 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
...

mientras el tiempo esespecificadoen 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 poderosa como esta.

información relacionada