Ich versuche, etwas zeitlich zu bestimmen, indem ich:
/usr/bin/time myCommand
Da jedoch /usr/bin/time
in stderr geschrieben wird und myCommand auch in stderr schreibt, wird mehr als nur die Zeit im Stream ausgegeben. Was ich tun möchte, ist, die gesamte Ausgabe von myCommand an umzuleiten /dev/null
, aber trotzdem die Ausgabe der Zeit an stderr zu schreiben. Anhand eines Beispiels myCommand , das in stderr von schreibt ls /nofile
, sehen wir, dass (offensichtlich) überhaupt keine Ausgabe mit folgendem Ergebnis erfolgt :
$ /usr/bin/time ls /nofile 2> /dev/null
$
Ohne Umleitung sehen wir sowohl die Ausgabe von ls
(nach stderr) als auch die Ausgabe von time (auch nach stderr):
$ /usr/bin/time ls /nofile
ls: cannot access /nofile: No such file or directory
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 3776maxresident)k
0inputs+0outputs (0major+278minor)pagefaults 0swaps
Was ich will, ist etwas, das einfach produziert:
$ /usr/bin/time ls /nofile > RedirectThatImAskingFor
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 3776maxresident)k
0inputs+0outputs (0major+278minor)pagefaults 0swaps
Irgendwelche Ideen?
io-redirection
time-utility
David Doria
quelle
quelle
Antworten:
In ksh ist bash und zsh
time
ein Schlüsselwort, kein eingebautes. Umleitungen in derselben Zeile gelten nur für den zeitgesteuerten Befehl, nicht für die Ausgabe von sichtime
selbst.Um die Ausgabe von sich
time
selbst in diesen Shells umzuleiten , müssen Sie eine zusätzliche Gruppierungsebene verwenden.Wenn Sie die GNU-Version des eigenständigen
time
Dienstprogramms verwenden, können Sie-o
die Ausgabe an einertime
anderen Stelle als stderr schreiben . Sie könnentime
in das Terminal schreiben:Wenn Sie die Ausgabe
time
auf ihren Standardfehler beschränken möchten , benötigen Sie eine zusätzliche Ebene für das Mischen von Dateideskriptoren.Mit jedem
time
Dienstprogramm können Sie eine Zwischenshell aufrufen, um die gewünschten Umleitungen auszuführen. Das Aufrufen einer Zwischen-Shell, um zusätzliche Aktionen wiecd
Umleitungen usw. auszuführen , ist ziemlich häufig - es sind die kleinen Dinge, für die Shells entwickelt wurden.quelle
exec
ersetzt die Shell durch das angegebene Programm, anstatt dieses Programm als Unterprozess auszuführen . Einige Shells führen diese Optimierung automatisch durch, wenn ein Befehl der letzte in einem Skript ist. "Intermediate Shell" bedeutet genau das: eine Shell, die zwischentime
und liegtmycommand
; es hat nichts mit Unterschalen zu tun./dev/tty
ist das Terminal, auf dem der Befehl ausgeführt wird (es hat nichts mit/dev/ttyNUM
physischen Konsolen zu tun; Sie verwechseln die Dateideskriptoren: stdin is/dev/fd/0
usw.).quelle
time
es sich um einen Bash-Alias handelt?which time
wird/usr/bin/time
in CentOS 5.7 angezeigt .type time
wird Ihnen zeigen:time is a shell keyword