Perché il comando `time` non funziona con nessuna opzione?


61

Ho provato a usare il timecomando con l' -fopzione per formattare l'output di tempo, ma ottengo il seguente errore:

-f: command not found

Poi ho cercato di utilizzare altre opzioni -a, -oecc e ottengo lo stesso errore. Nemmeno time --versionnon funziona ( --version: command not found).

Non dirmi di leggere l'uomo perché lo faccio già da molte volte ... Tutte queste opzioni sono specificate lì. Quindi, dove potrebbe essere il problema?


Does sudo apt-get install --reinstall timeaiutare?
Jobin

9
O forse la shell interna timecon/usr/bin/time
Rmano

Risposte:


91

Bene, anche se non ti piace, ti farò leggere di nuovo con più attenzione man time. Alla fine della EXAMPLESsezione troverai:

  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

Quindi, presumo che tu usi la shell bash che usa una versione interna di time, fornita come parola chiave shell. Puoi verificarlo usando il seguente comando:

type time

e l'output sarà probabilmente:

time is a shell keyword

Se questo è il caso, allora è chiaro, di utilizzare il vero e proprio time comando, è necessario usare il suo percorso esplicito: /usr/bin/time.

Inoltre, se non si desidera più utilizzare la parola chiave shell time, è possibile creare un alias permanente come segue:

alias time='/usr/bin/time'

Questo sovrascriverà la parola chiave della shell timeperché il comando:

type time

darà ora il seguente output:

time is aliased to `/usr/bin/time'

5
per i comandi integrati della shell: {info time} e {type time}. Per i comandi binari: {che ora} e {man time}
Michael Martinez,

@Michael info timeparla del binario. help timeriguarda l'integrato.
wjandrea,

sì, mi dispiace stavo pensando "aiuto" ma è venuto fuori "info"
Michael Martinez

21

Poiché, come spiegano le altre risposte, timeè una parola chiave shell, l'unica opzione disponibile è -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

Quindi, devi eseguire il timecomando /usr/bin. Ecco alcuni modi per farlo:

  • Utilizzare timeinvece l' eseguibile:

    /usr/bin/time -f %Uuser ls >/dev/null
  • Utilizzare ciò \che fa sì che la shell ignori gli alias e le parole chiave e cerchi invece $PATHun eseguibile corrispondente:

    \time -f %Uuser ls >/dev/null 
  • Usa il commandbuilt-in che ha un effetto simile:

    command time -f %Uuser ls >/dev/null
  • Utilizzare una shell diversa, quella che non ha tale parola chiave. Ad esempio sh(che in realtà è dashsu Ubuntu):

    sh -c "time -f %Uuser ls >/dev/null"
  • Usa which, che cercherà tra $PATH(OK, questo è sciocco):

    $(which time) -f %Uuser ls >/dev/null

C'è un modo per fare il contrario: replicare integrato timecon normale /usr/bin/time? Vale a dire tradurre bash script in trattino.
Dan M.,

@DanM. Non capisco. Se vuoi l'integrato time, esegui time. Se si desidera l'eseguibile autonomo, eseguire /usr/bin/time.
terdon

timeper quanto ne so, non è integrato nella shell predefinita di Ubuntu. Voglio tradurre lo script usando incorporato in standalone con lo stesso comportamento.
Dan M.,

@DanM. quindi basta usare time. Chiamerà quello che è disponibile. Quello sarà il builtin per bash e il standalone per dash. Se lo usi /usr/bin/time, chiamerà sempre il standalone, sia in bash che in dash. Ma sembra che dovresti probabilmente fare una nuova domanda, spiegando il comportamento di cui hai bisogno. Fammi sapere se lo fai e proverò ad aiutarti.
terdon

sì, ma built-in e standalone hanno sintassi / semantica drasticamente diverse. Comunque grazie. Farò una nuova domanda se non riuscirò a capire come gestirlo da solo.
Dan M. il

17

Le shell bashe zshhanno il loro timecomando interno . Devi usare

/usr/bin/time -f ...

A proposito, ho scoperto che usando (da zsh):

~% which  time
time: shell reserved word
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.