Pourquoi le format de sortie de l'heure varie selon la façon dont je l'appelle

14

C'est peut-être une question pour les débutants, mais je ne comprends pas comment cela est configuré et pourquoi le format de sortie de la timecommande est différent dans ces deux cas:

si utilisé via time, la sortie est de trois lignes avec des informations de base

$ time sleep 1

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

alors je peux vérifier quel binaire est utilisé

$ which time
/usr/bin/time

et appelez-le directement pour obtenir une sortie dans un format complètement différent, avec beaucoup plus d'informations

$ /usr/bin/time sleep 1
0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 2000maxresident)k
0inputs+0outputs (0major+77minor)pagefaults 0swaps

il n'y a pas d'alias liés à time

$ alias | grep time
$ 

Je cours Ubuntu 16.04.

xaxa
la source
C'est pourquoi which est fondamentalement inutile ...
Bakuriu

Réponses:

23

Le premier est le bashpropre mot clé intégré time(compilé avec bash), et le second est l'exécutable externe time( /usr/bin/time, fourni avec le timepackage).

En outre, whichne peut pas afficher les commandes ou les mots clés intégrés du shell lors de la recherche PATH, vous devez utiliser typepour cela. Être un shell intégré lui-même, typepeut en outre vérifier les entités internes du shell (et aussi PATH), vous pouvez donc repérer la différence en:

type -a time

Ici:

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

Le premier sera exécuté si vous utilisez simplement time. Vous pouvez également obtenir ce qui est exécuté en utilisant simplement type(sans -a):

type time

Le -adit typede rechercher dans les entités internes du shell et aussi dans PATHie recherche dans toutes les sources possibles.

Si pour une raison quelconque vous avez besoin de l'externe, utilisez l'un des éléments suivants:

\time
"time"
'time'
command time
heemayl
la source
ah, je vois, whichne considère donc pas les builtins? Et je devrais toujours vérifier avec d' type -aabord. En fait, il semble typesupérieur à whichcar il /usr/bin/time
génère
@xaxa Oui, vérifiez mes modifications.
heemayl
merci pour une réponse détaillée! À quoi sert whichalors?
xaxa
1
@xaxa typeest en effet supérieur --- si vous utilisez bash. Un autre obus peut ne pas avoir de typebulitine ni de fonction timeintégrée.
jpaugh
2
@jpaugh Pas tout à fait raison. POSIX permet timed'être externe uniquement mais non type, typeest disponible dans tous les shells compatibles POSIX.
heemayl
4

Une autre différence entre l'utilitaire intégré et les utilitaires externes est que le programme intégré de Bash chronométrera time les pipelines complets ou les appels aux fonctions shell (apparemment même des boucles, mais le manuel ne semble pas le promettre). L'extérieur timene peut pas, car étant en dehors du shell, ne connaît pas le code environnant.

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
...

Bien que le temps soit spécifié dans la norme, il n'est pas spécifié comment il doit agir dans un pipeline, donc une implémentation interne plus puissante comme celle-ci est possible.

ilkkachu
la source