web-dev-qa-db-fra.com

Pourquoi la commande `time` ne fonctionne-t-elle avec aucune option?

J'ai essayé d'utiliser la commande time avec l'option -f pour formater la sortie du temps, mais j'obtiens le message d'erreur suivant:

-f: command not found

Ensuite, j'ai essayé d'utiliser d'autres options -a, -o, etc. et j'obtiens la même erreur. Pas même time --version ne fonctionne pas (--version: command not found).

Ne me dites pas de lire l'homme parce que je le fais déjà plusieurs fois ... Toutes ces options y sont spécifiées. Alors, où pourrait être le problème?

58
user258266

Eh bien, même si vous n'aimez pas cela, je vous le ferai relire avec plus d'attention man time. À la fin de la section EXAMPLESname__, vous trouverez:

  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

Donc, je suppose que vous utilisez bash Shell, qui utilise une version interne de Shell, nommée timename__. Vous pouvez vérifier cela en utilisant la commande suivante:

type time

et le résultat sera probablement:

time is a Shell keyword

Si tel est le cas, il est alors clair que pour utiliser la commande réelle timename__, vous devez utiliser son chemin explicite: /usr/bin/time.

De plus, si vous ne souhaitez plus utiliser le shell intégré timename__, vous pouvez créer un alias permanent comme suit:

alias time='/usr/bin/time'

Cela va écraser le shell intégré dans timecar la commande:

type time

donnera maintenant la sortie suivante:

time is aliased to `/usr/bin/time'
88
Radu Rădeanu

Comme, comme l'expliquent les autres réponses, timeest un mot clé Shell, la seule option disponible est -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

Vous devez donc exécuter le timequi se trouve dans /usr/bin. Voici quelques façons de le faire:

  • Utilisez l'exécutable timeà la place:

    /usr/bin/time -f %Uuser ls >/dev/null
    
  • Utilisez \ pour que votre shell ignore les alias, les identifiants intégrés et les mots-clés, et recherche à la place votre $PATH pour un exécutable correspondant:

    \time -f %Uuser ls >/dev/null 
    
  • Utilisez le commandconstruit qui fait la même chose que ci-dessus

    command time -f %Uuser ls >/dev/null
    
  • Utilisez un autre shell, celui qui n'a pas ce mot clé. Par exemple sh(qui est en fait dashsur Ubuntu)

    sh -c "time -f %Uuser ls >/dev/null"
    
  • Utilisez whichname__, qui effectuera une recherche dans votre $PATH (OK, celui-ci est idiot)

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

Les shell bashet zshont leur commande interne timename__. Vous devez utiliser

/usr/bin/time -f ...

D'ailleurs, j'ai découvert que (à partir de zshname__):

~% which  time
time: Shell reserved Word
16
Rmano