¿Por qué el comando `time` no funciona con ninguna opción?

61

Traté de usar el timecomando con -fopción para formatear la salida del tiempo, pero aparece el siguiente error:

-f: command not found

Luego trató de utilizar otras opciones -a, -oetc y me sale el mismo error. Ni siquiera time --versionno funciona ( --version: command not found).

No me digas que lea al hombre porque ya lo hago muchas veces ... Todas estas opciones se especifican allí. Entonces, ¿dónde podría estar el problema?

usuario258266
fuente
No sudo apt-get install --reinstall timeayudar?
jobin
99
O tal vez el caparazón interno timecon/usr/bin/time
Rmano

Respuestas:

91

Bueno, incluso si no te gusta, te pondré a leer de nuevo con más atención man time. Al final de la EXAMPLESsección encontrarás:

  Users of the bash shell need to use an explicit path in order to run
  the external time command and not the shell builtin variant.  On system
  where time is installed in /usr/bin, the first example would become
       /usr/bin/time wc /etc/hosts

Por lo tanto, supongo que usa bash shell que usa una versión interna de time, proporcionada como una palabra clave de shell. Puede verificar esto usando el siguiente comando:

type time

y la salida probablemente será:

time is a shell keyword

Si este es el caso, entonces está claro, a utilizar el verdadero time mandato, debe utilizar su ruta explícita: /usr/bin/time.

Además, si no desea usar más la palabra clave de shell time, puede crear un alias permanente de la siguiente manera:

alias time='/usr/bin/time'

Esto sobrescribirá la palabra clave de shell timeporque el comando:

type time

dará el siguiente resultado ahora:

time is aliased to `/usr/bin/time'
Radu Rădeanu
fuente
55
para los comandos de shell construidos: {info time} y {type time}. Para los comandos binarios: {which time} y {man time}
Michael Martinez
@Michael info timetrata sobre el binario. help timeSe trata de la construcción.
wjandrea
sí, lo siento, estaba pensando "ayuda", pero salió "información"
Michael Martinez
21

Como, como explican las otras respuestas, timees una palabra clave de shell, la única opción disponible es -p:

terdon@oregano ~ $ help time
time: time [-p] pipeline
    Report time consumed by pipeline's execution.

Execute PIPELINE and print a summary of the real time, user CPU time,
and system CPU time spent executing PIPELINE when it terminates.

Options:
  -p    print the timing summary in the portable Posix format

Entonces, necesitas ejecutar el timeque está adentro /usr/bin. Aquí hay algunas maneras de hacerlo:

  • Utilice el timeejecutable en su lugar:

    /usr/bin/time -f %Uuser ls >/dev/null
  • Use lo \que hace que su shell ignore los alias y las palabras clave y, en su lugar, busque $PATHun ejecutable que coincida:

    \time -f %Uuser ls >/dev/null 
  • Use el commandincorporado que tiene un efecto similar:

    command time -f %Uuser ls >/dev/null
  • Use un shell diferente, uno que no tenga esa palabra clave. Por ejemplo sh(que en realidad está dashen Ubuntu):

    sh -c "time -f %Uuser ls >/dev/null"
  • Use which, que buscará en su $PATH(OK, este es tonto):

    $(which time) -f %Uuser ls >/dev/null
terdon
fuente
¿Hay alguna manera de hacer lo contrario: replicar incorporado timecon regular /usr/bin/time? Es decir, traducir script bash en guión.
Dan M.
@DanM. No entiendo. Si quieres el incorporado time, corre time. Si desea el ejecutable independiente, ejecute /usr/bin/time.
terdon
no hay una función incorporada en timeel shell predeterminado de Ubuntu, que yo sepa. Quiero traducir la secuencia de comandos usando integrado en independiente con el mismo comportamiento.
Dan M.
@DanM. entonces solo úsalo time. Llamará a la que esté disponible. Ese será el incorporado para bash y el independiente para dash. Si lo usa /usr/bin/time, siempre llamará al independiente, tanto en bash como en dash. Pero parece que probablemente debería estar haciendo una nueva pregunta, explicando el comportamiento que necesita. Avísame si lo haces e intentaré ayudarte.
terdon
Sí, pero incorporado y autónomo tienen una sintaxis / semántica drásticamente diferente. Gracias de todos modos. Haré una nueva pregunta si no descubro cómo tratarlo yo mismo.
Dan M.
17

Los proyectiles bashy zshtienen su timecomando interno . Tienes que usar

/usr/bin/time -f ...

Por cierto, descubrí que usando (desde zsh):

~% which  time
time: shell reserved word
Rmano
fuente