Sto cercando di cronometrare qualcosa usando:
/usr/bin/time myCommand
Tuttavia, poiché /usr/bin/time
scrive su stderr, se myCommand scrive anche a stderr, otterrò più di un semplice output di tempo sullo stream. Quello che voglio fare è reindirizzare tutto l'output di myCommand a /dev/null
, ma continua a scrivere l'output del tempo su stderr. Utilizzando un esempio myCommand che scrive su stderr di ls /nofile
, vediamo che (ovviamente) non c'è alcun output con quanto segue:
$ /usr/bin/time ls /nofile 2> /dev/null
$
Senza alcun reindirizzamento, vediamo sia l'output di ls
(a stderr) e l'output da tempo (anche a 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
Quello che voglio è qualcosa che produca semplicemente:
$ /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
Qualche idea?
Risposta accettata:
In ksh, bash e zsh, time
è una parola chiave, non un built-in. I reindirizzamenti sulla stessa riga si applicano solo al comando in fase di temporizzazione, non all'output di time
stesso.
$ time ls -d / /nofile >/dev/null 2>/dev/null
real 0m0.003s
user 0m0.000s
sys 0m0.000s
Per reindirizzare l'output da time
stesso in queste shell, è necessario utilizzare un livello aggiuntivo di raggruppamento.
{ time mycommand 2>&3; } 3>&2 2>mycommand.time
Se usi la versione GNU dello standalone time
utilità, ha un -o
opzione per scrivere l'output di time
altrove che stderr. Puoi creare time
scrivi al terminale:
/usr/bin/time -o /dev/tty mycommand >/dev/null 2>/dev/null
Se vuoi mantenere l'output da time
sul suo errore standard, è necessario un livello aggiuntivo di shuffle del descrittore di file.
/usr/bin/time -o /dev/fd/3 mycommand 3>&2 >/dev/null 2>/dev/null
Con qualsiasi time
utilità, è possibile invocare una shell intermedia per eseguire i reindirizzamenti desiderati. Invocare una shell intermedia per eseguire azioni extra come cd
, reindirizzamenti e così via è piuttosto comune: è il tipo di piccole cose per cui sono progettate le shell.
/usr/bin/time sh -c 'exec mycommand >/dev/null 2>/dev/null'