Warum variiert das Ausgabeformat der Zeit abhängig davon, wie ich es aufrufe

14

Es ist vielleicht die Frage eines Neulings, aber ich verstehe nicht, wie dies konfiguriert ist und warum das Ausgabeformat des timeBefehls in diesen beiden Fällen unterschiedlich ist:

Bei Verwendung über timebesteht die Ausgabe aus drei Zeilen mit Basisinformationen

$ time sleep 1

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

dann kann ich herausfinden welche binärdatei verwendet wird

$ which time
/usr/bin/time

und rufen Sie es direkt auf, um eine Ausgabe in einem völlig anderen Format mit viel mehr Informationen zu erhalten

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

Es gibt keine Aliase im Zusammenhang mit time

$ alias | grep time
$ 

Ich renne Ubuntu 16.04.

xaxa
quelle
Welches ist, warum whichist im Grunde nutzlos ...
Bakuriu

Antworten:

23

Das erste ist das basheigene integrierte Schlüsselwort time(kompiliert mit bash), und das zweite ist die externe ausführbare Datei time( /usr/bin/timewird mit dem timePaket geliefert ).

Sie whichkönnen die integrierten Befehle oder Schlüsselwörter der Shell auch nicht anzeigen, da sie nur durchsucht werden PATH. Verwenden Sie hierfür type. Da es sich um eine selbst erstellte Shell handelt, typekann zusätzlich nach internen Entitäten der Shell gesucht werden (und auch PATH), sodass Sie den Unterschied erkennen können, indem Sie:

type -a time

Hier:

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

Der erste wird ausgeführt, wenn Sie nur verwenden time. Sie können auch ermitteln, was gerade ausgeführt wird, indem Sie type(ohne -a) verwenden:

type time

Der -aBefehl typezum Suchen in den internen Entitäten der Shell und PATHzB in allen möglichen Quellen.

Wenn Sie aus irgendeinem Grund die externe benötigen, verwenden Sie eine der folgenden Möglichkeiten:

\time
"time"
'time'
command time
heemayl
quelle
ah, ich whichverstehe, berücksichtigt so nicht builtins? Und ich sollte immer zuerst nachsehen type -a. Eigentlich, so scheint es typeüberlegen ist , whichweil es gibt Standort /usr/bin/timeals auch
xaxa
@xaxa Ja, überprüfe meine Änderungen.
Heemayl
danke für eine ausführliche antwort! Was ist dann whichsinnvoll?
Xaxa
1
@xaxa typeist in der Tat überlegen --- wenn Sie Bash verwenden. Eine andere Schale hat möglicherweise weder das typeBulitin noch das timeBuiltin.
Jpaugh
2
@jpaugh Nicht ganz richtig. POSIX timedarf nur extern sein type, typeist jedoch nicht in allen POSIX-kompatiblen Shells verfügbar.
Heemayl
4

Ein weiterer Unterschied zwischen dem eingebauten und dem externen Dienstprogramm besteht darin, dass das eingebaute Bash-Programm time Pipelines oder Aufrufe von Shell-Funktionen zeitlich abschließt (anscheinend sogar Schleifen, aber das Handbuch scheint das nicht zu versprechen). Das Externe timekann nicht, da es sich außerhalb der Shell befindet, nichts über den umgebenden Code wissen.

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

Während der Zeit spezifiziert in der Norm, ist es nicht spezifiziert links , wie es in einer Pipeline handeln sollte, so eine leistungsfähigere interne Implementierung wie dies möglich ist.

ilkkachu
quelle