J'essaie de chronométrer quelque chose en utilisant :
/usr/bin/time myCommand
Cependant, depuis /usr/bin/time
écrit dans stderr, si myCommand écrit également sur stderr, j'obtiendrai plus qu'une simple sortie de temps sur le flux. Ce que je veux faire, c'est rediriger toute la sortie de myCommand vers /dev/null
, mais continue d'écrire la sortie de l'heure dans stderr. En utilisant un exemple myCommand qui écrit dans stderr de ls /nofile
, nous voyons (évidemment) qu'il n'y a aucune sortie avec ce qui suit :
$ /usr/bin/time ls /nofile 2> /dev/null
$
Sans aucune redirection, nous voyons à la fois la sortie de ls
(vers stderr) et la sortie de l'heure (également vers 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
Ce que je veux, c'est quelque chose qui produit simplement :
$ /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
Des idées ?
Réponse acceptée :
En ksh, bash et zsh, time
est un mot-clé, pas une fonction intégrée. Les redirections sur la même ligne s'appliquent uniquement à la commande chronométrée, pas à la sortie de time
lui-même.
$ time ls -d / /nofile >/dev/null 2>/dev/null
real 0m0.003s
user 0m0.000s
sys 0m0.000s
Pour rediriger la sortie de time
lui-même dans ces shells, vous devez utiliser un niveau de regroupement supplémentaire.
{ time mycommand 2>&3; } 3>&2 2>mycommand.time
Si vous utilisez la version GNU du module autonome time
utilitaire, il a un -o
option pour écrire la sortie de time
ailleurs que stderr. Vous pouvez faire du time
écrire au terminal :
/usr/bin/time -o /dev/tty mycommand >/dev/null 2>/dev/null
Si vous souhaitez conserver la sortie de time
sur son erreur standard, vous avez besoin d'un niveau supplémentaire de mélange des descripteurs de fichiers.
/usr/bin/time -o /dev/fd/3 mycommand 3>&2 >/dev/null 2>/dev/null
Avec n'importe quel time
, vous pouvez invoquer un shell intermédiaire pour effectuer les redirections souhaitées. Invoquer un shell intermédiaire pour effectuer des actions supplémentaires telles que cd
, redirections, etc. est assez courant : c'est le genre de petites choses pour lesquelles les shells sont conçus.
/usr/bin/time sh -c 'exec mycommand >/dev/null 2>/dev/null'