J'essaie de chronométrer quelque chose en utilisant:
/usr/bin/time myCommand
Cependant, depuis l' /usr/bin/time
écriture sur 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 toujours écrire la sortie du temps vers stderr. En utilisant un exemple myCommand qui écrit dans stderr de ls /nofile
, nous voyons (évidemment) qu'il n'y a pas de sortie du tout 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 temps (é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?
io-redirection
time-utility
David Doria
la source
la source
Réponses:
Dans ksh, bash et zsh,
time
est un mot-clé, pas un builtin. Les redirections sur la même ligne s'appliquent uniquement à la commande en cours de temporisation, pas à la sortie d'time
elle - même.Pour rediriger la sortie de
time
lui-même dans ces shells, vous devez utiliser un niveau supplémentaire de regroupement.Si vous utilisez la version GNU de l'
time
utilitaire autonome , il a une-o
option pour écrire la sortietime
ailleurs que stderr. Vous pouvez fairetime
écrire sur le terminal:Si vous souhaitez conserver la sortie de
time
son erreur standard, vous avez besoin d'un niveau supplémentaire de brassage des descripteurs de fichiers.Avec n'importe quel
time
utilitaire, 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 descd
redirections, etc. est assez courant - c'est le genre de petites choses que les shells sont conçues pour faire.la source
exec
remplace le shell par le programme spécifié au lieu d'exécuter ce programme en tant que sous-processus. Certains shells effectuent cette optimisation automatiquement lorsqu'une commande est la dernière d'un script. «Shell intermédiaire» signifie exactement cela: un shell qui est entretime
etmycommand
; il n'est pas lié aux sous-coquilles./dev/tty
est le terminal sur lequel la commande s'exécute (cela n'a aucun rapport avec/dev/ttyNUM
les consoles physiques; vous confondez avec les descripteurs de fichiers: stdin est/dev/fd/0
, etc.).la source
time
s'agit d'un alias bash?which time
s'affiche/usr/bin/time
dans CentOS 5.7.type time
vous montrera:time is a shell keyword