Snažím se něco načasovat pomocí:
/usr/bin/time myCommand
Nicméně, protože /usr/bin/time
zapíše do stderr, pokud myCommand také píše do stderr, dostanu více než jen výstup času ve streamu. Co chci udělat, je přesměrovat veškerý výstup myCommand na /dev/null
, ale přesto zapište výstup času do stderr. Pomocí příkladu myCommand který zapisuje do stderr z ls /nofile
, vidíme, že (samozřejmě) neexistuje žádný výstup s následujícím:
$ /usr/bin/time ls /nofile 2> /dev/null
$
Bez jakéhokoli přesměrování vidíme oba výstup z ls
(do stderr) a výstup z času (také do 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
Chci něco, co jednoduše produkuje:
$ /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
Nějaké nápady?
Přijatá odpověď:
V ksh, bash a zsh, time
je klíčové slovo, nikoli vestavěné. Přesměrování na stejném řádku platí pouze pro časovaný příkaz, nikoli pro výstup time
sám.
$ time ls -d / /nofile >/dev/null 2>/dev/null
real 0m0.003s
user 0m0.000s
sys 0m0.000s
Přesměrování výstupu z time
sám v těchto shellech, musíte použít další úroveň seskupování.
{ time mycommand 2>&3; } 3>&2 2>mycommand.time
Pokud používáte GNU verzi samostatného time
nástroj, má -o
možnost zapsat výstup time
jinde než stderr. Můžete si udělat time
napište do terminálu:
/usr/bin/time -o /dev/tty mycommand >/dev/null 2>/dev/null
Pokud chcete zachovat výstup z time
při standardní chybě potřebujete další úroveň promíchání deskriptoru souboru.
/usr/bin/time -o /dev/fd/3 mycommand 3>&2 >/dev/null 2>/dev/null
S jakýmkoli time
můžete vyvolat mezilehlý shell k provedení požadovaných přesměrování. Vyvolání mezilehlého shellu k provedení zvláštních akcí, jako je cd
, přesměrování atd. je docela běžné – je to druh maličkostí, ke kterým jsou shelly navrženy.
/usr/bin/time sh -c 'exec mycommand >/dev/null 2>/dev/null'