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'