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

61

J'ai essayé d'utiliser la timecommande avec -foption pour formater la sortie de temps, mais j'obtiens l'erreur suivante:

-f: command not found

J'ai ensuite essayé d'utiliser d' autres options -a, -oetc et je reçois la même erreur. Pas même time --versionne 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?

utilisateur258266
la source
Est-ce que ça sudo apt-get install --reinstall timeaide?
jobin
9
Ou peut-être la coque interne timeavec/usr/bin/time
Rmano

Réponses:

91

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 EXAMPLESsection, 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 le shell bash qui utilise une version interne de time, fournie en tant que mot clé shell. 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, alors il est clair, d'utiliser la vraie time commande, vous devez utiliser le chemin d' accès explicite: /usr/bin/time.

De plus, si vous ne souhaitez plus utiliser le mot clé shell time, vous pouvez créer un alias permanent comme suit:

alias time='/usr/bin/time'

Cela écrasera le mot clé shell timecar la commande:

type time

donnera maintenant la sortie suivante:

time is aliased to `/usr/bin/time'
Radu Rădeanu
la source
5
pour les commandes construites dans le shell: {info time} et {type time}. Pour les commandes binaires: {quelle heure} et {man time}
Michael Martinez
@ Michael info timeest sur le binaire. help timeest sur le Builtin.
wjandrea
oui, désolé je pensais "aide" mais est sorti "info"
Michael Martinez
21

Comme, comme l'expliquent les autres réponses, timeest un mot clé shell, la seule option à votre disposition est la suivante -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

Donc, vous devez exécuter le timequi est dans /usr/bin. Voici quelques façons de le faire:

  • Utilisez l' timeexécutable à la place:

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

    \time -f %Uuser ls >/dev/null 
  • Utilisez la commande commandintégrée qui a un effet similaire:

    command time -f %Uuser ls >/dev/null
  • Utilisez un shell différent, sans mot-clé. Par exemple sh(qui est actuellement dashsur Ubuntu):

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

    $(which time) -f %Uuser ls >/dev/null
terdon
la source
Y at-il un moyen de faire le contraire - répliquer intégré timeavec régulière /usr/bin/time? C'est-à-dire traduire le script bash en tiret.
Dan M.
@DanM. Je ne comprends pas. Si vous voulez la fonction intégrée time, lancez time. Si vous voulez l'exécutable autonome, lancez /usr/bin/time.
terdon
Pour timeautant que je sache, le shell par défaut d’Ubuntu n’est pas intégré . Je veux traduire le script en utilisant intégré en autonome avec le même comportement.
Dan M.
@DanM. alors juste utiliser time. Il appellera celui qui est disponible. Ce sera le construit pour bash et le standalone pour dash. Si vous utilisez /usr/bin/time, alors il appellera toujours le standalone, à la fois en bash et en tiret. Mais il semble que vous devriez probablement poser une nouvelle question, expliquant le comportement dont vous avez besoin. Faites-moi savoir si vous le faites et je vais essayer d'aider.
terdon
Ouais, mais intégré et autonome ont une syntaxe / sémantique radicalement différente. En tout cas, merci. Je poserai une nouvelle question si je ne vois pas comment régler le problème moi-même.
Dan M.
17

Les coquillages bashet zshont leur timecommande interne . Vous devez utiliser

/usr/bin/time -f ...

BTW, j'ai découvert que l'utilisation (de zsh):

~% which  time
time: shell reserved word
Rmano
la source